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