Bonjour,

J'ai un comportement que je trouve étrange sur les sockets. Quand j'utilise le OutputStream de la socket (directement ou via un PrintStream), j'ai une sorte de auto-flush où à chaque écriture dans un stream, un paquet est émis. Pour que ce soit plus clair, je donne un petit exemple :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.io.*;
import java.net.*;
import org.junit.Test;
 
public class SocketTest {
 
	@Test
	public void test() throws Exception {
		Socket socket = new Socket();
		socket.setSoTimeout(1000);
		socket.setTcpNoDelay(false);
		socket.connect(new InetSocketAddress("localhost", 8505));
 
		PrintStream out = new PrintStream(socket.getOutputStream(), false);
		out.print("Ceci");
		out.print(" ");
		out.print("est");
		out.print(" ");
		out.print("un");
		out.print(" ");
		out.print("test");
		out.print(".");
		out.println();
		out.flush();
 
		socket.close();
	}
 
}

Dans cet exemple, avec un sniffeur réseau (wireshark), je vois 9 paquets IP émis. Je précise que je suis sous linux debian squeeze, avec la jvm openJDK 1.6.0_18.

J'ai le même problème en virant le PrintStream et en utilisant que le OutputStream de la socket. De toute façon, le PrintStream est configuré sans autoflush (paramètre false du constructeur). Dès que j'écris dans la socket, un paquet part.

Je peux résoudre le problème en rajoutant un BufferedOutputStream de la sorte :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
PrintStream out = new PrintStream(new BufferedOutputStream(socket.getOutputStream()), false);
Mais cette solution ne me plait pas vraiment, c'est pas super optimisé je trouve de tout écrire dans un buffer puis tout recopier dans la socket. J'ai besoin d'envoyer des xml pouvant atteindre plusieurs Mo, et je les génère par des out.print().

Qu'en pensez-vous ? Il y a quelque chose que je fais mal, comportement normal, ou bug de la jvm d'openJDK ?