我在使用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)
答案 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
的方法来查询哪个套接字具有与之关联的事件(数据可用,连接丢失等)然后只处理那些套接字,所有套接字都在同一个循环中。
您还可以使用多线程/多进程方法,在其自己的线程或进程中处理每个客户端 - 我猜您在玩游戏时不会遇到扩展问题。
请参阅: