2012-11-26 128 views
2

目前我有一个只能接受一个连接的套接字服务器。任何第二个连接,它只是挂起,不做任何事情。如何让套接字接受多个连接?

服务器可以从一个客户端获取消息发送。我现在只有服务器发回确认信息。

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 = ''; 

回答

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) 

此外,即使修复此问题后,服务器一次只能处理一个连接。如果您希望一次为多个客户端提供服务,则需要使用select.select或为每个客户端连接分离线程。

另外,Python在语句结束时不需要分号。

+0

我会看看这个选择模块。我知道Python不需要“;”,我只是使用它,因为它可以帮助我更容易地阅读代码。 – iCodeLikeImDrunk

+0

好的,在看到一些例子后,我现在就来了。基本上服务器将有一个读/写套接字列表的列表,然后相应地服务它们。那是对的吗? – iCodeLikeImDrunk

+1

是的。同时查看Python附带的'SocketServer'模块。您可以轻松地编写在线程中为每个客户端提供服务的代码,并且该模块的源代码也非常易读。 –