2

現在、1つの接続しか受け入れられないソケットサーバーがあります。2番目の接続では、ハングし、何もしません。

サーバーは、1つのクライアントからメッセージを送信できます。今のところ、確認を返送するサーバーがあります。

server.py:

import socket, sys

# some vars
HOST = "localhost";
PORT = 4242;

# create the socket
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM);

# bind the socket to port
server_addr = (HOST, PORT);
print >>sys.stderr, "starting server %s on port %s" % (HOST, PORT);
soc.bind(server_addr);

# check for connections
soc.listen(1);

while True:
    # wait for a connection
    connection, client_address = soc.accept();
    try:
        # since just test
        # just send back whatever server receives
        while True:
            data = connection.recv(16);
            if data:
                connection.sendall(str(client_address[1]) + " said " + data);
    finally:
        connection.close();

client.py:

import socket, sys, thread

# some vars
HOST = "localhost";
PORT = 4242;

# create the socket
soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM);

# connect to server/port
server_addr = (HOST, PORT);
print >>sys.stderr, "connecting to %s on port %s" % (HOST, PORT);
soc.connect(server_addr);

# try to send data over
while True:
    try:
        # send the message
        msg = raw_input("Message: ");
        soc.sendall(msg);

        # check if there is response
        amt_recd = 0;
        amt_expd = len(msg);

        while amt_recd < amt_expd:
            data = soc.recv(16);
            amt_recd += len(data);
            print >>sys.stderr, data, "\n";
    finally:
        msg = '';
4

1 に答える 1

3

サーバーには、この無限ループからの終了条件はありません。

while True:
    data = connection.recv(16)
    if data:
        connection.sendall(str(client_address[1]) + " said " + data)

クライアントを閉じると、接続データは空になりますが、ループは継続します。修正するには:

while True:
    data = connection.recv(16)
    if not data:
        break
    connection.sendall(str(client_address[1]) + " said " + data)

また、これを修正した後でも、サーバーは一度に1つの接続しか処理できません。一度に複数のクライアントにサービスを提供したい場合は、select.selectクライアント接続ごとにスレッドを使用またはスピンオフする必要があります。

余談ですが、Pythonではステートメントの最後にセミコロンは必要ありません。

于 2012-11-26T03:29:35.767 に答える