首页 > 编程语言 > 详细

Python网络编程之黏包问题

时间:2019-02-24 11:00:10      阅读:160      评论:0      收藏:0      [点我收藏+]

 

二、解决黏包问题

2.1 解决黏包方法1

  • 计算消息实体的大小
  • 服务端接受两次,一次时消息大小,二次是消息实体,解决消息实体黏包
  • 客户端发送两次,一次是消息大小,一次是消息实体
  • 在两次收发之间加入一次多余通信,以防止消息大小和消息实体黏包

 

server端

import  socket

sk = socket.socket()

sk.bind((127.0.0.1,9000))
sk.listen()

conn,addr = sk.accept()
print(conn,addr)
while True:
    cmd = input(请输入你的命令: )
    if cmd == q:
        break

    conn.send(cmd.encode(gbk))
    data_length = conn.recv(1024).decode(gbk)
    conn.send(bok)  # 接受到消息大小后马上send,这样可以隔开两次recv,并且第二次接受指定长度的消息
    data = conn.recv(int(data_length)).decode(gbk)
    print(data)

conn.close()
sk.close()

 

client

import  socket
import subprocess
sk = socket.socket()

sk.connect((127.0.0.1,9000))

while True:
    cmd = sk.recv(1024).decode(gbk)
    ret = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    std_out = ret.stdout.read()
    std_err = ret.stderr.read()

    data_length = str(len(std_out)+len(std_err)).encode(gbk)
    sk.send(data_length)
    sk.recv(1024)  # send消息大小后马上转入recv,隔开两次send。
    sk.send(std_out)
    sk.send(std_err)

sk.close()

 

Python网络编程之黏包问题

原文:https://www.cnblogs.com/wc89/p/10425496.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!