回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我的python socket服务器监听,然后连接到一个客户端,该客户端将从用户发送不确定数量的字符串。然后,客户端可能会关闭或断开与服务器的连接。</p>
<p>这会导致错误。</p>
<p>[错误号10053]主机中的软件中止了已建立的连接。
或
[Errno 10054]远程主机强制关闭了现有连接</p>
<p>如何处理此事件,以便关闭连接并重新启动侦听重新连接的服务器?</p>
<p>Python服务器示例:</p>
<pre><code># Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 7001 # Arbitrary non-privileged port
s = None
def startListening():
print "starting to listen"
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.bind(sa)
s.listen(1)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
data = conn.recv(1024)
if not data:
break
print data
message = ""
while not "quit" in message:
message = raw_input('Say Something : ')
conn.sendall(message)
#conn.send("I got that, over!")
conn.close()
print "connection closed"
while 1:
startListening()
</code></pre>
<p>python客户端示例:</p>
<pre><code># Echo client program
import socket
import sys
HOST = 'localhost' # The remote host
PORT = 7001 # The same port as used by the server
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
s = socket.socket(af, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.connect(sa)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
s.sendall("Please send me some strings")
data = ""
while ("quit" not in data):
data = s.recv(1024)
print 'Received', repr(data)
s.close()
</code></pre>
<p>要重现此错误,请在一个命令窗口中运行服务器,在另一个命令窗口中运行客户端,然后关闭客户端窗口。</p>