python基础(30):黏包、socket的其他方法(python socket发包)

网友投稿 291 2022-08-09

python基础(30):黏包、socket的其他方法(python socket发包)

1. 黏包

1.1 黏包现象

让我们基于tcp先制作一个远程执行命令的程序(命令ls -l ; lllllll ; pwd)

同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包。

1.1.1 基于TCP协议实现的黏包

server:

#_*_coding:utf-8_*_

from socket import *

import subprocess

 

ip_port=('127.0.0.1',8888)

BUFSIZE=1024

 

tcp_socket_server=socket(AF_INET,SOCK_STREAM)

tcp_socket_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

tcp_socket_server.bind(ip_port)

tcp_socket_server.listen(5)

 

while True:

conn,addr=tcp_socket_server.accept()

print('客户端',addr)

 

while True:

cmd=conn.recv(BUFSIZE)

if len(cmd) == 0:break

 

res=subprocess.Popen(cmd.decode('utf-8'),shell=True,

stdout=subprocess.PIPE,

stdin=subprocess.PIPE,

stderr=subprocess.PIPE)

 

stderr=res.stderr.read()

stdout=res.stdout.read()

conn.send(stderr)

conn.send(stdout)

client:

#_*_coding:utf-8_*_

import socket

BUFSIZE=1024

ip_port=('127.0.0.1',8888)

 

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

res=s.connect_ex(ip_port)

 

while True:

msg=input('>>: ').strip()

if len(msg) == 0:continue

if msg == 'quit':break

 

s.send(msg.encode('utf-8'))

act_res=s.recv(BUFSIZE)

 

print(act_res.decode('utf-8'),end='')

1.1.2 基于UDP协议实现的黏包

server:

#_*_coding:utf-8_*_

from socket import *

import subprocess

 

ip_port=('127.0.0.1',9000)

bufsize=1024

 

udp_server=socket(AF_INET,SOCK_DGRAM)

udp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)

udp_server.bind(ip_port)

 

while True:

#收消息

cmd,addr=udp_server.recvfrom(bufsize)

print('用户命令----->',cmd)

 

#逻辑处理

res=subprocess.Popen(cmd.decode('utf-8'),shell=True,stderr=subprocess.PIPE,stdin=subprocess.PIPE,stdout=subprocess.PIPE)

stderr=res.stderr.read()

stdout=res.stdout.read()

 

#发消息

udp_server.sendto(stderr,addr)

udp_server.sendto(stdout,addr)

udp_server.close()

client:

from socket import *

ip_port=('127.0.0.1',9000)

bufsize=1024

 

udp_client=socket(AF_INET,SOCK_DGRAM)

 

 

while True:

msg=input('

共8页: 上一页12345678下一页

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python基础-time和datetime模块
下一篇:常用模块(ansible常用模块)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~