首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python套接字如何处理客户端意外关闭

Python套接字如何处理客户端意外关闭
EN

Stack Overflow用户
提问于 2013-06-04 18:05:06
回答 3查看 27K关注 0票数 2

我的python套接字服务器监听,然后连接到一个客户端,然后该客户端将从用户发送不确定数量的字符串。然后,客户端可能会关闭或断开与服务器的连接。

这会导致错误。

Errno 10053已建立的连接被主机中的软件中止。或Errno 10054现有连接被远程主机强制关闭

如何处理此事件,以便关闭连接并重新启动服务器以侦听重新连接?

Python服务器示例:

代码语言:javascript
复制
# 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()

python客户端示例:

代码语言:javascript
复制
# 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()

要重现此错误,请在一个命令窗口中运行服务器,在第二个命令窗口中运行客户端,然后关闭客户端窗口。

EN

回答 3

Stack Overflow用户

发布于 2013-06-04 20:27:36

在服务器脚本中的data send和data recv周围添加try: except:可以缓解这个问题:

代码语言:javascript
复制
# 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:
        try: 
            data = conn.recv(1024)
        except:
            print "cannot recieve data"
            break
        if not data: 
            break
        print data
        message = ""
        while not "quit" in message:
            message = raw_input('Say Something : ')
            try: 
                conn.sendall(message)
            except Exception as exc:
                #print exc # or something.
                print "message could not be sent"
                break
        #conn.send("I got that, over!")

    conn.close()
    print "connection closed"

while 1:
    startListening()
票数 1
EN

Stack Overflow用户

发布于 2013-06-04 18:07:56

只需关闭连接的一端,并准备好再次接受新连接。

处理此问题的最佳方法是将服务器套接字的创建和接受/读/写循环分开:

代码语言:javascript
复制
create_server_socket()
while True:
    accept_new_connection();
    try:
        read_request();
        write_response()
    finally:
        close_connection()
票数 0
EN

Stack Overflow用户

发布于 2013-06-04 20:17:16

我认为当客户端意外关闭时,根据SIGPIPE,您应该处理信号

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16915023

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档