如何在python中中断socket.recv()?

时间:2019-03-03 01:48:31

标签: python sockets interrupt

我正在开发一个小型服务器系统,每当我在控制台中键入“ exit()”时都需要关闭服务器(输入是从另一个线程处理的) 我想知道在套接字等待数据时是否有一种方法可以终止主线程。我已经尝试过在try块中将_thread.interrupt_main()与keyboardInterrupt一起使用,但是它没有用。 我也尝试了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")

2 个答案:

答案 0 :(得分:0)

以下代码可以满足您的要求,但是在基本级别上可以关闭单个客户端的连接。 如果需要,您应该重组代码以处理多个客户端。 最好的主意是为同一套接字连接的每个连接启动新线程,以便您可以分别处理它们。

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")

答案 1 :(得分:0)

如果您在主线程中有套接字,并且线程在recv / recvfrom / etc中被阻塞,则

creatingDeck(...)非常方便。 recv调用最终会发生异常,您可以根据需要使用该异常完成线程。