Python 套接字 - 如何保持套接字连接?
我在用Python做网络编程的时候遇到了一点问题。每当有人连接上来时,一切都运行得很好,但如果他们断开连接,服务器程序就会关闭。我希望服务器程序在客户端关闭后仍然保持打开状态。我使用了一个一直循环的方式来保持连接,但一旦客户端断开了连接,服务器就会关闭它的连接。
这是客户端的代码:
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 个回答
3
你的代码目前只能处理一个连接,也就是说,它只处理第一个连接,之后就结束了。这就是你服务器存在的问题:
data = conn.recv(socksize)
if not data:
break
你需要做的是接受多个连接,并且为每个连接处理一个独立的循环。需要注意的是,每个连接不一定要有一个真正的循环,你可以使用一种叫做 select
的方法来检查哪些连接有事件发生(比如有数据可读、连接断开等),然后只处理那些有事件的连接,所有这些都可以在同一个循环中完成。
你也可以使用多线程或多进程的方法,每个客户端在自己的线程或进程中处理——我想在你尝试的时候不会遇到扩展性的问题。
参考链接:
10
如果一个客户端关闭了连接,你希望它也能关闭对应的套接字。
这里似乎有点不太清楚的地方,我来详细解释一下。当你创建一个套接字、绑定它并开始监听时,其实就是在给别人开了一扇门,让他们可以来和你建立连接。
一旦有客户端连接到你这里,你就可以使用 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()
,并结合进程分叉或线程创建来服务每个客户端。