一、  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. $.contents().find设置的data在iframe子页面无法获取值

    <iframe src="iframe16.html" id="iframe16" name="iframe16"></i ...

  2. jquery动态添加元素无法触发绑定的事件的解决方案

    方法一:绑定live事件(live事件只在jquery1.9以下才支持,高版本不支持). //jquery 1.9(不包括1.9)以下可以 $(".btn").live(" ...

  3. Python import语句导入模块语法[转]

    Python import语句导入模块语法 社区推荐:掘金是国内最活跃的技术社区,我们每日有优质Python开发实例分享,海量python开源库推送.来掘金,和更多懂技术的小伙伴交流.   pytho ...

  4. 转 : 深入解析Java锁机制

    深入解析Java锁机制 https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw%3D%3D&mid=2247485524&idx=1&s ...

  5. OpenCV自带dnn的Example研究(4)— openpose

    这个博客系列,简单来说,今天我们就是要研究 https://docs.opencv.org/master/examples.html下的 6个文件,看看在最新的OpenCV中,它们是如何发挥作用的. ...

  6. Linux报swap空间占用过高,但物理内存还有空余

    收到报警,swap空间占用过高,登录到系统查看内存使用详情,看到物理内存还有很多未使用 问题分析 Swap配置对性能的影响分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误.如 ...

  7. 一次python 内存泄漏解决过程

    最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,这里整理了一次内存泄漏的问题 通常我们写 ...

  8. Fluent动网格【10】:区域运动案例

    本案例主要描述如何在Fluent中处理包含了公转和自转的复合运动.涉及到的内容包括: 多区域模型创建 滑移网格设置 区域运动UDF宏DEFINE_ZONE_MOTION 案例描述 案例几何如图所示. ...

  9. HADOOP security

    https://www.microsoft.com/en-us/trustcenter/security/azure-security https://docs.microsoft.com/en-us ...

  10. users-and-groups-in-linux

    https://www.tecmint.com/compress-files-and-finding-files-in-linux/ https://www.tecmint.com/manage-us ...