参考: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
tcp-server-package

相关文章:

  • 2022-12-23
  • 2021-12-18
  • 2022-01-12
  • 2022-12-23
  • 2022-12-23
  • 2021-05-22
  • 2021-09-02
  • 2021-11-09
猜你喜欢
  • 2022-12-23
  • 2021-11-27
  • 2021-09-08
  • 2021-11-27
  • 2022-02-28
  • 2021-05-29
  • 2022-12-23
相关资源
相似解决方案