目录
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)