public synchronized void connect(HostInfo host, long connectionVersion) throws Throwable {
    try {
      log.debug("Trying to connect");
      this.setConnectionVersion(connectionVersion);
      this.hostInfo = host;
      client = new Socket();

      client.setReceiveBufferSize(256 * 1024);
      client.setReceiveBufferSize(256 * 1024);
      client.setSoLinger(true, 2);

      client.connect(new InetSocketAddress(host.getHostname(), host.getPort()), 15 * 1000);
      rawOutput = new DataOutputStream(getSocket().getOutputStream());
      rawInput = new DataInputStream(getSocket().getInputStream());
      socketAddress = getSocket().getRemoteSocketAddress();
      socketAddressLiteral = socketAddress.toString();
      log.debug("Connection established: " + socketAddressLiteral);
      closed = false;
    } catch (Throwable t) {
      throw new RuntimeException(t);
    }
  }