• python网络编程-socket发送大数据包问题


    一:什么是socket大数据包发送问题

      socket服务器端或者客户端在向对方发送的数据大于对方接受的缓存时,会出现第二次接受还接到上次命令发送的结果。这就出现象第一次接受结果不全,第二次接果出现第一次结果。

      比如send 1900 数据,recv 只接受1024。多于数据900放在缓存区里,第二次命令来的时候,调用send会先把900发回去,在把新数据放到缓存区,等到1024在系统会自动发送过去。

      发送数据,一是缓存区满,二是超时

     解决办法:

      在发送数据前,计算发送数据的大小,把大小发给对方。对方接受数据循环,只到接到数据和大小一样。

     

    二:示例代码

      

    服务器
    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    import socket
    import subprocess
    server=socket.socket()
    
    server.bind(("127.0.0.1",9999))
    server.listen(5)
    
    while True:
        conn,addr=server.accept()
        print("new conn:",addr)
    
        while True:
            print(addr)
            data=conn.recv(1024)
            print(len(data))
            print(data.decode())
            if not data:
                print("conn close ",addr)
                break
            print(data.decode())
            cmd_res=subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE)
            outread=cmd_res.stdout.read()
            print(outread.decode("gb2312"))
            conn.send(outread)
    客户端
    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    import socket
    
    client=socket.socket()
    client.connect(("127.0.0.1",9999))
    
    while True:
        cmd=input(">>:").strip()
        if len(cmd)==0:continue
        print(cmd)
        client.send(cmd.encode("utf-8"))
        print("res")
        res=client.recv(1024)
        print(res.decode("gb18030"))

    大数据发送结果乱问题现象截图:

      

      

      

    三:解决代码如下:

    服务器端
    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    import socket
    import subprocess
    server=socket.socket()
    
    server.bind(("127.0.0.1",9999))
    server.listen(5)
    
    while True:
        conn,addr=server.accept()
        print("new conn:",addr)
    
        while True:
            print(addr)
            data=conn.recv(1024)
            print(len(data))
            print(data.decode())
            if not data:
                print("conn close ",addr)
                break
            print(data.decode())
            cmd_res=subprocess.Popen(data.decode(),shell=True,stdout=subprocess.PIPE)
            outread=cmd_res.stdout.read()
            print(len(outread))
         conn.send(("%s" %len(outread)).encode("utf-8"))
    
         print(outread.decode("gb2312"))
            conn.send(outread)
    # -*- coding:utf-8 -*-
    __author__ = 'shisanjun'
    
    import socket
    
    client=socket.socket()
    client.connect(("127.0.0.1",9999))
    
    while True:
        cmd=input(">>:").strip()
        if len(cmd)==0:continue
        print(cmd)
        client.send(cmd.encode("utf-8"))
        print("res")
        res_size=client.recv(1024).decode("utf-8")
        size=0
        while size<int(res_size):
            res=client.recv(1024)
            print(res.decode("gb18030"))
            size+=len(res) #这里要用len(),因为最后一次长度不固定
  • 相关阅读:
    Oracle Scheduler Postponed job
    MySQL字符集问题
    LogMiner的一个案例
    Oracle Scheduler NLS_ENV
    ORA01555的模拟
    在线重定义 Oracle Redefinition
    MySQL Proxy 读写分离
    SQL判断分段的连续值
    基础复习之.net中new关键字的用法
    VB与C#相互转换
  • 原文地址:https://www.cnblogs.com/lixiang1013/p/7040390.html
Copyright © 2020-2023  润新知