网络编程- 解决黏包现象方案二之struct模块(七)

server端

import jsonimport structimport socket

sk = socket.socket()sk.bind((‘127.0.0.1‘,8080))sk.listen()

conn,addr = sk.accept()dic_len = conn.recv(4)  # 4个字节 数字的大小dic_len = struct.unpack(‘i‘,dic_len)[0]content = conn.recv(dic_len).decode(‘utf-8‘)  # 70content_dic = json.loads(content)if content_dic[‘operate‘] == ‘upload‘:    with open(content_dic[‘filename‘],‘wb‘) as f:        while content_dic[‘filesize‘]:            file = conn.recv(1024)            f.write(file)            content_dic[‘filesize‘] -= len(file)conn.close()sk.close()

client端

import osimport jsonimport structimport socket

sk = socket.socket()sk.connect((‘127.0.0.1‘,8080))

def get_filename(file_path):    filename = os.path.basename(file_path)    return filename

#选择 操作operate = [‘upload‘,‘download‘]for num,opt in enumerate(operate,1):    print(num,opt)num = int(input(‘请输入您要做的操作序号 : ‘))if num == 1:    ‘‘‘上传操作‘‘‘    file_path = input(‘请输入要上传的文件路径 : ‘)    file_size = os.path.getsize(file_path)  # 获取文件大小    file_name = get_filename(file_path)    dic = {‘operate‘: ‘upload‘, ‘filename‘: file_name,‘filesize‘:file_size}    str_dic = json.dumps(dic).encode(‘utf-8‘)    ret = struct.pack(‘i‘, len(str_dic))  # 将字典的大小转换成一个定长(4)的bytes    sk.send(ret + str_dic)    with open(file_path,‘rb‘) as  f:        while file_size:            content = f.read(1024)            sk.send(content)            file_size -= len(content)elif num == 2:    ‘‘‘下载操作‘‘‘sk.close()

原文地址:https://www.cnblogs.com/mys6/p/10797863.html

时间: 2024-10-31 19:51:07

网络编程- 解决黏包现象方案二之struct模块(七)的相关文章

网络编程- 解决黏包现象方案一(六)

队列 利用队列的思路来解决黏包问题 总结 原文地址:https://www.cnblogs.com/mys6/p/10797907.html

网络编程之黏包

当我们同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种现象就是黏包. 黏包成因 TCP协议中的数据传递: tcp协议的拆包机制 当发送端缓冲区的长度大于网卡的MTU时,tcp会将这次发送的数据拆成几个数据包发送出去. MTU是Maximum Transmission Unit的缩写.意思是网络上传送的最大数据包.MTU的单位是字节. 大部分网络设备的MTU都是1500.如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会

《Python》网络编程之黏包

黏包 一.黏包现象 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. server端 import socket sk = socket.socket() sk.bind(('127.0.0.1', 9000)) sk.listen() conn, addr = sk.accept() conn.send(b'hello,') conn.send(b'world') conn.close() client端 import

四. 网络编程(TCP 黏包)

一 .黏包现象(TCP) 1.黏包成因 TCP协议中的数据传递 tcp协议的拆包机制 当发送端缓冲区的长度大于网卡的MTU时,tcp会将这次发送的数据拆成几个数据包发送出去. MTU是Maximum Transmission Unit的缩写.意思是网络上传送的最大数据包.MTU的单位是字节. 大部分网络设备的MTU都是1500.如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度 面向流的通信特点和Nagle算法 TCP(transpo

网络编程中黏包的解决方案

解决方案一 问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据. #_*_coding:utf-8_*_ import socket,subprocess ip_port=('127.0.0.1',8080) s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.setsockopt(socket.SOL_

网络编程-之------粘包现象

一.什么是粘包 须知:只有TCP有粘包现象,UDP永远不会粘包 粘包不一定会发生 如果发生了:1.可能是在客户端已经粘了 2.客户端没有粘,可能是在服务端粘了 首先需要掌握一个socket收发消息的原理 应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因.(因为TCP是流式协议,不知道啥时候开始,啥时候结束).而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提

网络编程基础粘包现象

粘包 tcp是流式传输,字节流,数据与数据之间是没有边界的 流式传输优点: 不限定长度 可靠传输 缺点: 慢 和一个人的通信连接conn会一直占用我们的通信资源 udp协议,面向数据包的传输 数据包优点 快 由于不需要建立连接,所以谁发的消息我都能接受到 缺点 不能传输过长的数据 不可靠 粘包现象 由于流式传输的特点,产生了数据连续发送的粘包现象. 在一个conn建立起来的连接上传输的多条数据是没有边界的 数据的发送和接收实际上不是在执行send/recv的时候就立刻被发送和接收,而是需要经过操

铁乐学Python_Day34_Socket模块2和黏包现象

铁乐学Python_Day34_Socket模块2和黏包现象 套接字 套接字是计算机网络数据结构,它体现了C/S结构中"通信端点"的概念. 在任何类型的通信开始之前,网络应用程序必須创建套接字. 可以将它们比作成电话插孔,没有它将无法进行通信. 套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信. 这就是所谓的进程间通信(Inter Process Communication, IPC). 有两种类型的套接字:基于文件的和面向网

黏包现象

让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd) res=subprocess.Popen(cmd.decode('utf-8'), shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) 的结果的编码是以当前所在的系统为准的,如果是windows,那么res.stdout.read()读出的就是GBK编码的,在接收端需要用GBK解码 且只能从管道里读一次结果 注意 同时执行多条命令之后