参考:http://www.cnblogs.com/Eva-J/articles/8244551.html#_label5
1.黏包的表现(以客户端远程操作服务端命令为例)
注:只有在TCP协议通信的情况下,才会产生黏包问题
基于TCP协议实现的黏包
#!/usr/bin/env python # -*- coding: utf-8 -*- # tcp_server_cmd.py import socket import subprocess ip_port = ('127.0.0.1', 8080) #服务端地址及端口 BUFFERSIZE = 1024 #设置缓冲区大小 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #设置为通过TCP协议通信(默认) tcp_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR, 1)#用于socket关闭后,重用socket tcp_server_socket.bind(ip_port) #绑定ip和端口 tcp_server_socket.listen() #开始监听客户端连接 while True: conn, addr = tcp_server_socket.accept() #与客户端建立连接 print('客户端地址:', addr) while True: cmd = conn.recv(BUFFERSIZE).decode('utf-8') #接收客户端输入 print('cmd:', cmd) if len(cmd)<1 or cmd == 'quit': break res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) #执行客户端输入命令 #以下标准输出信息都只能读取一次 std_out = res.stdout.read() #获取输出到标准输出设备的成功信息 std_err = res.stderr.read() #获取输出到标准输出设备的错误信息 print("stdout:",std_out.decode('gbk')) print("stderr:",std_err.decode('gbk')) conn.send(std_out) conn.send(std_err) conn.close() #关闭连接 tcp_server_socket.close() #关闭socket