我正在开发一个小型服务器系统,每当我在控制台中键入“ 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")
答案 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)
creatingDeck(...)
非常方便。 recv调用最终会发生异常,您可以根据需要使用该异常完成线程。