Home Admin

socket

Edit
· json · rss
Subscribe:

About

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)