粘包問題
TCP協(xié)議在傳輸過程中會(huì)出現(xiàn)數(shù)據(jù)粘包問題
講一下TCP和UDP的區(qū)別,都是傳數(shù)據(jù)的協(xié)議,沒有好壞之說,只是不同的應(yīng)用需求可能會(huì)更好選擇哪一個(gè)協(xié)議
TCP:適合傳輸數(shù)量大 ,需要建立連接,會(huì)出現(xiàn)粘包問題,粘包問題可以解決,確定傳入的長度,接收同樣長度就可以保證一次性傳輸完
UDP: 適合傳輸數(shù)據(jù)量小,沒有粘包,不需要連接,一次性傳輸,下一次就是新的數(shù)據(jù),弊端就是數(shù)據(jù)丟失,不安全
QQ是用什么協(xié)議呢?按理應(yīng)該可以用UDP協(xié)議,但是實(shí)際用的是TCP協(xié)議,這是歷史遺留問題,可還記得我們輸入QQ一次性輸入的內(nèi)容字?jǐn)?shù)有限制嗎?就是規(guī)定了發(fā)送與接收的數(shù)據(jù)長度是一樣的.
形成粘包的原因
1.兩個(gè)數(shù)據(jù)非常小,然后間隔時(shí)間又短
2.數(shù)據(jù)太大,一次取不完,下一次還會(huì)取這個(gè)大數(shù)據(jù)
解決粘包問題
==在傳數(shù)據(jù)之前,傳一個(gè)數(shù)據(jù)的大小,數(shù)據(jù)的大小必須得定長==
# TCP 解決粘包問題 附帶處理了一下 import socket import struct import subprocess server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('127.0.0.1', 8000)) server.listen(5) print('start...') # 連接循環(huán) while True: conn, client_address = server.accept() print(client_address) # 通信循環(huán) while True: try: cmd = conn.recv(1024) print(cmd) pipeline = subprocess.Popen(cmd.decode('utf8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) stdout = pipeline.stdout.read() stderr = pipeline.stderr.read() count_len = len(stdout) + len(stderr) guding_bytes = struct.pack('i', count_len) conn.send(guding_bytes) # 4 conn.send(stderr + stdout) except ConnectionResetError: # 連接循環(huán)時(shí)出現(xiàn)的中斷 break conn.close()
網(wǎng)站題目:python粘包問題及socket套接字編程詳解-創(chuàng)新互聯(lián)
地址分享:http://aaarwkj.com/article14/gidde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、ChatGPT、定制網(wǎng)站、云服務(wù)器、電子商務(wù)、手機(jī)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容