Python ForkingTCPServer 错误

标签 python sockets socketserver

帮助构建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. 如何通过客户端发送数据“End”来关闭服务器?
  2. 如何限制连接数(例如不超过5个)?

最佳答案

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

对于“如何关闭服务器”:在一个类似的应用程序中(但更旧的 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 处理程序,您可以计算事件线程的数量并等待其中一个完成(如果有) “太多”优秀(或者按照你喜欢的方式工作)。请参阅 SocketServer.py 中的 ThreadingMixIn 类,并将其与 ForkingMixIn 中的 max_children 代码进行比较。

关于Python ForkingTCPServer 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17395734/

相关文章:

python - 从值和值计数的数据集构建列表

linux - 如何在 Linux 的 Perl 中使用带有 fcgi 的 unix 域套接字的抽象名称?

sockets - 发送数据后,JMeter TCP Sampler 不会关闭套接字

python - SocketServer 是否有用于 ThreadingMixIn 和 ForkingMixIn 的池?

Python SocketServer.BaseRequestHandler 不会与远程请求通信

python - 如何用其他数字替换列表元素的索引?

python - pandas 数据框中的随机选择

python - celery ,从其他任务调用的任务不起作用

c++ - 如何从远程计算机获取当前登录的用户名

java - java中可能的Socket + ServerSocket吗?