def send(self, byte_array): if not self._s: raise error.ConnectionError("Not connected.") try: ret = self._s.send(byte_array) except socket.error: raise error.ConnectionError("Socket connection broken.") if ret == 0: raise error.ConnectionError("Socket connection broken.")
def connect(self): if self._s: raise error.ConnectionError("Already connected.") self._s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self._s.connect((self.host, self.port)) self._s.setblocking(0) except socket.error: self._s = None raise error.ConnectionError("Connection refused.")
def recv(self): if not self._s: raise error.ConnectionError("Not connected.") n = 1 while n != 0: try: packet = self._read_packet(n) except socket.error: raise error.ConnectionError("Connection reset by peer.") if not packet: raise error.ConnectionError( "The remote end hung up unexpectedly.") n = yield packet # must test for None as 0 is termination n = n if n is not None else 1
def disconnect(self): if not self._s: raise error.ConnectionError("Not connected.") try: self._s.shutdown(0) except socket.error: # TODO: Logging pass self._s.close() self._s = None
def _read_packet(self, n): packet = None delay = 50.0 / 1000.0 mustend = time.time() + self.timeout try_again = True while try_again: try_again = False try: packet = self._s.recv(n) except socket.error as ex: if ex.errno != 11: raise ex try_again = True if time.time() > mustend: raise error.ConnectionError("Connection timeout.") time.sleep(delay) if delay < 0.4: delay *= 2 return packet
def send(self, request): """Sends a request to the server. :param request: Request to be sent to the associated Infinispan server. :return: Response from the server. """ # encode request req_id = self._get_next_id() request.header.id = req_id encoder = self._encoder_f.get() encoded_request = encoder.encode(request) # send request and wait until received the correct response with self.conn.context() as ctx: log.debug("Sending request id=%r encoded as %r to %s", req_id, encoded_request, ctx) ctx.send(encoded_request) # receive and decode decoder = self._decoder_f.get() with ctx.lock: data = ctx.recv() response = decoder.decode(data) log.debug("Received response id=%r from %s", response.header.id, ctx) self._cache_resp(response) mustend = time.time() + self.timeout while req_id not in self._responses: # if there is an error response in the cache, raise an error err_resp = self._pop_resp(0) if err_resp: log.error("Received server error without id, message: %s", err_resp.error_message) raise error.ServerError(err_resp.error_message, err_resp) time.sleep(0.005) if time.time() > mustend: log.error("Timeout waiting on response with id=%r", req_id) raise error.ConnectionError("Timeout.") return self._pop_resp(req_id)