Я пытаюсь отправлять и получать сообщения и файлы, используя сокет в Python.Я использую 2 разных сокета, один для отправки сообщений и другой для отправки файлов.
Кроме того, программа использует многопоточность для отправки и получения сообщений и файлов одновременно.
Вот мой код:
Сервер:
import socket
import threading
def send_message(client):
global file_path
while True :
message = input()
if(message.startswith("/send")):
client.send(message.encode())
file_path = message[6:]
file_send_thread.start()
else:
client.send(message.encode())
def recv_message(client):
global file_name
while True:
try:
message = client.recv(4096)
if str(message.decode()).startswith("/send"):
file_name = str(message.decode()[6:]).split('/')[-1]
raise Exception("file received")
else:
print(message.decode('utf-8'))
except:
file_recv_thread.start()
def send_file(client2):
print("sending file -> ", file_path)
f = open(file_path, 'rb')
data = f.read(4096)
while (data):
client2.send(data)
data = f.read(4096)
f.close()
print("file sent!")
def recv_file(client2):
print("receving file <- ", file_name)
with open(file_name, 'wb') as q:
data = client2.recv(4096)
while data:
q.write(data)
data = client2.recv(4096)
q.close()
print("file received")
s = socket.socket()
s2 = socket.socket()
host = "172.18.217.105"
port = 55565
port2 = 55566
s.bind((host, port))
s.listen(5)
s2.bind((host, port2))
s2.listen(5)
client, addr = s.accept()
client2, addr2 = s2.accept()
print("connected to movahed: ", client)
print("connected to file movahed: ", client2)
recv_thread = threading.Thread(name="recv", target=recv_message, args=(client,))
send_thread = threading.Thread(name="send", target=send_message, args=(client,))
file_send_thread = threading.Thread(name="filesend", target=send_file, args=(client2,))
file_recv_thread = threading.Thread(name="filerecv", target=recv_file, args=(client2,))
print("starting threads")
send_thread.start()
recv_thread.start()
Клиент:
import socket
import threading
def send_msg(s):
global file_path
while True:
msg = input()
if msg.startswith("/send"):
s.send(msg.encode())
file_path = msg[6:]
send_file_thread.start()
else:
s.send(msg.encode())
def recv_msg(s):
global file_name
while True:
try:
msg = s.recv(4096)
if str(msg.decode()).startswith("/send"):
file_name = str(msg.decode()[6:]).split('/')[-1]
raise Exception("file received")
else:
print(msg.decode())
except:
print("except")
recv_file_thread.start()
print("recv_file_thread run!!")
def send_file(s2):
f = open(file_path, 'rb')
data = f.read(4096)
while(data):
s2.send(data)
data = f.read(4096)
f.close()
print("file sent!")
def recv_file(s2):
with open(file_name, "wb") as f:
data = s2.recv(4096)
while data:
f.write(data)
if not data:
break
data = s2.recv(4096)
print("file received!")
s = socket.socket()
s2 = socket.socket()
host = "172.18.217.105"
port = 55565
port2 = 55566
print("waiting for connection...")
s.connect((host, port))
s2.connect((host, port2))
send_thread = threading.Thread(name="send", target=send_msg, args=(s,))
recv_thread = threading.Thread(name="recv", target=recv_msg, args=(s,))
send_file_thread = threading.Thread(name="send_file", target=send_file, args=(s2,))
recv_file_thread = threading.Thread(name="recv_file", target=recv_file, args=(s2,))
print("starting threads...")
recv_thread.start()
print("recv_thread run!!")
send_thread.start()
print("send_thread run!!")
Проблема в том, что когда я отправляю какой-то файл в первый раз, он работает нормально, но поток, который используется дляотправка файла все еще выполняется, и если я отправляю файл (любой файл) во второй раз, возникает исключение, говорящее о том, что работающий поток не может быть запущен снова.
Так что мне нужно каким-то образом убить этот потоккогда файл получен, но я перепробовал много вещей, и ни одна из них не работает, поток все еще активен.
Примечание: отправка и получение сообщений работают нормально, проблема заключается только в отправке и получении файлов.