1

無限ループを実行し、ポート 5000 からの情報を処理する Python 2.7 で記述されたサーバーがあります。サーバーを再起動せずにこの接続ポートを変更することは可能ですか? 例: サーバーはポート 5000 で実行され、「change_port」オプションを受け取ります。サーバー モジュールは、ポート 5000 でのリッスンを停止して、ポート 7000 でのリッスンを開始する必要があります。そのようなソケットを操作できるかどうかはわかりません...ありがとう

4

2 に答える 2

1

ソケットをアドレス (インターフェース、ポート) にバインドすると、それを変更することはできません。ただし、新しいソケット (または必要に応じて多数) を作成し、それをアドレス (インターフェース、ポート) にバインドすることができます。コードは、使用しているトランスポート層プロトコルによって異なります。

TCP:

# 1) Create first socket
s1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s1.bind(('0.0.0.0',5000))
# 2) Create second socket
s2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s2.bind(('0.0.0.0',7000))

# 3) Wait for a connection on the first socket
s1.listen(5)
sc, address = s1.accept()

# 4) Once a connection has been established...
# send, recv, process data
# until you need the next socket

# 5) Open connection on second socket
s2.listen(1)
sc2, address2 = s2.accept()
# now it probably a good time to tell the client (via s1) that s2 is ready
# client connects to s2

どうぞ

UDP (ほぼ同じ):

s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s1.bind(('0.0.0.0',5000))
s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s2.bind(('0.0.0.0',7000))
data, addr = s1.recvfrom(256)
s1.sendto("s2 ready",addr)
data2, addr2 = s2.recvfrom(256)

単純化されていますが、これですべてです。s1 からのクライアントのアドレスが s2 に接続しているクライアントと同じであることを確認することを検討してください。

于 2013-07-26T04:51:34.357 に答える
1

いいえ、既にバインドされている場合は socket.bind() メソッドを実行できないようです。ただし、Asyncore モジュールで使用できるソリューションがあります。

ここに私のサーバーがあります:

import asyncore
import socket

class EchoHandler(asyncore.dispatcher_with_send):

    def handle_read(self):
        data = self.recv(8192)
        if data:
            print "Recieved Data: ", data, ". This server address:", self.getsockname()

class EchoServer(asyncore.dispatcher):

    def __init__(self, host, port):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.set_reuse_addr()
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        pair = self.accept()
        if pair is not None:
            sock, addr = pair
            print 'Incoming connection from %s' % repr(addr)
            handler = EchoHandler(sock)

server = EchoServer('localhost', 56787)
server = EchoServer('localhost', 56788)
asyncore.loop()

ここに私のクライアントがあります:

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 56787))
data = ""
while data.upper() != "Q":
 data = raw_input("Enter something to send to the server")
 s.send(data)
s.close()


import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 56788))
data = ""
while data.upper() != "Q":
 data = raw_input("Enter something to send to the server")
 s.send(data)
s.close()

これはうまく機能し、Python は両方のポートを処理しました。また、ポートごとに個別のサーバー クラスを定義できる必要があります。

于 2013-07-26T05:01:21.737 に答える