python基础学习日志day8-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(),因为最后一次长度不固定
时间: 2024-10-10 13:45:23

python基础学习日志day8-socket发送大数据包问题的相关文章

python基础学习日志day5-各模块文章导航

python基础学习日志day5---模块使用 http://www.cnblogs.com/lixiang1013/p/6832475.html python基础学习日志day5---time和datetime模块 http://www.cnblogs.com/lixiang1013/p/6848245.html python基础学习日志day5---random模块http://www.cnblogs.com/lixiang1013/p/6849162.html python基础学习日志da

python基础学习日志day10-

原文http://www.cnblogs.com/alex3714/articles/5876749.html 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的.所以先限定一下本文的上下文. 本文讨论的背景是Linux环境下的network IO. 一 概念说明 在进行解释之前,首先要说明几个概念:- 用户空间和内核空间- 进程切换- 进程的阻塞- 文件描述符- 缓存 I/O 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对

python基础学习日志day8-socket

一:什么是socket socket通常也称为作为"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"给网络发送请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的

Python基础学习笔记(九)常用数据类型转换函数

参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-variable-types.html 3. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000 常用数据类型转换函数: 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x

python基础学习日志day5---logging模块

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug(), info(), warning(), error() and critical() 5个级别,下面我们看一下怎么用. 最简单用法 1 2 3 4 5 6 7 8 import logging logging.warning("user [alex] attempt

python基础学习日志day8-SocketServer

摘要: SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer,UnixStreamServer,UnixDatagramServer.这4个类是同步进行处理的,另外通过ForkingMixIn和ThreadingMixIn类来支持异步. 创建服务器的步骤.首先,你必须创建一个请求处理类,它是BaseRequestHandler的子类并重载其handle()方法.其次,你必须实例化一个服务器类,传入服务器的地址和请求处理程序类.最后,调用handle_

python基础学习日志day5--hashlib模块

hashlib模块用于加密操作,代替了md5和sha模块, 主要提供SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. # -*- coding:utf-8 -*- __author__ = 'shisanjun' import hashlib m=hashlib.md5() #使用MD5算法 m.update(b"hello") #必须加b,申明为byte m.update(b"It is me") print(m.dige

python基础学习日志day8-socket上传文件

ftp server 1) 读取文件名 2)检查文件是否存在 3)打开文件 4)检查文件大小 5)发送文件大小给客户端 6)等客户端确认 7)开始边读边发数据 下载文件客户端 # -*- coding:utf-8 -*- __author__ = 'shisanjun' import socket import json import os host=("127.0.0.1",9000) client=socket.socket() client.connect(host) while

python基础学习日志day10-Select\Poll\Epoll异步IO

首先列一下,sellect.poll.epoll三者的区别 select select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作. select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一. select的一个缺点在于单个进程能够监视的文件描述符的数量存在