【发布时间】:2021-10-19 18:59:50
【问题描述】:
我有一个套接字服务器,所以它永远循环并检查套接字上接收到的任何数据。 如果在套接字连接上收到 b'Go' 命令,我想开始另一个循环,每 5 秒打印一次“Going ...”。 如果在套接字连接上收到 b'Stop' 命令,我想启动另一个循环打印“Sitting ...”一次。 然后socket连接继续监听。
我尝试了以下但现在被阻止了。感谢您的帮助。
import socket
import threading
import time
class SimpleServer:
def __init__(self, port):
self.host = socket.getfqdn()
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.settimeout(None)
self.client_sockets = []
def initialise(self):
try:
self.sock.bind((self.host, self.port))
except socket.error:
return
self.sock.listen(5)
self.server_thread = threading.Thread(target=self.serve_forever)
self.server_thread.setDaemon(True)
self.server_thread.start()
def serve_forever(self):
try:
request, client_address = self.sock.accept()
with request:
while True:
data = request.recv(1024)
if not data:
break
data = data.decode("utf-8").strip()
if data == 'Go':
# Start another thread to print "Going ..." every 1 minute
# without blocking receiving new data on the socket
# prevent using subprocess.call if possible
????????
elif data == 'Stop':
print('Sitting ...')
except socket.error:
return
if __name__ == '__main__':
server = SimpleServer(args.socket_port)
server.initialise()
server.serve_forever()
【问题讨论】:
-
查看标准库的
socketservermodule -
您是否有意在主线程和子线程中调用
serve_forever?好像最后一行是错误的。 -
由于某种原因,如果我没有最后一行,程序似乎不会进入循环
-
您已将服务器线程设置为守护进程。在不阻止主线程退出的情况下,守护线程在主线程退出时退出。你不想要第二个 server_forever(),而是像
input('hit enter to stop the server')这样的东西。这将提供一种杀死服务器的方法。
标签: python multithreading sockets while-loop