CSIC_716_20191205【TCP-解决粘包问题、UDP模板】

------------------------------------------------------------------------------------------------------------------------------------

客户端代码模板:(以ssh为例)
# _*_ coding: gbk _*_
# @Author: Wonder import socket
import json
import struct client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('172.16.10.19', 9527)) while True:
try:
cmd = input('>>>请输入指令').strip()
if not cmd:
continue
if cmd == 'q':
break
cmd = cmd.encode('utf-8')
dict_context = {
'data_size': len(cmd) # 二进制的长度
}
client_bytes = json.dumps(dict_context).encode('utf-8') # dict----->json------->binary 报头
head = struct.pack('i', len(client_bytes)) # struct 将报头长度巧妙的转为4 bit # 以下为一波socket三连发送操作。
client.send(head) # 发报头长度, client.send(client_bytes) # 发报头,里面有实际数据的长度 client.send(cmd) # 传数据 bin_head = client.recv(4) # 接收来自server的报头信息
json_head_len = struct.unpack('i', bin_head)[0] # unpack 获取报文头长度
head_json = client.recv(json_head_len).decode() # 解码 获得 json格式的 报头字典
dic_head = json.loads(head_json) # 反序列化,得到 data的长度所在的字典
size = dic_head.get('data_size') # 取到data的真实长度值
length = 0
bin_toatal = b'' while length < size:
bin_content = client.recv(500)
bin_toatal += bin_content
length += len(bin_content) # 此处要累加bin_content的长度
print('当前下载进度',size , length , length / size)
print('当前下载进度---------------->', length / size) print(bin_toatal.decode('gbk'))
except Exception as e:
print(e)
break client.close()
服务端模板:
# _*_ coding: gbk _*_
# @Author: Wonder
import socket
import subprocess
import json
import struct server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('172.16.10.180', 9527))
server.listen(3)
while True:
conn, addr = server.accept()
while True:
try: bin_head = conn.recv(4) # 获取4位长度的报文头
json_head = struct.unpack('i', bin_head)[0] # 获得报头长度--->int bin_head = conn.recv(json_head).decode('utf-8') # 获取报头信息 ------>binary----->JSON
dic_head = json.loads(bin_head) # 反序列化得到字典
size = dic_head.get('data_size') # 字典取值得到数据长度 length = 0
bin_toatal = b''
while length < size: # if 循环接收,直到长度和报头中的长度一致
bin_content = conn.recv(50)
bin_toatal += bin_content
length += len(bin_toatal) cmd = bin_toatal.decode('utf-8') subprocess_obj = subprocess.Popen(cmd, shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout = subprocess_obj.stdout.read() # binary
stderr = subprocess_obj.stderr.read() back_data_len = len(stderr) + len(stdout)
print(back_data_len) server_dict = {
'data_size': back_data_len # 务必代表二进制的长度
}
back_json = json.dumps(server_dict).encode('utf-8') # 序列化成 json字典 ------->json----->binary
server_head = struct.pack('i', len(back_json)) # 转成4位长度的二进制, 表示报头长度
conn.send(server_head) # 发报头长度
conn.send(back_json) # 发报头
conn.send(stdout) # 发数据
conn.send(stderr) except Exception as e:
print(e)
break
conn.close()
server.close()
UDP的初级使用
UDP服务端(即时通讯,你一句我一句)
# _*_ coding: gbk _*_
# @Author: Wonder
import socket # 指定是 数据报,type= 一定要写,不然报错
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.bind(
('127.0.0.1', 9527)
) while True:
data, addr = sk.recvfrom(1024)
print(data.decode('utf-8'))
sk.sendto('永不在线'.encode('UTF-8'), addr)
客户端要绑定, 接收是recvfrom ,接收的是data和addr ,发送是sendto,发送的是data和目标addr
UDP客户端
# _*_ coding: gbk _*_
# @Author: Wonder
import socket sk = socket.socket(type=socket.SOCK_DGRAM)
addr = ('127.0.0.1', 9527)
while True:
msg = input('>>>输入内容')
if msg == 'q':
break
sk.sendto(msg.encode('utf-8'), addr)
data, back = sk.recvfrom(1024)
print(data.decode('utf-8'))
CSIC_716_20191205【TCP-解决粘包问题、UDP模板】的更多相关文章
- tcp粘包,udp丢包
TCP是面向流的, 流, 要说明就像河水一样, 只要有水, 就会一直流向低处, 不会间断. TCP为了提高传输效率, 发送数据的时候, 并不是直接发送数据到网路, 而是先暂存到系统缓冲, 超过时间或者 ...
- TCP通信粘包问题分析和解决
转载至https://www.cnblogs.com/kex1n/p/6502002.html 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发 ...
- TCP粘包, UDP丢包, nagle算法
一.TCP粘包 1. 什么时候考虑粘包 如果利用tcp每次发送数据,就与对方建立连接,然后双方发送完一段数据后,就关闭连接,这样就不会出现粘包问题(因为只有一种包结构,类似于http协议,UDP不会出 ...
- TCP通信粘包问题分析和解决(全)(转)
TCP通信粘包问题分析和解决(全) 在socket网络程序中,TCP和UDP分别是面向连接和非面向连接的.因此TCP的socket编程,收发两端(客户端和服务器端)都要有成对的socket,因此,发送 ...
- tcp粘包、解决粘包问题
目录 subproess模块 TCP粘包问题 粘包两种情况 解决粘包问题 struct模块的使用 使用struct模块解决粘包 优化解决粘包问题 上传大文件 服务端 客户端 UDP协议 upd套接字 ...
- 8-2udp和tcp网络编程以及粘包和解决粘包的方法
一 tcp网络编程 server 端 import socket sk=socket.socket() #实例化一个对象 sk.setsockopt(socket.SOL_SOCKET,socket ...
- tcp的粘包和拆包示例以及使用LengthFieldFrameDecoder来解决的方法
粘包和拆包是什么? TCP协议是一种字节流协议,没有记录边界,我们在接收消息的时候,不能人为接收到的数据包就是一个整包消息 当客户端向服务器端发送多个消息数据的时候,TCP协议可能将多个消息数据合并成 ...
- day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信
day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...
- TCP粘包问题的解决方案02——利用readline函数解决粘包问题
主要内容: 1.read,write 与 recv,send函数. recv函数只能用于套接口IO ssize_t recv(int sockfd,void * buff,size_t len,i ...
- 《精通并发与Netty》学习笔记(14 - 解决TCP粘包拆包(二)Netty自定义协议解决粘包拆包)
一.Netty粘包和拆包解决方案 Netty提供了多个解码器,可以进行分包的操作,分别是: * LineBasedFrameDecoder (换行) LineBasedFrameDecoder是回 ...
随机推荐
- tooltip(提示框)组件
一.class加载方式 <span id="pos" class="easyui-tooltip" title="这是提示内容"> ...
- java格式化时间 String 转Date Date转String
---恢复内容开始--- 时间格式化 Date类型转换成String: Date date = new Date();SimpleDateFormat sdf = new SimpleDateForm ...
- python制作坦克对战
创建子弹类 import pygame class Bullet(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__i ...
- webpack引入全局jQuery
1.使用命令行npm install jquery来安装jQuery 2.在webpack.config.js文件里配置: plugins:[ new webpack.ProvidePlugin({ ...
- 富文本 保存转义StringEscapeUtils.unescapeHtml4(
StringEscapeUtils.unescapeHtml4( [org.apache.commons.lang.StringEscapeUtils.escapeHtml(str)] [String ...
- bzoj1050题解
[解题思路] 先把边按边权排序,然后O(m)暴力枚举最小边,对于每条最小边,将比其大的边按序加入直到起终点连通,此时最大边权/最小边权即为选择该最小边情况下的最小比值.复杂度O(m(m+n)α(n)) ...
- 埃氏筛+线段树——cf731F
从2e5-1依次枚举每个数作为主显卡,然后分段求比它大的数的个数,这里的复杂度是调和级数ln2e5,即埃氏筛的复杂度.. #include<bits/stdc++.h> using nam ...
- Thymeleaf 模板布局三种区别
- hihoCoder [Offer收割]编程练习赛3 D子矩阵求和
子矩阵求和 http://hihocoder.com/discuss/question/3005 声明一下: n是和x一起的,m是和y一起的 x是横着的,y是纵着的,x往右为正,y往下为正 (非常反常 ...
- tp U函数 logs
注意 U 函数 项目今天已经搞定了本以为可以上线了没问题了,但是 当我把tp调试模式关闭后: define('APP_DEBUG',false); 页面完全加载不出来,于是开启: 'SHO ...