粘包 阻塞與非阻塞 驗證客戶端的合法性

2022-08-28 01:57:10 字數 2189 閱讀 9410

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...