在套接字服务器运行时运行单独的代码?

时间:2011-09-14 18:41:41

标签: python sockets tcp udp

如何运行套接字服务器接受传入连接并处理代码的那一部分,而没有代码等待新连接卡在同一个循环中?

我刚开始尝试学习。 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. 

3 个答案:

答案 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套接字文档:

http://docs.python.org/howto/sockets.html

答案 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套接字。