2

ここの初心者。単純な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(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()も呼び出されていません。したがって、ソケットに接続しますが、何も返されません。

4

1 に答える 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(...)ここであなたを助けるでしょう。

于 2013-03-18T20:33:36.483 に答える