Как убить поток в python-3.x - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь отправлять и получать сообщения и файлы, используя сокет в 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!!")

Проблема в том, что когда я отправляю какой-то файл в первый раз, он работает нормально, но поток, который используется дляотправка файла все еще выполняется, и если я отправляю файл (любой файл) во второй раз, возникает исключение, говорящее о том, что работающий поток не может быть запущен снова.

Так что мне нужно каким-то образом убить этот потоккогда файл получен, но я перепробовал много вещей, и ни одна из них не работает, поток все еще активен.

Примечание: отправка и получение сообщений работают нормально, проблема заключается только в отправке и получении файлов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...