前言
提示:这是本书第二个实验关于UDP:
关于UDP对服务器进行ping操作计算时延和丢包率。
一、UDP客户编程
代码如下:
from socket import *
import time
serveName = "服务器ip地址或者是另外一台主机名或者ip地址"
servePort = 48000
clientSocket = socket(AF_INET, SOCK_DGRAM) # 创建UDP套接字
clientSocket.settimeout(5) # 设置套接字超时值为5秒
messageLen = 10 # 设置发送报文数
loseMessage = 0 # 丢包数
sumTime = 0 # 总时间
for i in range(messageLen):
now = time.time()
print("Ping %d %s" % (i, now))
message = ('Ping %d %s' % (i, now)).encode() #设置发送报文(0-9的数字共10个)
try:
clientSocket.sendto(message, (serveName, servePort)) # 将信息发送到服务器
modifiedMessage, serverAddress = clientSocket.recvfrom(2048) # 从服务器接收信息,同时也能得到服务器地址
TTL = time.time() - now # 计算往返时间
sumTime += TTL
print("the modifiedMessage is :%s"% modifiedMessage)
except Exception as e:#接受异常即为丢包时
notRecTime = time.time() - now
loseMessage = loseMessage + 1
sumTime = sumTime + notRecTime
print("not rec the %d message" % i)
print("\nThe End Report the avgRTT is %d:" % (sumTime/messageLen))
print("\nThe packet loss percent is %.2f%% and the packet loss number is:%d" % ((loseMessage/messageLen)*100, loseMessage))
clientSocket.close()
这里书中要求UDP超时值设置为1s,但是我在服务器编程上有一个返回的信息,如果超时值设置为1s,则会影响其他所有的ping报文,我很想把返回的modified打印出来看看,所以我这里设置了超时值为5,如果不想打印出服务器返回的值则可以把print(“the modifiedMessage is :%s”% modifiedMessage)这一行去掉(具体为第20行)。
二、UDP服务器编程
代码如下(示例):
import random
from socket import *
serverPort = 48000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind(('', serverPort))
print("This server is already")
while True:
rand = random.randint(0, 10)
message, clientAddress = serverSocket.recvfrom(2048)
if rand < 4:
continue
modifiedMessage = 'I accept your message: ' + message.decode()
serverSocket.sendto(modifiedMessage.encode(), clientAddress)
具体UDP服务端的解释在我之前的文章中已经有提到过啦:https://blog.csdn.net/DanLimx/article/details/124985853
三、结果显示
总结
UDP连接按理来说不用先运行服务器端的程序,但是在我尝试过后,会出错,可能是因为设置了try,所有的都跑到异常那里去了,虽然只是一个小的很浅显的实验,但是深入理解UDP已经足够了,这里来回产生的时延非常小,也可能因为我是一台电脑运行的两个程序,如果想要看明显一点的,可以尝试把服务器端的编码放到自己的服务器上运行,本地再使用客户端的程序运行。