服务端和客户端

目录

1,发送数据

2,解析数据

3,建立套接字和线程

4,解析发送过来的数据


1,发送数据

def send_data(_socket_conn, _path):
    _head = struct.pack(b'128sq', bytes(os.path.basename(_path), encoding="utf-8"), os.stat(_path).st_size)
    _socket_conn.send(_head)
    with open(_path, 'rb') as f:
        while True:
            data = f.read(1024)
            if data:
                _socket_conn.send(data)
            else:
                break

pack:打包,以某种特定字符进行打包

with :方法不用关闭,可以实现自动关闭

2,解析数据

def store_data(_sock, _form="server_"):
    while True:
        file_info_size = struct.calcsize('128sq')
        buf = _sock.recv(file_info_size)
        if buf:
            file_name, file_size = struct.unpack('128sq', buf)
            file_name = file_name.decode().strip("\x00")
            new_file_name = os.path.join("./", 'from_' + _form + file_name)
            recvd_size = 0
            with open(new_file_name, 'wb') as f:
                while not file_size == recvd_size:
                    if file_size - recvd_size > 1024:
                        data = _sock.recv(1024)
                        recvd_size += len(data)
                    else:
                        data = _sock.recv(1024)
                        recvd_size = file_size
                    f.write(data)
        break

    if _form == 'server_':
        print("###文件接受成功### server -----> client ###")
        _sock.send("文件接受成功".encode("utf-8"))
    else:
        print('###文件接受成功### client ------> server ###')
file_name.decode().strip("\x00"):去除文件中前后的\x00数据

3,建立套接字和线程

def main():
    with Sock(AF_INET, SOCK_STREAM) as _sock:
        _sock.bind(("127.0.0.1", 4097))
        _sock.listen(1000)
        print('菜狗机器人后台启动等待链接,端口号:', 4097)
        while True:
            _client_conn, _client_info = _sock.accept()
            _thread = Thread(target=recv_response, args=(_client_conn, _client_info,))
            _thread.start()
            _thread.join()
_client_conn, _client_info = _sock.accept():可以实现阻塞,每次只能实现一次同行

4,解析发送过来的数据

def recv_response(_client_conn, _client_info):
    print(f"建立连接:{_client_conn},来自:{_client_info}")
    while True:
        _recv = _client_conn.recv(1024)
        _content = _recv.decode('utf-8')
        print(_content)
        if _content == 'end':
            _client_conn.close()
        else:
            _response(_content, _client_conn)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值