帮助构建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'
----------------------------------------
我还有其他几个问题:
- 如何通过客户端发送数据“End”来关闭服务器?
- 如何限制连接数(例如不超过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/