socket通信(三):用UDP協(xié)議進(jìn)行Socket編程

? ? ? ?TCP是建立可靠連接,UDP是面向無(wú)連接的協(xié)議,因此使用UDP協(xié)議時(shí),不需要建立連接,只需要知道對(duì)方的IP地址和端口號(hào)就可以直接發(fā)送數(shù)據(jù)包,但是不一定能準(zhǔn)確到達(dá)。

和TCP類似,使用UDP的通信雙方也分為客戶端和服務(wù)器。

  1. 服務(wù)器;

? ?(1)創(chuàng)建scoket對(duì)象并綁定本機(jī)地址和端口:

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 綁定端口
s.bind(('127.0.0.1', 9999))

? ? ? ?創(chuàng)建Socket時(shí),SOCK_DGRAM指定了這個(gè)Socket的類型是UDP。

? ?(2)UDP不需要調(diào)用listen()方法,而是直接接收來(lái)自任何客戶端的數(shù)據(jù):

while True:
    # recvfrom()方法返回?cái)?shù)據(jù)和客戶端的地址與端口
    data, addr = s.recvfrom(1024)
    print('Received from %s:%s.' % addr)
    s.sendto(b'Hello, %s!' % data, addr)

? ? ? ?由于這個(gè)例子比較簡(jiǎn)單,因此這里省掉了多線程/多進(jìn)程處理。

  1. 客戶端;

? ? ? ?首先創(chuàng)建基于UDP的Socket,然后不需要調(diào)用connect(),直接通過(guò)sendto()給服務(wù)器發(fā)數(shù)據(jù),從服務(wù)器接收數(shù)據(jù)仍然調(diào)用recv()方法。

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
for data in [b'Michael', b'Tracy', b'Sarah']:
    # 發(fā)送數(shù)據(jù)
    s.sendto(data, ('127.0.0.1', 9999))
    # 接收數(shù)據(jù)
    print(s.recv(1024).decode('utf-8'))
s.close()
  1. 基于UDP協(xié)議的Socket通信的流程;


  2. 小結(jié)
    ? ? ? ?UDP的使用與TCP類似,但是不需要建立連接。此外,服務(wù)器綁定UDP端口和TCP端口互不沖突,也就是說(shuō),UDP的9999端口與TCP的9999端口可以各自綁定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容