/** Internal method. Connect to searchd and exchange versions. */ private Socket _Connect() { if (_socket != null) return _socket; _connerror = false; Socket sock = null; try { sock = new Socket(); sock.setSoTimeout(_timeout); InetSocketAddress addr = new InetSocketAddress(_host, _port); sock.connect(addr, _timeout); DataInputStream sIn = new DataInputStream(sock.getInputStream()); int version = sIn.readInt(); if (version < 1) { sock.close(); _error = "expected searchd protocol version 1+, got version " + version; return null; } DataOutputStream sOut = new DataOutputStream(sock.getOutputStream()); sOut.writeInt(VER_MAJOR_PROTO); } catch (IOException e) { _error = "connection to " + _host + ":" + _port + " failed: " + e; _connerror = true; try { if (sock != null) sock.close(); } catch (IOException e1) { } return null; } return sock; }
/** Internal method. Connect to searchd, send request, get response as DataInputStream. */ private DataInputStream _DoRequest(int command, int version, ByteArrayOutputStream req) { /* connect */ Socket sock = _Connect(); if (sock == null) return null; /* send request */ byte[] reqBytes = req.toByteArray(); try { DataOutputStream sockDS = new DataOutputStream(sock.getOutputStream()); sockDS.writeShort(command); sockDS.writeShort(version); sockDS.writeInt(reqBytes.length); sockDS.write(reqBytes); } catch (Exception e) { _error = "network error: " + e; _connerror = true; return null; } /* get response */ byte[] response = _GetResponse(sock); if (response == null) return null; /* spawn that tampon */ return new DataInputStream(new ByteArrayInputStream(response)); }
/** Open persistent connection to searchd. */ public boolean Open() { if (_socket != null) { _error = "already connected"; return false; } Socket sock = _Connect(); if (sock == null) return false; // command, command version = 0, body length = 4, body = 1 try { DataOutputStream sOut = new DataOutputStream(sock.getOutputStream()); sOut.writeShort(SEARCHD_COMMAND_PERSIST); sOut.writeShort(0); sOut.writeInt(4); sOut.writeInt(1); } catch (IOException e) { _error = "network error: " + e; _connerror = true; } _socket = sock; return true; }