? ? ? ?TCP是建立可靠連接,UDP是面向無(wú)連接的協(xié)議,因此使用UDP協(xié)議時(shí),不需要建立連接,只需要知道對(duì)方的IP地址和端口號(hào)就可以直接發(fā)送數(shù)據(jù)包,但是不一定能準(zhǔn)確到達(dá)。
和TCP類似,使用UDP的通信雙方也分為客戶端和服務(wù)器。
- 服務(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)程處理。
- 客戶端;
? ? ? ?首先創(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()
-
基于UDP協(xié)議的Socket通信的流程;
小結(jié)
? ? ? ?UDP的使用與TCP類似,但是不需要建立連接。此外,服務(wù)器綁定UDP端口和TCP端口互不沖突,也就是說(shuō),UDP的9999端口與TCP的9999端口可以各自綁定。
