Python中的简单TCP服务器

2 投票
1 回答
12671 浏览
提问于 2025-04-17 19:33

我是个新手。我正在尝试用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()也没有被调用。所以它能连接到套接字,但没有收到任何返回。

1 个回答

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(...) 来解决这个问题。

撰写回答