python中的简单TCP服务器
我是新手。我正在尝试创建一个简单的TCP服务器,它使用SocketServer处理请求。不知何故,没有调用handle()方法 版本:Linux上的2.4.3 以下是相关代码:python中的简单TCP服务器,python,socketserver,Python,Socketserver,我是新手。我正在尝试创建一个简单的TCP服务器,它使用SocketServer处理请求。不知何故,没有调用handle()方法 版本:Linux上的2.4.3 以下是相关代码: #!/usr/bin/python -u import socket; import SocketServer import time; import threading; class EchoRequestHandler(SocketServer.BaseRequestHandler): def handle
#!/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-mpdb)中,我根本看不到run()方法中的代码正在执行。而且句柄()也没有被调用。因此,它连接到套接字,但没有收到任何回音。您需要调用
serve\u forever()
以使您的SocketServer
对象开始侦听连接。serve\u 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(…)
会对您有所帮助。您看过这个示例了吗?我在代码中看不到对永远服务()
的调用。而且,在import
语句之后不需要分号。我知道,这只是其他编程习惯的遗留。我无法确定在此代码中在何处使用serve_forever()。我有点困惑。你应该试着改掉这些习惯,尤其是当你在SO中发布代码时。哦,你是对的,永远服务()似乎解决了这个问题。但现在我有了一个新问题。它似乎在发送和接收一条消息后立即被释放。它不会永远服务。当我第二次尝试发送消息时,我会收到以下错误:回溯(最近一次调用):文件“/testTCP.py”,第47行,在?response=s.recv(len_sent)socket.error:(104,“由对等方重置连接”)感谢您的帮助@larsks,我按照您的建议重新编写了代码,现在可以使用了。