特色:多線程
udp 不會管客戶端或者服務端是否收到,它只管發,因此不可靠.socket
能夠發空(數據報協議,自帶頭)tcp
客戶端和服務端能夠又一方沒在線(由於不須要創建鏈接)線程
而且因爲不須要創建鏈接因此會發生丟包,致使數據不全。code
server端server
import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1',8008)) #udp是不須要創建鏈接的,能夠直接發送 #udp不須要進行監聽 #剩下的部分和tcp是同樣的 data,addr= server.recvfrom(1024) #data 是指傳送過來的數據的部分,第二個參數addr是客戶地址 print(data,addr) #發送數據的時候,必定要加上地址 server.sendto(data.upper(),addr)
client端對象
import socket client = socket.socket(type=socket.SOCK_DGRAM) #直接發送就行 client.sendto(b'chen',('127.0.0.1',8008)) data,addr = client.recvfrom(1024) print(data,addr)
import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1',8008)) while True: data,addr = server.recvfrom(1024) print(data) server.sendto(data.upper(),addr)
2.client繼承
import socket client = socket.socket(type=socket.SOCK_DGRAM) while True: msg = input('>>:') client.sendto(msg.encode('utf-8'),('127.0.0.1',8008)) data = client.recvfrom(1024) print(data)
udp協議沒有粘包問題(udp協議又叫數據報協議),能夠發空,tcp不行utf-8
server
#udp協議沒有粘包問題(udp協議又叫數據報協議),能夠發空,tcp不行 import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1',8003)) # while True: # data,addr = server.recvfrom(1024) # print(data) # server.sendto(data.upper(),addr) data,addr = server.recvfrom(1024) print(data) data,addr = server.recvfrom(1024) print(data) data,addr = server.recvfrom(1024) print(data) data,addr = server.recvfrom(1024) print(data)
client
import socket client = socket.socket(type=socket.SOCK_DGRAM) client.sendto('chen'.encode('utf8'),('127.0.0.1',8003)) client.sendto('hello'.encode('utf8'),('127.0.0.1',8003)) client.sendto('world'.encode('utf8'),('127.0.0.1',8003)) client.sendto(''.encode('utf8'),('127.0.0.1',8003))
支持多線程,在udp中又多線程的狀況下會結束上一個線程
server
#使用socketserver寫服務端 #導入模塊 import socketserver #本身定義一個類,必須繼承BaseRequestHandler class MyTcp(socketserver.BaseRequestHandler): #必須重寫handle方法 def handle(self): print(self) #數據 print(self.request[0]) print(self.request[1]) print(type(self.request[1])) self.request[1].sendto('xxxx'.encode('utf-8'),self.client_address) if __name__ == '__main__': #實例化獲得一個tcp鏈接的對象,Threading意思是說,只要來了請求, # 它自動的開線程來處理鏈接跟交互數據 #第一個參數是綁定的地址,第二個參數傳一個類 server=socketserver.ThreadingUDPServer(('127.0.0.1',8008),MyTcp) #一直在監聽 server.serve_forever()
client1
import socket client = socket.socket(type=socket.SOCK_DGRAM) client.sendto('chen'.encode('utf8'),('127.0.0.1',8009)) data = client.recvfrom(1024) print(data)
client2
import socket client = socket.socket(type=socket.SOCK_DGRAM) client.sendto('chen'.encode('utf8'),('127.0.0.1',8009)) data = client.recvfrom(1024) print(data)