一.缓冲区

二.两种黏包现象

两种黏包现象:

1 连续的小包可能会被优化算法给组合到一起进行发送

黏包现象1客户端

 import socket
BUFSIZE = 1024
ip_prort = ('127.0.0.1',8001) s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) res = s.connect(ip_prort) s.send('hi'.encode('utf-8'))
s.send('meinv'.encode('utf-8'))

黏包现象1服务端

 from socket import *
ip_prot = ('127.0.0.1',8001) tcp_socket_server = socket(AF_INET,SOCK_STREAM) tcp_socket_server.bind(ip_prot) tcp_socket_server.listen(5) conn,addr = tcp_socket_server.accept() data1 = conn.recv(10)
data2 = conn.recv(10) print('->>>>>',data1.decode('utf-8'))
print('->>>>>',data2.decode('utf-8')) conn.close()

2 第一次如果发送的数据大小2000B接收端一次性接受大小为1024,这就导致剩下的内容会被下一次recv接收到,导致结果错乱

黏包现象2客户端

 import socket

 client = socket.socket()

 ip_prot ='127.0.0.1',8002

 client.connect(ip_prot)

 while 1:
cmd = input('请输入指令') client.send(cmd.encode('utf-8')) server_cmd_result = client.recv(1025) print(server_cmd_result.decode('GBK'))

黏包现象2服务端

 import socket
import subprocess server = socket.socket() ip_prot = '127.0.0.1', 8002 server.bind(ip_prot) server.listen() conn, addr = server.accept() while 1:
from_client_cmd = conn.recv(1024) print(from_client_cmd.decode('utf-8')) sub_obj = subprocess.Popen(
from_client_cmd.decode('utf-8'), # 传入的cmd命令
shell=True,
stdout=subprocess.PIPE, # 正确结果的存放位置
stderr=subprocess.PIPE # 错误结果的存放位置
) std_msg = sub_obj.stdout.read() # 获得管道里面拿到结果 print('指令的执行结果长度>>>>', len(std_msg)) conn.send(std_msg)

三.黏包解决方案

客户端

 import socket
import struct client = socket.socket()
ip_port = '127.0.0.1',8001 client.connect(ip_port) while 1:
cmd = input('请输入指令') # 发送指令 client.send(cmd.encode('utf-8')) server_res_len = client.recv(4) msg_len = struct.unpack('i',server_res_len)[0] print('来自服务器端的消息长度',msg_len) server_cmd_result = client.recv(msg_len) print(server_cmd_result.decode('GBK'))

服务端

 import socket
import subprocess
import struct server = socket.socket()
ip_port = '127.0.0.1',8001 server.bind(ip_port) server.listen() conn,addr = server.accept() while 1:
from_client_cmd = conn.recv(1024) print(from_client_cmd.decode('utf-8')) sub_obj = subprocess.Popen( from_client_cmd.decode('utf-8'),
shell = True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
) std_msg = sub_obj.stdout.read() std_msg_len = len(std_msg) print('指令的执行结果长度>>>>',std_msg_len) msg_lenint_struct = struct.pack('i',std_msg_len) conn.send(msg_lenint_struct + std_msg)

最新文章

  1. 如何用Dummy实例执行数据库的还原和恢复
  2. August 24th 2016 Week 35th Wednesday
  3. linux下使用SSL代理(SSLedge)
  4. 【leetcode❤python】Binary Watch
  5. BIP_开发案例02_BI Publisher中复杂案例实现代码(案例)
  6. glibc strlen delphi pascal
  7. #pragma weak
  8. 搭建VPN服务器之PPTP
  9. Sqlserver通过链接服务器访问Oracle
  10. windows2012R2虚拟机快速激活的方法
  11. Java中的编码格式
  12. 20个Linux命令及Linux终端的趣事
  13. Python标准库:内置函数dict(iterable, **kwarg)
  14. Chrome控制台 JS调试
  15. PC端网页的基本构成
  16. ORACLE分区表、分区索引详解
  17. 源码讲解 node+mongodb 建站攻略(一期)第二节
  18. WordPress版微信小程序3.1.5版的新功能
  19. 【微信小程序】模仿58同城页面制作以及动态数据加载
  20. 通过apicloud实现的混合开发App的Demo

热门文章

  1. 提交代码出现 Push to origin/master was rejected 错误解决方法
  2. java内部类和静态内部类
  3. python3没有了xrange
  4. meta标签中设置apple-itunes-app的意义
  5. 抓取B站小视频
  6. Struts Tiles框架使用(转)
  7. nginx 限制ip的请求频率
  8. 易语言连接RCON详细教程实例(演示连接Unturned服务器RCON)
  9. Ocelot(二)- 请求聚合
  10. Linux下安装ssdb