socket 服务端
# threaded_server.py
import Lib.debug.log
import socket, threading
import json
import struct
class SocketServer:
HOST, PORT, BUFSIZE = '0.0.0.0', 5000, 1024 * 32
def __init__(self) -> None:
self.handle = socket.socket()
self.handle.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.handle.bind((self.HOST, self.PORT))
self.handle.listen(5)
def start(self):
print(r'[*] Listening %s:%s' % (self.HOST, self.PORT))
while True:
print('wait connection...')
connection, (ip, port) = self.handle.accept()
threading.Thread(target=self.handle_client, args=(connection, ip, port), daemon=True).start()
def handle_client(self, connection: socket.socket, ip: str, port: int):
ip_port = '%s:%s' % (ip, port)
with connection:
print('[-] Connected: (%s, %s)' % (ip, port))
while True:
print('[%s] wait message...' % (ip_port))
n, = struct.unpack('!I', connection.recv(4))
# data = connection.recv(n)
# print(n)
a, b = n / self.BUFSIZE, n % self.BUFSIZE
# print(a, b)
a, b = int(a), int(b)
data = b''
for i in range(a):
# print('%s/%s' % (i+1, a))
data += connection.recv(self.BUFSIZE)
data += connection.recv(b)
# data = connection.recv(self.BUFSIZE)
print('[%s] get message!' % (ip_port))
print(data)
# print('[%s] %s' % (ip_port, data))
# hex_str = ''.join([r'\x%02x' % v for v in data])
# print('[%s] %s' % (ip_port, hex_str))
# obj = json.loads(data.decode('utf-8'))
# print(obj)
# print(len(data))
# with open(r'E:\work\202502\20250206-07\fm58-li-gz05\fm58-li-gz05-far\RotarySys\Ctrl\sd.iso', 'wb') as f:
# f.write(data)
if not data:
break
connection.sendall(data) # 回显
print('[-] Disconnected: (%s, %s)' % (ip, port))
if __name__ == '__main__':
SocketServer().start()
socket 客户端
import socket
import struct
client = socket.socket()
client.connect(('localhost', 5000))
def send_all(soc: socket.socket, data: bytes):
"""
传输的数据格式定义为:数据头(4字节) + 数据本体
- 数据头:表示数据本体的长度(单位为字节),如:b`\x00\x00\x00\x07f` 表示数据本体长度是 127字节 (总共就需要发送 131字节)
- 数据本体:需要发送的数据
注:4字节能表示 2^32个无符号整数,即上述定义能表示约 4TB 的传输数据
"""
len_bytes = struct.pack('!I', len(data))
# print(data)
print(len(data))
soc.sendall(len_bytes + data)
# send_all(client, open(r'E:\work\202502\20250206-07\fm58-li-gz05\fm58-li-gz05-far\RotarySys\Ctrl\fileviewer.exe', 'rb').read())
send_all(client, b'hello world')
send_all(client, '你干嘛'.encode('utf-8'))
import time; time.sleep(1)