Python 使用多线程的套接字非阻塞服务器
Python Sockets Non-blocking Server using Multithreading
我正在 Python 中构建一个点对点库,使用 TCP 套接字和多线程来处理对等连接。我想要一个 main.py
来创建 Node
class 的实例,启动服务器侦听端口上的连接,然后调用 class 的一些方法.
e.x. main.py
from p2p import Node
a = Node(port=6666)
a.connect("138.197.105.184", 6666)
由于 运行 连接服务器是一个阻塞调用,我想 运行 它在一个单独的线程中,以便程序可以继续做事(比如连接到其他节点)同时也在监听连接。
在线程中启动服务器的节点 运行s self.startServer
。
来自服务器的新连接也在它们自己的线程中处理。
p2p.py
def startServer(self):
start_new_thread(self.startThreadedServer, ())
def startThreadedServer(self):
while 1: # blocking call
logging.debug("Waiting for connection")
conn, addr = self.server.accept()
logging.debug(conn + " " + addr)
logging.info('Connected with ' + addr[0] + ':' + str(addr[1]))
start_new_thread(self.clientThread ,(conn,))
def clientThread(self, conn):
while True:
#Receiving from client
data = conn.recv(1024)
if is_json(data):
payload = json.loads(data)
reply = self.respond(payload)
if not data:
break
conn.sendall(reply)
conn.close()
但是,当服务器运行这样时,所有套接字连接都会失败。
当我 运行 self.startThreadedServer()
作为服务器时,它接受连接但它是一个阻塞调用。不好。
如何启动服务器并让服务器在后台继续监听和接受连接?
关于线程的工作原理,我被误导了。我认为程序应该在后台 运行 个线程 运行 之后终止。相反,程序根本不应该终止。
两个节点都应该在 while 循环中主动监听连接。为了实现所需的功能,整个程序应该使用 python-daemon
package.
之类的东西进行守护进程。
我正在 Python 中构建一个点对点库,使用 TCP 套接字和多线程来处理对等连接。我想要一个 main.py
来创建 Node
class 的实例,启动服务器侦听端口上的连接,然后调用 class 的一些方法.
e.x. main.py
from p2p import Node
a = Node(port=6666)
a.connect("138.197.105.184", 6666)
由于 运行 连接服务器是一个阻塞调用,我想 运行 它在一个单独的线程中,以便程序可以继续做事(比如连接到其他节点)同时也在监听连接。
在线程中启动服务器的节点 运行s self.startServer
。
来自服务器的新连接也在它们自己的线程中处理。
p2p.py
def startServer(self):
start_new_thread(self.startThreadedServer, ())
def startThreadedServer(self):
while 1: # blocking call
logging.debug("Waiting for connection")
conn, addr = self.server.accept()
logging.debug(conn + " " + addr)
logging.info('Connected with ' + addr[0] + ':' + str(addr[1]))
start_new_thread(self.clientThread ,(conn,))
def clientThread(self, conn):
while True:
#Receiving from client
data = conn.recv(1024)
if is_json(data):
payload = json.loads(data)
reply = self.respond(payload)
if not data:
break
conn.sendall(reply)
conn.close()
但是,当服务器运行这样时,所有套接字连接都会失败。
当我 运行 self.startThreadedServer()
作为服务器时,它接受连接但它是一个阻塞调用。不好。
如何启动服务器并让服务器在后台继续监听和接受连接?
关于线程的工作原理,我被误导了。我认为程序应该在后台 运行 个线程 运行 之后终止。相反,程序根本不应该终止。
两个节点都应该在 while 循环中主动监听连接。为了实现所需的功能,整个程序应该使用 python-daemon
package.