TCP 套叠字
一、 TCP 协议
# ------------TCP套叠字--------------------
server 端
import socket,time
ip_port=('localhost',51590)
bank_log=5
buffer_size=1024
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 重用ip和端口解决time——wait状态(address already in use)
tcp_server.bind(ip_port)
tcp_server.listen(bank_log)
print("waiting for connet...")
while True:
print("server working...")
conn,addr = tcp_server.accept()
print('server===>')
print("双向链接是",conn)
print("客户端地址",addr)
while True:
try:
data=conn.recv(buffer_size)
print("clent send message is :",data.decode("utf-8"))
time.sleep(2)
conn.sendall(data.upper())
except Exception :
print(Exception)
break
conn.close()
sk.close()
TCP 客户端
import socket,time
ip_port=('localhost',1234)
bank_log=5
buffer_size=1024
tcp_clent = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_clent.connect(ip_port)
while True:
msg = input("请输入字符串:>>>").strip()
if not msg:continue
tcp_clent.sendall(msg.encode("utf-8"))
data = tcp_clent.recv(buffer_size)
print("server send message is :",data.decode("utf8"))
tcp_clent.close()
二、UDP 协议
'''tcp协议实现客户端输入的命令执行、服务端返回命令执行的结果'''
客户端:
'''TCP 协议实现:客户端发送命令’并接收服务端发送过来的消息'''
from socket import *
ip_port=('localhost',51590)
bank_log=5
buffer_size=1024
tcp_clent = socket(AF_INET,SOCK_STREAM)
tcp_clent.connect(ip_port)
while True:
cmd = input("请输入字符串:>>>").strip()
if not cmd:continue
if cmd=="quit":break
tcp_clent.send(cmd.encode("utf-8"))
res_cmd = tcp_clent.recv(buffer_size)
print("命令执行的结果是:",res_cmd.decode("gbk")) # 默认打开文件的编码为unicode默认编码是“gbk”
tcp_clent.close()
服务端(解决粘包):
'''TCP 协议实现:客户端发送命令’服务端接收命令并把命令执行后的结果发送给客户端、
从缓存区取数据时取的少了就出现粘包、下次取的还是上次烦的内容'''
'''tcp协议实现客户端输入的命令执行、将结果放到管道中、在管道中读取返回带客户端''' import subprocess
from socket import *
ip_port = ("localhost", 51590)
buffer_size = 1024
back_log=5
tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.bind(ip_port)
tcp_server.listen(back_log)
while True:
print("waiting for connenct....")
conn,addr=tcp_server.accept()
print("双向链接是", conn)
print("客户端地址", addr)
while True:
try:
cmd = conn.recv(buffer_size)
if not cmd:break
print("收到客户端发送的消息是:",cmd)
res = subprocess.Popen(cmd.decode("utf-8"),shell=True,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
err=res.stderr.read()
if err:
cmd_res=err
else:
cmd_res=res.stdout.read()
if not cmd_res:
cmd_res="执行成功".encode("gbk")
conn.send(cmd_res)
except Exception:
print(Exception)
break
conn.close()
三、UDP 协议粘包现象
服务端:
'''UDP协议实现:客户端发送命令’服务端接收命令并把命令执行后的结果发送给客户端'''
import subprocess
from socket import *
ip_port = ("localhost", 51590)
buffer_size = 1024
back_log=5
udp_server=socket(AF_INET,SOCK_DGRAM)
udp_server.bind(ip_port)
while True:
print("wait for send message...")
cmd,addr = udp_server.recvfrom(buffer_size)
print("收到客户端发送的消息是:",cmd)
res = subprocess.Popen(cmd.decode("utf-8"), shell=True,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
err = res.stderr.read()
if err:
cmd_res = err
else:
cmd_res = res.stdout.read()
if not cmd_res:
cmd_res = "执行成功".encode("gbk")
udp_server.sendto(cmd_res,addr)
udp_server.close()
客户端:
import socket,time
ip_port=('localhost',51590)
bank_log=5
buffer_size=1024
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 重用ip和端口解决time——wait状态(address already in use)
tcp_server.bind(ip_port)
tcp_server.listen(bank_log)
print("waiting for connet...")
while True:
print("server working...")
conn,addr = tcp_server.accept()
print('server===>')
print("双向链接是",conn)
print("客户端地址",addr)
while True:
try:
data=conn.recv(buffer_size)
print("clent send message is :",data.decode("utf-8"))
time.sleep(2)
conn.sendall(data.upper())
except Exception :
print(Exception)
break
conn.close()
sk.close()
四、TCP struct 模块解决粘包方法:
服务端:
'''struct 解决粘包现象'''
'''tcp协议实现客户端输入的命令执行、服务端返回命令执行的结果'''
import struct,json
from socket import *
import subprocess
ip_port = ("localhost", 51590)
buffer_size = 1024
back_log = 5
tcp_server=socket(AF_INET,SOCK_STREAM)
tcp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
tcp_server.bind(ip_port)
tcp_server.listen(back_log)
while True:
print("waiting for connect...")
conn,addr=tcp_server.accept()
while True:
try:
cmd=conn.recv(buffer_size)
if not cmd:break
print('cmd: %s' %cmd)
res=subprocess.Popen(cmd.decode('utf-8'),
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
err = res.stderr.read()
# print(err.decode("utf-8"))
if err:
back_msg = err
else:
back_msg = res.stdout.read()
if not back_msg:
back_msg="命令执行成功,".encode("utf-8")
headers={'data_size':len(back_msg)}
head_json=json.dumps(headers)
head_json_bytes=bytes(head_json,encoding='utf-8') conn.send(struct.pack('i',len(head_json_bytes))) #先发报头的长度
conn.send(head_json_bytes) #再发报头
conn.sendall(back_msg) #在发真实的内容
except Exception:
print(Exception)
conn.close()
客户端:
'''struct 解决粘包现象'''
'''TCP 协议实现:客户端发送命令’并接收服务端发送过来的消息'''
from socket import *
import struct,json
ip_port=('localhost',51590)
buffer_size=1024
tcp_clent = socket(AF_INET,SOCK_STREAM)
tcp_clent.connect_ex(ip_port)
while True:
msg = input("请输入字符串:>>>").strip()
if not msg:continue
if msg=="quit":break
tcp_clent.send(msg.encode("utf-8"))
try:
heard = tcp_clent.recv(4)
heard_json_len=struct.unpack("i",heard)[0]
heard_json=json.loads(tcp_clent.recv(heard_json_len).decode("utf-8"))
data_len=heard_json['data_size']
recv_size=0
recv_data=b'' while recv_size<data_len:
recv_data+=tcp_clent.recv(buffer_size)
recv_size+=len(recv_data)
print("命令执行的结果是:",recv_data.decode("gbk")) # 默认打开文件的编码为unicode默认编码是“gbk”
except Exception:
print(Exception)
tcp_clent.close()
TCP 套叠字的更多相关文章
- 实现TCP、UDP相互通信及应用
实验名称 Socket编程综合实验(1) 一.实验目的: 1.理解进程通信的原理及通信过程 2.掌握基于TCP和UDP的工作原理 3.掌握基本的Socket网络编程原理及方法 二.实验内容 1.掌握 ...
- [转帖]Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点
Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点 http://network.51cto.com/art/201909/603780.htm 可以毫不夸张的说现如今的互联网是基于TC ...
- 触动精灵远程Log模块
一.功能 lua log方法能够自动发现同一网段下面的log服务器 lua log方法能够主动将log发给服务器 lua 客户端进程重启服务端不存在影响 二.实现 服务器使用python编写: 启动一 ...
- nodejs的某些api~(一)node的流2
可写流writablewritable.write(chunk, [encoding], [callback])chunk {String | Buffer} 要写入的数据encoding {Stri ...
- nodejs的某些api~(一)node的流1
根据心情整理一些node的api~ 今天第一篇,node的流:node的流比较重要,node的流存在于node的各个模块,包括输入输出流,stdin,stout.fs读取流,zlib流,crypto流 ...
- Python 实现进程间通信(网络编程)
[网络编程] 1):网络编程是什么意思,网络编程指的是不同机器之间通过网编相互发信息,我们常用的“QQ”,“微信”,“邮箱” 都个网编编程的应用: 网编编程在技术上还有另一个叫法叫“进程间通信”,进程 ...
- CCNA 课程 二
传输层:两个重要的协议 TCP 和 UDP TCP: 面向连接的协议:在传输用户数据前,先要建立连接 (TCP的三次握手) 错误检查 数据包序列化 可靠性传输:发送的数据需要接受者提供确认,通过报头中 ...
- nodejs api 中文文档
文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...
- C++网络套接字编程TCP和UDP实例
原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1. 创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1) 创建套接字(so ...
随机推荐
- spring rest 容易被忽视的后端服务 chunked 性能问题
spring boot 容易被忽视的后端服务 chunked 性能问题 标签(空格分隔): springboot springmvc chunked 作者:王清培(Plen wang) 沪江Java资 ...
- 转自: linux svn命令行无法拉取中文名称的文件
转自: https://blog.csdn.net/shaohui/article/details/3996274#commentBox svn: Can't convert string from ...
- Spring 拦截器postHandle无法修改Response的原因
如果controller跳转至页面,postHandle是没问题的. 如果@ResponseBody注释 或者返回 ResponseEntity,在postHandle拦截器中修改请求头,是无效的. ...
- Oracle 之 树查询 START WITH ... CONNECT BY ...子句
START WITH ... CONNECT BY ...子句是结构化查询中用到的,其基本语法是: select … from tablename start with 条件1 connect by ...
- DockerSwarm+Dubbo镜像与部署相关命令与参数
Docker 镜像 一.容器转镜像 docker commit <containerId> <image:tag> docker commit 3ffa4284ddca zoo ...
- InfluxDB meta文件解析
操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 influxdb默认配置: /etc/influxdb/infl ...
- Java数据结构之LinkedList、ArrayList的效率分析
前言: 在我们平常开发中难免会用到List集合来存储数据,一般都会选择ArrayList和LinkedList,以前只是大致知道ArrayList查询效率高LinkedList插入删除效率高,今天来实 ...
- RobotFrameWork接口项目分层及通用控制方式
1. 前言 上一篇文章介绍了在设计接口用例之前应遵守的设计规范,详见<RobotFramework接口设计规范>,当然读者公司的内部规范也不一定非得完全遵循笔者所提到的,适合自己公司内部的 ...
- 深入理解JVM虚拟机:(一)Java运行时数据区域
概述 JVM是Java语言的精髓所在,因为它Java语言实现了跨平台运行,以及自动内存管理机制等,本文将从概念上介绍JVM内存的各个区域,说明个区域的作用. JVM运行时数据区模型 Java虚拟机在执 ...
- CentOS 6.5 x64下查找依赖包,或用YUM安装
查看某个命令YUM上的安装源 1)当某个命令不存时进行查询所依赖的包,如:pstree [root@localhost ~]# yum provides pstree 已加载插件:fastestmir ...