zoukankan      html  css  js  c++  java
  • Python中Socket粘包问题的解决

    服务器端

    import socket
    import subprocess
    import struct
    server = socket.socket()
    ip_port = ("192.168.15.33",8001)
    server.bind(ip_port)
    server.listen()
    conn,addr = server.accept()
    
    while 1:
        print("等待接收消息...")
        from_client_cmd = conn.recv(1024).decode("utf-8")#接收客户端消息
        print(from_client_cmd)
    
        sub_obj = subprocess.Popen(   #通过subprocess模块执行服务端指令,并拿到指令结果
            from_client_cmd,            #客户端指令
            shell = True,
            stdout = subprocess.PIPE,   #标准输出:正确指令的执行结果
            stderr = subprocess.PIPE,   #标准错误输出:错误指令的执行结果
        )
    
        server_cmd_msg = sub_obj.stdout.read()
        #server_cmd_msg = sub_obj.stderr.read() #接收到的返回信息是bytes类型,并且windoes系统的默认编码为gbk
        cmd_msg_len = len(server_cmd_msg) #计算你要发送的数据长度
        msg_len_stru = struct.pack("i",cmd_msg_len)#先对数据长度进行打包,打包成4个字节的数据,目的是为了和你将要发送的数据拼接在一起,就像我们自制一个消息头.
        conn.send(msg_len_stru)        #首先发送打包成功后的那4个字节的数据
        conn.sendall(server_cmd_msg)   #循环send数据,直到数据全部发送成功
    
    conn.close()
    server.close()
    

    客户器端

    import socket
    import struct
    client = socket.socket()
    server_ip_port = ("192.168.15.33",8001)
    client.connect(server_ip_port)
    
    while 1:
        msg = input("请输入要执行的命令>>>>>")
        client.send(msg.encode("utf-8"))
    
        from_server_msglen = client.recv(4)#先接受服务端要发送给我的数据长度,前四个字节,固定的
        unpack_len_msg = struct.unpack("i",from_server_msglen)[0]
    
        recv_msg_len = 0
        all_msg = b""
        while recv_msg_len < unpack_len_msg:
            every_recv_date = client.recv(1024)
            all_msg += every_recv_date  #将每次接收到的数据进行拼接和统计
            recv_msg_len += len(every_recv_date) #对每次接受到的数据进行累加
    
        print(all_msg.decode("gbk"))
    client.close()
  • 相关阅读:
    Linux系统管理05-----权限及归属管理
    Linux系统安装管理04----账号管理
    Linux系统管理03-----安装与管理程序
    Zabbix 监控主机
    Zabbix 页面优化
    基于 MHA 的MySQL高可用-CentOS7(理论)
    基于 MHA 的MySQL高可用-CentOS7(实例)
    部署Jumpserver环境
    GNS3连接本地服务器报错
    zabbix 安装部署
  • 原文地址:https://www.cnblogs.com/sdadx/p/9049730.html
Copyright © 2011-2022 走看看