Я пытаюсь использовать сокеты для отправки текста и файла с клиента на сервер. Проблема в том, что если я отправляю текст после отправки файла, отправка файла не работает (код блокируется, как будто сервер чего-то ждет).
Извините за длинный код, приведенный ниже, если вы запустите его так, как он работает, отправка клиентского файла test.txt
на сервер; но если вы раскомментируете строки, отмеченные в коде (сервер отправляет «ok» и клиент получает), сценарий блокируется.
Спасибо за вашу помощь!
server.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import threading
listen_addr = '127.0.0.1'
listen_port = 8082
bindsocket = socket.socket()
bindsocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
bindsocket.bind((listen_addr, listen_port))
bindsocket.listen(10)
class ClientThread(threading.Thread):
def __init__(self, ip, port, clientsocket):
threading.Thread.__init__(self)
self.ip = ip
self.port = port
self.clientsocket = clientsocket
print("[+] New thread %s %s" % (self.ip, self.port, ))
def send_txt(self, data):
self.clientsocket.send(data.encode())
print("Text send:", data)
return True
def recv_txt(self):
buf = self.clientsocket.recv(4096)
data = buf.decode("utf-8")
print("Received:", data)
return data
def recv_file(self, path_save):
f = open(path_save, 'wb') #open in binary
l = self.clientsocket.recv(4096)
while (l):
f.write(l)
l = self.clientsocket.recv(4096)
f.close()
print("File received:", path_save)
return True
def run(self):
self.recv_txt()
self.send_txt("OK")
file_name = self.recv_txt().split(":")[1]
print("file_name:" + file_name)
self.recv_file("./" + file_name)
# self.send_txt("OK") # **Uncomment and file sending fails**
self.clientsocket.shutdown(socket.SHUT_RDWR)
self.clientsocket.close()
print("Client disconnected...")
while True:
print("========================================")
print("Waiting for client")
clientsocket, (ip, port) = bindsocket.accept()
newthread = ClientThread(ip, port, clientsocket)
newthread.start()
client.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
import datetime
host_addr = '127.0.0.1'
host_port = 8082
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
conn.connect((host_addr, host_port))
def send_txt(data):
conn.send(data.encode())
print("Text send:", data)
return True
def recv_txt():
buf = conn.recv(4096)
data = buf.decode("utf-8")
print("Received:", data)
return data
def send_file(path_file):
f = open (path_file, "rb")
l = f.read(4096)
while (l):
conn.send(l)
l = f.read(4096)
f.close()
print("File sent:", path_file)
return True
send_txt("Hello, world! - " + str(datetime.datetime.now()))
recv_txt()
send_txt("File_name:test.txt")
send_file("./test.txt")
#recv_txt() # **Uncomment and file sending fails**
print("Closing connection")
conn.close()