tcp協議傳輸資料存在粘包現象,udp協議不存在粘包協議。
1.1.1 什麼是粘包現象
1.1.2 解決粘包問題
b.再傳送報文
2.自定義協議2
專門用來做檔案傳送的協議
三次握手的過程在**中是由accept和connect共同完成的,具體的細節再socket中沒有體現出來
2.四次揮手
2.1 io模型
io模型種類:
2.2 socket的非阻塞io模型
server端同時與多個client客戶端之間的聊天:
# server.py
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',9000))
sk.setblocking(false) # 非阻塞,setblocking()的引數為false時,表示非阻塞,如果引數不寫,預設為true。
sk.listen()
conn_l =
del_l =
while true:
try:
conn,addr = sk.accept() # 阻塞,直到有乙個客戶端來連我
print(conn)
except blockingioerror:
for c in conn_l:
try:
msg = c.recv(1024).decode('utf-8')
if not msg:
continue
print('-->',[msg])
c.send(msg.upper().encode('utf-8'))
except blockingioerror:pass
for c in del_l:
conn_l.remove(c)
del_l.clear()
sk.close()
# client.py
import time
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
for i in range(30):
sk.send(b'zhangsan')
msg = sk.recv(1024)
print(msg)
time.sleep(0.2)
sk.close()
2.3 socketserver模組
socketserver模組解決了socket的阻塞問題,直接實現tcp協議可併發的server端
# server.py
import socketserver
class myserver(socketserver.baserequesthandler):
def handle(self): # 自動觸發了handle方法,並且self.request == conn
msg = self.request.recv(1024).decode('utf-8')
self.request.send('1'.encode('utf-8'))
msg = self.request.recv(1024).decode('utf-8')
self.request.send('2'.encode('utf-8'))
msg = self.request.recv(1024).decode('utf-8')
self.request.send('3'.encode('utf-8'))
server = socketserver.threadingtcpserver(('127.0.0.1',9000),myserver)
server.serve_forever()
# client.py
import socket
import time
sk = socket.socket()
sk.connect(('127.0.0.1',9000))
for i in range(3):
sk.send(b'hello,yuan')
msg = sk.recv(1024)
print(msg)
time.sleep(1)
sk.close()
ART PI之UDP非阻塞客戶端
服務端控制客戶端的小電機 pwm 方式 客戶端 art pi,向服務端傳送天氣資訊和客戶端狀態,訊息格式s d v d n d l s 服務端 自製python服務端,埠繫結8887,傳送電機控制命令 60 61 62 63 64 hex 0x36 0x30.遇到的問題 雖然使用的是udp 連線,預...
tcp 回射伺服器 客戶端非阻塞方式的實現
檔名 nonblock select.cpp 作用 使用select加上非阻塞的socket的伺服器端。tcpcli01.c include include include include include include include include include include include...
UDP 阻塞模型下 伺服器和客戶端的建立過程
udp 阻塞模型下 伺服器和客戶端的建立過程 udp跟tcp的伺服器不一樣,不需要監聽和連線就可以開始通訊。伺服器建立步驟 1.建立udp 型別的 socket 2.bind 繫結本地位址 3.recvfrom sendto 跟客戶端通訊 客戶端建立步驟 1.建立udp 型別的 socket 2.r...