【发布时间】:2012-10-19 06:26:39
【问题描述】:
我想创建一个可以在多个端口(例如:TCP:1234、TCP:5678 等)上运行的 python 网络应用程序。
所以我可以说 n 个套接字,每个套接字都侦听一个客户端连接。我编写了一个简单的网络应用程序,它侦听一系列端口,但是当我运行该应用程序时,它卡在了第一个套接字进程的侦听阶段!
如何在运行时制作我的单个 python 程序以侦听 N 个端口并且每个端口都等待客户端连接到它。所有套接字都在同时运行和侦听。
Socket/Process #1: Listening on TCP Port 5000
Socket/Process #2: Listening on TCP Port 5001
Socket/Process #3: Listening on TCP Port 5002
...
Socket/Process #N: Listening on TCP Port 6000
欣赏任何想法。
#!/usr/bin/env python
import socket
def getPortList():
ports=[]
nPort=int(raw_input("# how many ports you want? "))
j = 0
for i in range(0,nPort):
ports.append(int(raw_input("Enter port number: ")))
j+=1
return ports
def myTCPSocket(port=5000):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
s.bind(("", int(port)))
print ("\nWaiting for connections!\n")
s.listen(5)
(clientsock, clientaddr) = s.accept()
print(clientaddr)
data = "start"
while len(data):
clientsock.send("\nWelcome to Echo Server\n")
data = clientsock.recv(1024)
print ("Data sent is: ", data)
clientsock.send(data)
if data == "exit\r\n":
clientsock.close()
plst = getPortList()
for item in plst:
myTCPSocket(item)
【问题讨论】:
-
你如何处理同一个套接字上的多个连接?一个显式的
select循环、asyncore、一个更高级别的反应器或像 Twisted 这样的前摄器、每个连接的线程、每个连接的进程……?无论您为此做什么,也适用于多个侦听器套接字。您的输出意味着您为每个侦听器都有一个单独的进程,这应该可以工作。你能告诉我们“卡住”的代码吗? -
目前我没有为同一个套接字启用任何多个连接。只有一个客户端可以连接到套接字。它现在很好。问题在于运行 python 程序并让它为每个端口分叉或创建一个套接字/进程,以便客户端可以连接到它。
-
你真的会更好地设计多个客户端连接,此时这个问题变得微不足道。但是,如果您真的想在没有那个问题的情况下解决这个问题,那么每个套接字的分叉(或者,更好的是,使用
multiprocessing)应该可以正常工作。再说一遍,你试过什么没用? -
对不起,我无法在这里添加所有代码,我在这里添加了它:link
-
好吧,您有一个名为 myTCPSocket 的函数,它接受一个客户端并且在客户端离开之前不会返回。然后每个套接字调用一次此函数。所以它将等待端口 5000 上的客户端连接、执行操作并离开;然后等待端口 5001 上的客户端连接,执行操作,然后离开;等等。所有代码都是同步的,除非你做一些事情使它异步(多线程、多处理、事件循环等)。请参阅我的两个示例以了解两种不同的执行方式。
标签: python sockets networking process