新手在这里。我正在尝试使用SocketServer创建一个简单的TCP服务器进程请求。不知何故,handle()方法没有被调用。
版本:Linux上的2.4.3
以下是相关代码:
#!/usr/bin/python -u
import socket;
import SocketServer
import time;
import threading;
class EchoRequestHandler(SocketServer.BaseRequestHandler):
def handle(self):
# Echo the back to the client
data = self.request.recv(1024)
self.request.send(data)
return
class MyThreads(threading.Thread):
def __init__(self):
self.server = None;
threading.Thread.__init__(self);
def run(self):
if self.server == None:
address = ('localhost', 40000);
self.server = SocketServer.TCPServer(address, EchoRequestHandler);
# The following line partially fixed the problem
self.server.serve_forever();
if __name__ == '__main__':
thr = MyThreads();
thr.setDaemon(True);
thr.start();
# Connect to the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 40000))
# Send the data
message = 'Hello, world'
print 'Sending : "%s"' % message
len_sent = s.send(message)
# Receive a response
print 'Sending : "%s"' % message
response = s.recv(len_sent)
print 'Received: "%s"' % response
代码正在创建套接字,我可以使用netstat从命令行看到它。但是在调试器(python -m pdb)中,我看不到方法run()执行的代码。并且handle()也没有被调用。所以它连接到套接字,但没有收到任何回复。
答案 0 :(得分:2)
您需要调用serve_forever()
让SocketServer
对象开始侦听连接。顾名思义,serve_forever()
方法永远不会返回。鉴于这一事实,您可能希望在您的线程中调用它,以便继续执行其余代码。例如:
class MyThreads(threading.Thread):
def __init__(self):
self.server = None;
threading.Thread.__init__(self);
def run(self):
if self.server == None:
address = ('localhost', 40000);
self.server = SocketServer.TCPServer(address, EchoRequestHandler);
self.server.serve_forever()
如果您的客户端代码在套接字侦听之前尝试连接,则可能会遇到竞争条件。可能time.sleep(...)
会帮助你。