【计网】Socket 编程实验

原文档:
https://m653uatd6t.feishu.cn/docs/doccnBhfhSQ8wZ3krkTnQ3GbDHf#KJ735Z
参考文章:
https://zhuanlan.zhihu.com/p/387279376

服务器端代码:

import random
from socket import *
# 使用 AF_INET 套接字家族,SOCK_DGRAM 代表面向非连接(UDP)
serverSocket = socket(AF_INET, SOCK_DGRAM)

# 将 socket 绑定在本机 IP 的 10000 端口
serverSocket.bind(('127.0.0.1', 10000))

while True:
    # 生成一个 [1, 10] 的随机数,包含两端
    rand = random.randint(1, 10)
    # 将收到的 packet 中的数据存入 message,将地址存入 address(客户端地址)
    message, address = serverSocket.recvfrom(1024)
    # 下面是对收到的 message 进行处理
    # 将 bytes 类型的 message 转换为 string 类型
    message_str = message.decode('utf-8')
    # 在 30% 的概率下丢弃收到的 packet
    if rand < 4:
        continue
    # 对收到的 message 做简单处理
    ret = '{' + message_str + '}'
    # 做出响应(将处理后的数据通过sendto函数送回客户端),注意还要将 string 编码为 bytes 类型
    serverSocket.sendto(ret.encode(), address)

客户端代码

from socket import *
import time

# SOCK_DGRAM 表示使用UDP协议
client = socket(AF_INET, SOCK_DGRAM)
# 设置超时时间为1秒
client.settimeout(1)
# 服务端的ip和端口
server_address = ('152.136.19.235', 10000)
for i in range(10):
    # 发送ping命令
    client.sendto(b"2020212487", server_address)
    send_time = time.time()
    try:
        message, adr = client.recvfrom(1024)
        recv_time = time.time()  # 获取
        print(f"[{i}]\t{message.decode()}\tRTT: {(recv_time - send_time) * 1000:.2f}ms")
    except timeout as e:  # 超时就打印LOST
        print(f"[{i}]\tLOST")

赞赏