1

帮助构建python ForkingTCPServer。当客户端连接到服务器时,此服务器返回错误。当我使用 ThreadingTCPServer 而不是 ForkingTCPServer 它工作正常。socketFileIO 模块包含 pickle 到/从套接字的函数: http ://code.activestate.com/recipes/577667-pickle-tofrom-socket/

服务器.py:

import SocketServer, time 
from socketFileIO import write, read

class MyClientHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        print self.client_address
        data=read(self.request)
        print 'Client:', data
        time.sleep(10) # for testing
        write(self.request,data)
        self.request.close()

HOST, PORT = '', 50007
server = SocketServer.ForkingTCPServer((HOST, PORT), MyClientHandler)
server.serve_forever()

客户端.py:

import socket
from socketFileIO import write, read
HOST = '127.0.0.1'
PORT = 50007
data=["A","B","C","End"]
for x in data:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((HOST, PORT))
    write(s,x)
    y=read(s)
    print 'Server:', y
    s.close()

错误:

----------------------------------------
Exception happened during processing of request from ('127.0.0.1', 1469)
Traceback (most recent call last):
  File "c:\Python26\lib\SocketServer.py", line 283, in _handle_request_noblock
    self.process_request(request, client_address)
  File "c:\Python26\lib\SocketServer.py", line 525, in process_request
    pid = os.fork()
AttributeError: 'module' object has no attribute 'fork'
----------------------------------------

我还有其他几个问题:

  1. 如何通过从客户端发送数据“结束”来关闭服务器?
  2. 如何限制连接数(例如不超过 5 个)?
4

1 回答 1

1

您的分叉问题已在评论中得到解答。

对于“如何关闭服务器”:在一个类似的应用程序中(但 Python 版本要旧得多并使用 xmlrpc),我使用了一个循环,一次调用一个请求,直到设置了一个“停止”变量。现在,Python 2.7 似乎直接支持这一点:在您的线程服务器中shutdown(),从请求处理程序线程之一调用服务器实例。(不确定这是否在 2.6 中可用,几个月前我卸载了旧的 2.6 版本。)即:

class MyClientHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        ...
        # if we're supposed to shut down the server, do that
        if somecond:
            self.server.shutdown()

为了限制连接数:我看不到任何内置的东西,但是如果您重新定义process_request处理程序,您可以计算活动线程的数量并等待一个完成,如果有“太多”未完成(或者工作它但是)否则你喜欢)。查看中的ThreadingMixInSocketServer.py并将其与中的max_children代码进行比较ForkingMixIn

于 2013-07-01T00:36:35.860 回答