一、  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 套叠字的更多相关文章

  1. 实现TCP、UDP相互通信及应用

    实验名称  Socket编程综合实验(1) 一.实验目的: 1.理解进程通信的原理及通信过程 2.掌握基于TCP和UDP的工作原理 3.掌握基本的Socket网络编程原理及方法 二.实验内容 1.掌握 ...

  2. [转帖]Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点

    Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点 http://network.51cto.com/art/201909/603780.htm 可以毫不夸张的说现如今的互联网是基于TC ...

  3. 触动精灵远程Log模块

    一.功能 lua log方法能够自动发现同一网段下面的log服务器 lua log方法能够主动将log发给服务器 lua 客户端进程重启服务端不存在影响 二.实现 服务器使用python编写: 启动一 ...

  4. nodejs的某些api~(一)node的流2

    可写流writablewritable.write(chunk, [encoding], [callback])chunk {String | Buffer} 要写入的数据encoding {Stri ...

  5. nodejs的某些api~(一)node的流1

    根据心情整理一些node的api~ 今天第一篇,node的流:node的流比较重要,node的流存在于node的各个模块,包括输入输出流,stdin,stout.fs读取流,zlib流,crypto流 ...

  6. Python 实现进程间通信(网络编程)

    [网络编程] 1):网络编程是什么意思,网络编程指的是不同机器之间通过网编相互发信息,我们常用的“QQ”,“微信”,“邮箱” 都个网编编程的应用: 网编编程在技术上还有另一个叫法叫“进程间通信”,进程 ...

  7. CCNA 课程 二

    传输层:两个重要的协议 TCP 和 UDP TCP: 面向连接的协议:在传输用户数据前,先要建立连接 (TCP的三次握手) 错误检查 数据包序列化 可靠性传输:发送的数据需要接受者提供确认,通过报头中 ...

  8. nodejs api 中文文档

    文档首页 英文版文档 本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可. Node.js v0.10.18 手册 & 文档 索引 | 在单一页面中浏览 | JSON格 ...

  9. C++网络套接字编程TCP和UDP实例

    原文地址:C++网络套接字编程TCP和UDP实例作者:xiaojiangjiang 1.       创建一个简单的SOCKET编程流程如下 面向有连接的套接字编程 服务器: 1)  创建套接字(so ...

随机推荐

  1. mac双系统下ubuntu卡在开机密码登录界面卡死

    背景:开机黑屏卡在,dev/sda1: clean, 552599/6111232 files, 7119295/24414464 blocks,修复完这个问题之后,出现桌面卡死,光标鼠标键盘全部失灵 ...

  2. FtpCopy数据定时自动备份软件(FTP定时备份)

    1. 软件说明 FtpCopy是一款免费的FTP数据自动备份软件,如果FtpCopy对您有较大的帮助,欢迎捐赠我们,我们对您表示衷心的感谢! 如果有需求的话会一直更新下去,将软件做到极致! 有问题可直 ...

  3. 采石厂管理系统V3.0版本上线(采石厂车辆出入管理系统,石厂开票系统)

    新版系统包含老版所有功能,软件基础功能请点击查看<采石管理系统,采石厂车辆出入管理系统> 新增功能点 近期对采石厂管理系统进行了升级和完善,系统更加灵活好用,应用场景更加广泛.主要更新一下 ...

  4. CentOS 7下升级Python版本到3.x系列

    由于python官方已宣布2.x系列即将停止支持,为了向前看,我们升级系统的python版本为3.x系列服务器系统为当前最新的CentOS 7.4 1.安装前查看当前系统下的python版本号 # p ...

  5. 设置GRUB密码以防止单用户模式下root密码被恶意更改

    在使用LInux系统的时候可能会发生忘记root密码的情况,通常管理员会进入单用户模式下进行重置root密码.那么问题来了,既然管理员可以进入单用户模式,如果恶意用户可以接触的到计算机的话毫无疑问也是 ...

  6. vscode: Visual Studio Code 常用快捷键1

    ctrl + pAlt + shift 多行编辑

  7. s和t的特殊权限

    ls -l 通常会显示r w x权限,分别对应:读,写,执行权限. 但是有时我么会看到,s或t这类权限标识. eg: #include <unistd.h> #include <st ...

  8. [转]Linux下网络常用命令和工具

    转自:http://int32bit.me/2016/05/04/Linux%E5%B8%B8%E7%94%A8%E7%BD%91%E7%BB%9C%E5%B7%A5%E5%85%B7%E6%80%B ...

  9. 明天软软onsite

    现在在飞机上,还有1.5小时到达.买了网络包,速度不错.今年上半年第三次飞西雅图,过几天也许还有第四次... 今天群主FB加面系统设计非常顺利,祝他拿到大包裹,也希望拿到以后发大红包,这回我一定不能错 ...

  10. elasticsearch 一、环境配置

    简介 ElasticSearch是一个开源的分布式搜索引擎,具备高可靠性,支持非常多的企业级搜索用例,是基于Lucene构建的.支持时间时间索引和全文检索.官网:http://www.elastics ...