如何运行套接字服务器接受传入连接并处理代码的那一部分,而没有代码等待新连接卡在同一个循环中?
我刚开始尝试学习。 TCP处理程序是否有用?
我只需要一些关于这个主题的简单例子。我想要在服务器中有一个命令部分。所以我可以在服务器运行时做某些事情。
编辑:我正在尝试做什么:
1 - TCP server for multiple clients
2 - Respond to more than one at a time when needed
3 - Text input availability at all time, to be used for getting/setting info
4 - A simple way to get/save client address info. Currently using a list to save them.
答案 0 :(得分:2)
您可以在thread。
中运行套接字服务器import threading
import SocketServer
server = SocketServer.TCPServer(('localhost', 0), SocketServer.BaseRequestHandler)
th = threading.Thread(target=server.serve_forever)
th.daemon = True
th.start()
答案 1 :(得分:0)
我不确定你在问什么,但通常在服务器端,你使用socket(),bind()和listen()调用来设置套接字,然后循环调用accept()。此accept()调用将阻塞,直到建立客户端连接。
对于简单服务器,您可以处理客户端在循环中所做的任何请求。对于真实世界的服务器,您需要生成一些其他机制(例如,新的线程或进程,具体取决于语言/平台)来异步处理请求,以便原始循环可以在accept()调用上再次迭代并继续回到听取连接。
有关Python中的更多信息和示例,请参阅Python套接字文档:
答案 2 :(得分:0)
Python在asyncore
模块(http://docs.python.org/library/asyncore.html)中内置了对异步套接字处理的支持。
异步套接字处理意味着您必须在代码(主循环)中执行至少一次套接字处理循环迭代:
asyncore.loop(count=1)
取自文档的例子:
import asyncore
import socket
class EchoHandler(asyncore.dispatcher_with_send):
def handle_read(self):
data = self.recv(8192)
if data:
self.send(data)
class EchoServer(asyncore.dispatcher):
def __init__(self, host, port):
asyncore.dispatcher.__init__(self)
self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
self.set_reuse_addr()
self.bind((host, port))
self.listen(5)
def handle_accept(self):
pair = self.accept()
if pair is None:
pass
else:
sock, addr = pair
print 'Incoming connection from %s' % repr(addr)
handler = EchoHandler(sock)
server = EchoServer('localhost', 8080)
# Note that here loop is infinite (count is not given)
asyncore.loop()
每次套接字接受时,循环都会调用连接handle_accept
。每次从套接字handle_read
读取数据时都会被调用,依此类推。
您可以这种方式使用TCP和UDP套接字。