3

私は、SocketServer.TCPServer および SocketServer.BaseRequestHandler 基本クラスを使用して Python サーバーを開発してきました。ホスト「localhost」とポート 2304 を使用しています (他のプログラムでは使用されていません)。

問題は、サーバーがリモート リクエストに応答しないことです。私は Amazon AWS を使用しており、アクセス用の静的 IP アドレスを持っています。

たとえば、Amazonローカルマシンでサーバーをテストするとき。ブラウザ、サーバーが機能していることがわかりますが、リモート アクセスはブロックされたままです。外部のローカル マシンからアクセスできるように 2304 ポートを開く方法がわかりません。

コード全体は次のとおりです。

import threading, socket
import SocketServer, Queue
import globals
import transaction_pool


class CTSRSThreadedTCPRequestHandler(SocketServer.BaseRequestHandler):

    def handle(self):

        if globals.terminating:
            self.Respond("")


        pCurrThread = threading.currentThread()
        sData = self.request.recv(8192)

        print "CTSRSThreadedTCPRequestHandler->RECV->OK!"

        sResponse = "OK!"

        self.Respond(sResponse)

        print "CTSRSThreadedTCPRequestHandler->SEND->OK!"

    #-------------------------------------------------------------------------

    def Respond(self, sResponse):
        self.request.send(sResponse)

    #-------------------------------------------------------------------------


class CTSRSThreadedTCPServer(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
    allow_reuse_address = True


class CTSRSServer:

    m_pServerThread = None
    m_pServer = None

    #----------------------------------------------------------

    def StartServer(self):
        try:
            self.m_pServer = CTSRSThreadedTCPServer(("localhost", 2304), CTSRSThreadedTCPRequestHandler)
            sIP, iPort = self.m_pServer.server_address

            self.m_pServerThread = threading.Thread(target = self.m_pServer.serve_forever)

            self.m_pServerThread.daemon = True
            self.m_pServer.daemon_threads = True
            self.m_pServerThread.start()

            globals.system_log.info("[CTSRS]->StartServer()")

        except Exception, e:
            globals.system_log.info("[CTSRS]->StartServer() -> Exception: " + str(e))
            return False

        return True


    #----------------------------------------------------------

    def StopServer(self):
        globals.system_log.info("[CTSRS]->StopServer()")

    #----------------------------------------------------------
4

2 に答える 2

4

もちろん、リモート リクエストには応答しません。「localhost」はまさに「ローカル ホスト」を意味します。代わりに外部インターフェイスにバインドするか、汎用の「キャッチオール」インターフェイスにバインドする必要があります。

すべてのインターフェースにバインドするには、eg を使用します。

self.m_pServer = CTSRSThreadedTCPServer(('', 2304), CTSRSThreadedTCPRequestHandler)

アドレスとして空の文字列を使用すると、サーバーはすべてのインターフェイスでリッスンします。

于 2012-09-02T07:40:08.200 に答える
1

「127.0.0.1:2304」でリッスンしてみてください:

self.m_pServer = CTSRSThreadedTCPServer(("127.0.0.1", 2304), CTSRSThreadedTCPRequestHandler)

于 2012-09-02T07:33:40.497 に答える