86-python- 黏包问题

 

# tcp 会黏包
# 内部做了优化算法,让程序的发送数据没有边界

# udp 永远不会黏包


# 为什么会出现黏包问题:
# 首先只有在 TCP 协议中才会由黏包现象,
# 是因为 TCP 协议是面向流的协议
# 在发送数据传输的过程中还有缓存机制来避免数据丢失
# 因此,在连续发送小数据的时候,以及接收大小不符的时候都容易出现黏包
# 本质是因为:我们在接收数据的时候不知道发送的数据的大小
# 根本原因:
# 连续发送(优化算法)
# 发送的数据大小,大于接收的数据大小

# 解决黏包问题:
# 1.在传输大量数据之前先告诉接收端要发送的数据大小
# 2. 用 struct 模块制定协议,可以更好的解决问题

# struct 模块
# pack / unpack
# 模式:'i'
# pack之后的长度:4个字节
# unpack之后拿到的数据:一个元组,元组的第一个元素才是 pack 的值

 

 

server

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8080))
sk.listen()

conn,addr = sk.accept()
while True:
    cmd = input(">>>")
    if cmd == 'q':
        conn.send(b'q')
        break
    conn.send(cmd.encode('gbk'))
    ret = conn.recv(1024).decode('gbk')
    print(ret)

conn.close()
sk.close()

 

 

client

import socket
import subprocess
sk = socket.socket()
sk.connect(('127.0.0.1',8080))

while True:
    cmd = sk.recv(1024).decode('gbk')
    if cmd == 'q':
        break
    res = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,
                     stderr=subprocess.PIPE)
    sk.send(res.stdout.read())
    sk.send(res.stderr.read())

sk.close()

 

  

 

posted @ 2018-11-06 20:35  _Q  阅读(94)  评论(0)    收藏  举报