socket套接字
服务端 (TCP)
1 先建立套接字
2 服务端套接字与固定端口 IP 绑定
3 监听
4 准备连接(accept())
5 连接后返回 : 连接套接字 客户端地址(端口 IP) (三次握手 四次挥手)
6 准备接受消息 发送消息 (使用连接套接字) 每次接受成功会返回确定消息
客户端
1 建立套接字
2 建立连接(目标地址)
3 发送消息 接受消息
客户端
最初
client
from socket import * HOST = '127.0.0.1' PORT = 21555 BUFSIZ = 1024 ADDR =(HOST,PORT) TCP_client = socket(AF_INET,SOCK_STREAM) TCP_client.connect(ADDR) while True: data = input('>>>') if not data: break TCP_client.send(data.encode('utf-8')) data = TCP_client.recv(BUFSIZ) if not data: break print(data.decode('utf-8')) TCP_client.close()
server
import socket import time HOST = '127.0.0.1' PORT = 21555 BUFSIZ = 1024 ADDR =(HOST,PORT) TCP_Sever = socket.socket(socket.AF_INET,socket.SOCK_STREAM) TCP_Sever.bind(ADDR) TCP_Sever.listen(2) while True: print('等待连接') TCP_client, addr =TCP_Sever.accept() print('已连接',addr) while True: data = TCP_client.recv(BUFSIZ) print('data') if not data: break print(data) TCP_client.send('{}{}'.format(bytes(time.ctime(),'utf-8'),data).encode('utf-8')) TCP_client.close TCP_Sever.close
解决粘包现象
client
from socket import * import struct import json cli_tcp = socket(AF_INET,SOCK_STREAM) cli_tcp.connect(('127.0.0.1',8086)) while True: cmd = input('>>>') if not cmd : break cli_tcp.send(cmd.encode('utf-8')) hand_len = cli_tcp.recv(4) # 出错 原因 一定要收四个字节 因为 pack 'i' 转化为4 个字节 hand_len = struct.unpack('i', hand_len) hand = cli_tcp.recv(hand_len[0]).decode('utf-8') hand_1 = json.loads(hand) print(hand_1) data_len = hand_1['len'] print(data_len) r_s = 0 while r_s < data_len: data = cli_tcp.recv(1024) # print(data) # print(data.decode('gbk')) # print(len,type(len)) # print(len(data)) r_s += len(data) print(r_s) # r_s = len(data) print(data.decode('GBK')) # recv_size=0 # recv_data=b'' # while recv_size < data_len: # recv_data+=client.recv(1024) # recv_size+=len(recv_data) # # print(recv_data.decode('utf-8'))
server
from socket import * import subprocess import json import struct sever_tcp = socket(AF_INET,SOCK_STREAM) sever_tcp.bind(('127.0.0.1',8086)) sever_tcp.listen(5) while True: conn , addr = sever_tcp.accept() while True: cmd = conn.recv(1024) if not cmd: 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() hand = { 'name': 'adad', 'len': len(stderr)+len(stdout) } hand = json.dumps(hand) hand_len =struct.pack('i',len(hand.encode('utf-8'))) conn.send(hand_len) conn.send(hand.encode('utf-8')) conn.send(stderr) conn.send(stdout)