使用python採用udp協議編寫乙個ping程式,傳送乙個簡單的ping報文給伺服器,並確定從客戶傳送ping報文伺服器到接受到pong報文為止的時延,稱為往返時延(rtt) 。
因為udp是乙個不可靠的協議,客戶傳送的分組可能會丟失,為此,客戶不能無限期地等待伺服器的響應,等待時間至多為1s,否則,列印一條錯誤資訊。
import random
from socket import *
#af_inet指定使用ipv4協議,如果要用更先進的ipv6,就指定為af_inet6
#sock_dgram指定了這個socket的型別是udp
serversocket = socket(af_inet, sock_dgram)
#用0.0.0.0繫結到所有的網路位址,還可以用127.0.0.1繫結到本機位址
serversocket.bind(('127.0.0.1',12000))
while true:
#產生乙個0到10之間的隨機數
rand = random.randint(0, 10)
#從套介面上讀取資料,引數為緩衝區大小
message, address = serversocket.recvfrom(1024)
#通過列印我們可以看到udp客戶端socket的埠是不確定,系統隨機分配的
print("收到來自 %s 的報文: (%s)" % (address,message))
# 把接收到的資訊全部轉為大寫
print("隨機數是: %d" % rand)
message = message.upper()
#如果隨機數小於4,服務端無應答,客戶端就會超時
if rand < 4:
continue
serversocket.sendto(message, address)
import time
from socket import *
servername = '127.0.0.1' # 主機
serverport = 12000
# 建立socket時,af_inet指定使用ipv4協議,如果要用更先進的ipv6,就指定為af_inet6
# sock_dgram指定了這個socket的型別是udp
# sock_stream指定使用面向流的tcp協議
clientsocket = socket(af_inet, sock_dgram)
clientsocket.settimeout(1) # 設定超時時間為1s
for i in range(0, 10):
oldtime = time.time()
sendtime = time.strftime('%y-%m-%d %h:%m:%s', time.localtime(oldtime))
# encode()把str轉成bytes,傳輸格式要求
message = ('package %d,client_local_time:%s' % (i + 1, sendtime)).encode()
try:
# 傳送資料
clientsocket.sendto(message, (servername, serverport))
# 1024指定要接收的最大資料量為1kb = 1024 bytes
# recvfrom是乙個系統呼叫,由使用者態轉向系統態,從套介面上接收資料,並捕獲資料傳送源的位址。
# 如果資料報大於緩衝區,那麼緩衝區中只有資料報的前面部分,其他的資料都丟失了,並且recvfrom()函式返回wsaemsgsize錯誤
# 如果沒有資料待讀,那麼除非是非阻塞模式,不然的話套介面將一直等待資料的到來,果沒有在timeout = 1s內接收到資料,此時將返回socket_error錯誤,錯誤**是wsaewouldblock。用select()或wsaasynselect()可以獲知何時資料到達
# udp的 recvfrom() 和 tcp 的recv()不一樣,具體可以看 tcp ping專案
modifiedmessage, serveraddress = clientsocket.recvfrom(1024)
# 計算往返時間
rtt = time.time() - oldtime
# decode 把bytes轉成str
modifiedmessage = modifiedmessage.decode("utf-8")
print('報文 %d 收到來自 %s 的應答: %s,往返時延(rtt) = %fs' % (i+1, servername,modifiedmessage, rtt))
except exception as e:
print('報文 %d: 的請求超時' % (i+1)) # 處理異常
socket程式設計
一直以為serversocket accept之後客戶端才能發資訊,實驗後得出如下結論 1 serversocket沒有accept時,client是可以傳送資訊到server端的。2 serversocket accept之後,正在處理訊息時,client也是可以傳送資訊到server端。如果se...
Socket程式設計
對tcp ip udp socket程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission cont...
socket程式設計
建立socket 建立乙個 socket,它可用於在基於 tcp ip 的網路 如 internet 上通訊。socket s new socket addressfamily.internetwork,sockettype.stream,protocoltype.tcp 若要使用 udp 而不是 ...