基于tcp协议
tcp协议可能是多发对应一收 数据流 *****
优点,传输数据更加可靠
缺点,每次传数据必须建立链接,每次发数据必须确认,要处理粘包问题
下载,转载用tcp
基于udp协议
udp是一发对应一收 ,不会有粘包问题,数据报
稳定传输的字节512字节
优点,传输数据更快
缺点,数据容易丢失, 传输数据不可靠
用于聊天udp
服务端
import socket
import subprocess
import struct
# 创建链接
server1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定ip
server1.bind(('192.168.1.163',8081))
# 监听
server1.listen(5)
# 建立三次握手
while True:
conn,client_addr = server1.accept()
print(conn)
print(client_addr)
while True:
try:
data = conn.recv(1024)
obj = subprocess.Popen(data.decode('utf-8')
,shell = True
,stdout = subprocess.PIPE
,stderr=subprocess.PIPE
)
std_out = obj.stdout.read()
std_err = obj.stderr.read()
print((std_out+std_err).decode('gbk'))
# 制作报头
header_long = len(std_out+std_err)
header = struct.pack('i',header_long)
# 第二发送长度
conn.send(header)
# 第三发送数据
conn.send(std_out+std_err)
except ConnectionResetError:
break
# 断开数据接收
conn.close()
# 断开服务器
server1.close()
客户端
import socket
import struct
# 客户端建立链接
client1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定IP
client1.connect(('192.168.1.163',8081))
while True:
# tasklist
data_str = input('>>>>>').strip()
if len(data_str) == 0:continue
# 客户端发送数据
client1.send(data_str.encode('utf-8'))
# 接收报头
header = client1.recv(4)
# 解析报头数据
total_size = struct.unpack('i',header)[0]
cmd_res = b''
data_size = 0
while data_size < total_size:
data = client1.recv(1024)
data_size += len(data)
cmd_res += data
print('收到服务端数据',data.decode('gbk'))
client1.close()