Как прервать socket.recv () в python? - PullRequest
0 голосов
/ 03 марта 2019

Я разрабатываю небольшую серверную систему, и мне нужно выключать сервер всякий раз, когда я набираю «exit ()» в консоли (ввод обрабатывается из другого потока). Мне было интересно, есть ли способ завершитьОсновной поток, пока сокет ожидает данных.Я уже пытался использовать _thread.interrupt_main () с исключением из клавиатурыInterrupt в блоке try, но это не сработало.Я также попытался os._exit (), который работал, но он не очищается, поэтому я решил не использовать его.Мой код:

import socket
import _thread
import os

clear = lambda: os.system("cls")

try:
    Server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    Server.bind(("localhost",port))
    Server.listen(2)
    clear()
    print("--------------------------------------")
    print("Server running on port %s" % str(port))
    print("--------------------------------------")
except Exception:
    print("error while starting server")
    input()
    exit()

def control():
    while True:
        command = input()
        if command == "exit()":
            #interrupt code here

_thread.start_new_thread(control,())

while True:
    con,ip = Server.accept()
    print(str(ip) + " Connected")

    try:
        cmd = str(con.recv(1024).decode())  #<-- interrupt this line
    except Exception:
        print("Error")

1 Ответ

0 голосов
/ 03 марта 2019

Код ниже делает то, что вы хотите, но на базовом уровне для закрытия соединения одного клиента.Вы должны реструктурировать свой код для обработки нескольких клиентов, если хотите.Лучше всего начинать новый поток для каждого соединения одного и того же сокета, чтобы вы могли обрабатывать их отдельно.

import socket
import _thread
import os

clear = lambda: os.system("cls")
port = 1026
try:
    Server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    Server.bind(("127.0.0.1",1026))
    Server.listen(2)
    print("--------------------------------------")
    print("Server running on port %s" % str(port))
    print("--------------------------------------")
except Exception:
    print("error while starting server")
    input()
    exit()

def control(sock):
    while True:
        command = input()
        if command == "exit()":
            sock.close()
            os._exit(0)
            #interrupt code here


while True:
    con,ip = Server.accept()
    _thread.start_new_thread(control,(con,))
    print(str(ip) + " Connected")

    try:
        cmd = str(con.recv(1024).decode())  #<-- interrupt this line
    except Exception:
        print("Error")
...