<p>如果我理解正确,我想你可能误解了模块的工作原理。您已经指定了地址'本地主机:6666'来绑定服务器。在</p>
<p>当您通过调用serve_forever()启动服务器时,这将导致服务器开始监听上的套接字本地主机:6666。在</p>
<p>根据文档,该套接字作为“request”对象传递给您的RequestHandler。当在套接字上接收到数据时,您的“handle”方法应该能够使用文档化的socketapi从该对象接收/发送到该对象。在</p>
<p>如果您需要进一步的抽象,那么您的RequestHandler看起来可以从StreamRequestHandler扩展到使用类似文件的对象的套接字读/写。在</p>
<p>关键是,不需要创建额外的套接字,然后尝试强制服务器使用新的套接字。SocketServer模块的部分价值在于它可以为您管理套接字的生命周期。在</p>
<p>另一方面,如果您想从客户机的角度测试服务器,那么您需要创建一个可以读/写客户机请求的套接字。但你永远不会把这个套接字传递给你的服务器。您可能会在一个完全独立的进程中完成这项工作,并通过套接字上的IPC测试服务器。在</p>
<p><strong>根据新信息编辑</strong></p>
<p>要让服务器A在服务器A接收到数据时打开到服务器B的套接字,一种解决方案是从RequestHandler内部打开一个套接字。也就是说,根据您的服务需求,您可能需要解决一些其他的设计问题。在</p>
<p>例如,您可能希望使用一个简单的连接池,即打开服务器B的几个套接字,服务器a可以将其用作资源。Python中可能已经有一些库可以帮助实现这一点。在</p>
<p>根据您当前的设计,您的RequestHandler可以作为成员变量访问服务器,因此您可以执行以下操作:</p>
<pre><code>class TestServer(SocketServer.TCPServer):
def point (self, socketB):
self.socketB = socketB # hold serverB socket
class TestRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
data = self.request.recv(1024)
if (data):
self.request.send(data)
print data
self.server.socketB ... # Do whatever with the socketB
</code></pre>
<p>但是,正如我所说的,最好是有某种类型的连接池或其他对象来管理您的serverb套接字,这样您的servera处理程序可以在处理传入请求时获取/释放该套接字。在</p>
<p>这样,您可以更好地处理服务器B中断套接字的情况。你现在的设计不能很容易地处理损坏的插座。只是一些想法。。。在</p>