Skip to content
Advertisement

Python http requests.exceptions.ConnectionError: (‘Connection aborted.’, RemoteDisconnected(‘Remote end closed connection without response’))

I’m writing a chat program. Each of my clients has an open get request to the server in a separate thread (and another thread for posting their own messages). I don’t want to have a lot of overhead. That is, clients don’t send get requests frequently to see if there have been any unseen messages. Instead, they always have exactly one open get request to get the new messages, and as soon as the server responded to them with new unseen messages, they immediately send another get request to the server to stay updated and so on. So on the client-side, I have something like this:

def coms():
   headers = {'data': myAut.strip()}
   resp = requests.get("http://localhost:8081/receive", headers=headers,timeout=1000000)
   print(resp.text)
   t = threading.Thread(target=coms, args=())
   t.start()

On the server-side, I have something like this:

def do_GET(self):

    if self.path == '/receive':
        auth=self.headers['data']
    
    #Using auth, find who has sent this message
        u=None
        for i in range(len(users)):
            print(users[i].aut,auth)
            if users[i].aut==auth:
                u=users[i]
                break


        t=threading.Thread(target=long_Poll,args=(u,self))
        t.start()

and

def long_Poll(client,con):

   while True:

       if len(client.unreadMessages) != 0:
           print("IM GONNA RESPOND")
           con.end_headers()
           con.wfile.write(bytes(client.unreadMessages, "utf8"))
           client.unreadMessages=[]
           break
   con.send_response(200)
   con.end_headers()

And the logic behind this is that the servers want to do the long-polling, that is, it keeps GET/receive requests open in another busy-waiting thread. When any client sends a message to the server via POST/message it just adds this new message to other clients unseenMessages and so once their thread is running, they come out of the while True: loop, and the server gives them the new messages. In other words, I want to hold client’s GET/receive open and not respond it as long as I want. This process might take so long time. Maybe the chatroom is idle and there is no messages for a long time. Right now the problem I have is that as soon as my client sends its first GET/receive message, it gets this error, even though I have set the timeout value in GET/receive request to be so much.

C:UserserfanDesktopwebclientvenvScriptspython.exe C:UserserfanDesktopwebclientClient.py
Hossein
Welcome to chatroom Hossein ! Have a nice time !
Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3connectionpool.py", line 677, in urlopen
    chunked=chunked,
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3connectionpool.py", line 426, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3connectionpool.py", line 421, in _make_request
    httplib_response = conn.getresponse()
  File "C:UserserfanAppDataLocalProgramsPythonPython37libhttpclient.py", line 1321, in getresponse
    response.begin()
  File "C:UserserfanAppDataLocalProgramsPythonPython37libhttpclient.py", line 296, in begin
    version, status, reason = self._read_status()
  File "C:UserserfanAppDataLocalProgramsPythonPython37libhttpclient.py", line 265, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
http.client.RemoteDisconnected: Remote end closed connection without response

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesrequestsadapters.py", line 449, in send
    timeout=timeout
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3connectionpool.py", line 727, in urlopen
    method, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3utilretry.py", line 410, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3packagessix.py", line 734, in reraise
    raise value.with_traceback(tb)
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3connectionpool.py", line 677, in urlopen
    chunked=chunked,
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3connectionpool.py", line 426, in _make_request
    six.raise_from(e, None)
  File "<string>", line 3, in raise_from
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesurllib3connectionpool.py", line 421, in _make_request
    httplib_response = conn.getresponse()
  File "C:UserserfanAppDataLocalProgramsPythonPython37libhttpclient.py", line 1321, in getresponse
    response.begin()
  File "C:UserserfanAppDataLocalProgramsPythonPython37libhttpclient.py", line 296, in begin
    version, status, reason = self._read_status()
  File "C:UserserfanAppDataLocalProgramsPythonPython37libhttpclient.py", line 265, in _read_status
    raise RemoteDisconnected("Remote end closed connection without"
urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:UserserfanAppDataLocalProgramsPythonPython37libthreading.py", line 917, in _bootstrap_inner
    self.run()
  File "C:UserserfanAppDataLocalProgramsPythonPython37libthreading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "C:UserserfanDesktopwebclientClient.py", line 13, in coms
    resp = requests.get("http://localhost:8081/receive", headers=headers,timeout=1000000)
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesrequestsapi.py", line 76, in get
    return request('get', url, params=params, **kwargs)
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesrequestsapi.py", line 61, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesrequestssessions.py", line 530, in request
    resp = self.send(prep, **send_kwargs)
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesrequestssessions.py", line 643, in send
    r = adapter.send(request, **kwargs)
  File "C:UserserfanDesktopwebclientvenvlibsite-packagesrequestsadapters.py", line 498, in send
    raise ConnectionError(err, request=request)
requests.exceptions.ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))

=========================================================================== UPDATE:

The strange part is whenever I edit the GET/receive module to this:

 def do_GET(self):
      while True:
         pass

everything works fine. But when I do :

def do_GET(self):
   t=threading.Thread(target=long_Poll,args=(self))
   t.start()

def long_Poll(con):

  client =None
  while True:
    pass

It gives the same error to the client!

I mean the problem is because I pass the self object to another function to respond? maybe it interrupts the connection? I remember having the same problem in Java socket programming where I would encounter to some bugs sometimes when I wanted to use a socket to communicate in two functions? However, here I only want to communicate in the long-polling function not anywhere else.

=======================================

update: I also put my server and client code here. For brevity, I post the paste.ubuntu links here.

Client:

https://paste.ubuntu.com/p/qJmRjYy4Y9/

Server:

https://paste.ubuntu.com/p/rVyHPs4Rjz/

First time a client types, he enters his name and after that he starts sending GET/receive requests. Client can then send his messages to other people by sending POST/message requests. Any time a user send a message to the server, the server finds him (by his auth) and updates all other clients unseenMessages so that whenever their long-polling thread continued, they’ll get the new messages and their clients also send another GET/receive message immediately.

Advertisement

Answer

I have found the answer. I was trying to have a multithreaded server using single thread syntax! I followed this thread for having a multithreaded HTTP server Multithreaded web server in python

User contributions licensed under: CC BY-SA
9 People found this is helpful
Advertisement