Zdravim.

Objevil jsem takove zajimave chovani socketu v Jave na Windows ve spojitosti s Apache.

    public static void main(String[] args) throws Exception {
        int i = 0;
        while (true) {
            Socket sock = openSocket();
            OutputStream os = sock.getOutputStream();
            os.write("GET / HTTP/1.1\n\n".getBytes());
            InputStream is = sock.getInputStream();
            while (is.read() != -1) {
                // void
            }
            is.close();
            os.close();
            sock.close();
            System.out.println("" + i++);
        }
    }


    private static Socket openSocket() throws Exception {
        InetAddress address = InetAddress.getByName("localhost");
        Socket socket = new Socket(address, 80);
        socket.setReuseAddress(true);
        socket.setTcpNoDelay(true);
        socket.setKeepAlive(true);
        socket.setSoLinger(true, 0);
        return socket;
    }

Takto se mi na mem stroji (Windows XP Professional, Apache 2.0.59) podarilo docilit otevreni 24362 spojeni. Po zakomentovani radku uzavirajicich spojeni jich bylo 27596 a po zakomentovani radku s nastavenim SO_LINGER (ale s uzaviranim) jich bylo 29018. To jsou cisla, ktera me prekvapila, protoze SO_LINGER s timeoutem 0 by melo zpusobit, ze pri zavreni socketu dojde k okamzitemu TCP resetu spojeni a to by pak melo byt okamzite k pouziti.

Nejde pouze o tento test, problem se vyskytnul i pri realnem nasazeni.

Nesetkal se s tim jeste nekdo? Diky.

S pozdravem,

Stepan Roh

Odpovedet emailem