【问题标题】:Send/receive infinite loop with SocketServer - Python - ConnectionAbortedError使用 SocketServer 发送/接收无限循环 - Python - ConnectionAbortedError
【发布时间】:2012-12-21 11:44:18
【问题描述】:

我正在尝试使用 socketserver 创建一个简单的服务器,以通过 TCP 将图像发送到客户端。 首先,我向客户端发送一个目录,然后它响应一个请求。

在我的服务器的句柄中,我有这个循环:

class MainHandler(socketserver.BaseRequestHandler):
def handle(self):

        while 1:
            try:
            # Sending the catalogue
                # Using my methods to get my catalogue with a HTTP header
            response = self.server.genHTTPRequest(self.server.init.catalogue)
            self.request.sendall(response.encode())

            # Response of the client
            self.data = self.request.recv(1024).decode()
            if self.data:
                print("Data received : {}".format(self.data))

        except:
            print("transmission error")
            break;

我主要使用这一行来创建我的服务器(它在另一个文件中):

mainServer = MainServer.MainServer((init.adresse, int(init.port)), MainServer.MainHandler)

当我启动这个程序时,客户端连接成功并接收到目录,但它只发回一些数据,程序跳转到 try/catch 的异常中。没有 try/catch,我得到了这个错误:

self.data = self.request.recv(1024).decode()
ConnectionAbortedError: [WinError 10053] An established connection was aborted by the software in your host machine

我不明白是什么问题,可能是同步丢失或者我需要使用线程?

感谢您的帮助

(我使用的是python 3.3)

【问题讨论】:

  • 我认为正在重置连接。尝试使用线共享线路(环回)。您也可以尝试禁用防火墙或防病毒软件。
  • 感谢您的回复,我已经解决了这个问题。这是因为客户端发送了错误的信息,recv有问题,客户端断开了连接。顺便说一句,我决定在这个项目中使用 SocketServer。

标签: python client-server handle socketserver


【解决方案1】:

问题可能是因为sendall(response.encode()) 而这个self.request.recv(1024).decode() 已经在同一个套接字中完成,它可能导致ConnectionAbortedError

在将其他数据放入套接字之前,您需要从套接字中读取所有数据。就像刷新数据一样。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多