async def _run_socket(self):
        """
        Task that runs this client.
        """
        try:
            while True:
                message = await ZMQUtils.recv(self._socket)
                msg_class = message.__msgtype__
                if msg_class in self._handlers_registered:
                    # If a handler is registered, give the message to it
                    self._loop.create_task(self._handlers_registered[msg_class](message))
                elif msg_class in self._transactions:
                    # If there are transaction associated, check if the key is ok
                    _1, get_key, coroutine_recv, _2, responsible = self._msgs_registered[msg_class]
                    key = get_key(message)
                    if key in self._transactions[msg_class]:
                        # key exists; call all the coroutines
                        for args, kwargs in self._transactions[msg_class][key]:
                            self._loop.create_task(coroutine_recv(message, *args, **kwargs))
                        # remove all transaction parts
                        for key2 in responsible:
                            del self._transactions[key2][key]
                    else:
                        # key does not exist
                        raise Exception("Received message %s for an unknown transaction %s", msg_class, key)
                else:
                    raise Exception("Received unknown message %s", msg_class)
        except asyncio.CancelledError:
            return
        except KeyboardInterrupt:
            return
Task that runs this client.