Python套接字 - 保持套接字活着吗?

时间:2011-02-24 21:50:16

标签: python sockets tcp client

我在使用Python中的套接字时遇到了一些麻烦。每当有人连接它工作正常但如果他们断开连接服务器程序关闭。我希望服务器程序在客户端关闭后保持打开状态。我正在使用while循环来保持连接活动,但是一旦客户端关闭连接,服务器就会关闭它的连接。

这是客户:

import socket, sys
conn = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = sys.argv[1]
port = int(sys.argv[2])
conn.connect((host, port))

print("Connected to host " + sys.argv[1])
td = 1
while td == 1:
   msg = raw_input('MSG:  ')

这是服务器:

import socket, sys

socket.setdefaulttimeout(150)
host = ''               
port = 50005
socksize = 1024

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
print("Server started on port: %s" % port)
s.listen(1)
print("Now listening...\n")
conn, addr = s.accept()

while True:
    print 'New connection from %s:%d' % (addr[0], addr[1])
    data = conn.recv(socksize)
    if not data:
        break
    elif data == 'killsrv':
        conn.close()
        sys.exit()
    else:
       print(data)

2 个答案:

答案 0 :(得分:5)

如果客户端关闭连接,您希望它关闭套接字。

这里似乎有一点脱节,我会试着详细说明。当你创建一个套接字,绑定和监听时,你已经为其他人建立了一扇敞开的大门,并与你建立联系。

客户端连接到您后,您使用accept()调用接受连接并获取一个新套接字(conn),该套接字将返回给您与客户端进行交互。您的原始侦听套接字仍处于活动状态,您仍然可以使用它来接受更多新连接。

查看代码,您可能希望执行以下操作:

while True:
    print("Now listening...\n")
    conn, addr = s.accept()

    print 'New connection from %s:%d' % (addr[0], addr[1])
    data = conn.recv(socksize)
    if not data:
        break
    elif data == 'killsrv':
        conn.close()
        sys.exit()
    else:
        print(data)

请注意,这只是一个起点,正如其他人所建议的那样,您可能希望使用select()以及分离进程或生成线程来为每个客户端提供服务。

答案 1 :(得分:2)

您的代码只接受单个连接 - 该循环仅处理第一个接受的连接,并在丢失后立即终止。这是您的服务器存在的方式:

data = conn.recv(socksize)
if not data:
    break

您需要做的是接受多个连接,同时处理其自身循环中的每个连接。请注意,它不必是每个套接字的真实循环,您可以使用基于select的方法来查询哪个套接字具有与之关联的事件(数据可用,连接丢失等)然后只处理那些套接字,所有套接字都在同一个循环中。

您还可以使用多线程/多进程方法,在其自己的线程或进程中处理每个客户端 - 我猜您在玩游戏时不会遇到扩展问题。

请参阅:

http://docs.python.org/library/select.html

http://docs.python.org/library/multiprocessing.html