Bonjour,
j'ai codé un proxy en java et quand je me connecte dessus le débit chute de moitié par rapport au direct.
globalement voici ce que je fait:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 
	public long doCmd(String cmd,PrintStream outputStream ){
 
		try{
			out.println(cmd);
		}
		catch(Exception e){
			log.println(e, "[doCmd] IOException sending cmd to the server: "+cmd);
			// TODO robustness
			// check the status of the output connection
			// maybe try to reconnect  few times and try again
			// otherwise warn the client and finish this cmd
		}
 
		long dataSize=0;
		boolean firstLine=true;
		boolean finish=false;
		do{
			try{
				lineIn=in.readLine();
			}
			catch(IOException e){
				log.println(e, "[doCmd] IOException getting answer from cmd:"+cmd);
			}
 
			// If the connection has been closed
			if ( !isConnected ){
				finish=true;
			}
			else{
				// if the User socket is not closed
				if (outputStream!=null){
					outputStream.println(lineIn+"\r");
					if (lineIn!=null)
						dataSize+=lineIn.length();
				}
				else{
					finish=true;
				}
			}
 
			if (firstLine){
 
				// .. Some checking...
 
				firstLine=false;
			}
		}while ( (!finish) && (lineIn!=null) && (!".".equals(lineIn)) );
 
		return dataSize;
	}
Qu'est ce qui pourrait induire une telle chute de débit?
L'utilisation de readLine au lieu d'un buffer de taille constante?
Le protocole que j'utilise envois de lignes texte et pour signaler la fin du message juste un ligne avec un point.
C'est pour cela que j'utilisait readLine.


Voici comment sont définis mes input/output stream:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
in=new BufferedReader(new InputStreamReader(sock.getInputStream(),charsetEncoding));
out=new PrintStream(sock.getOutputStream(),true,charsetEncoding);
 
static String charsetEncoding = "ISO-8859-15";
Est ce du à l'encodage des charactères?
Y a-t'il des classes plus performantes pour les streams?
Comment puis je lire sans passer par des charactères mais savoir que je suis en fin de message et donc que la dernière ligne est un point?

Edit:
je précise que la fonction est thread safe, juste les log en cas d'exception sont synchronisés.

les débits sont:
direct: 3000 ko/s
proxy: 1600 ko/s


J'ai changé mon output writer en:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
out= new PrintWriter(new OutputStreamWriter(sock.getOutputStream(), charsetEncoding), true );
le débit est un peu meilleur: 2000ko/s
mais quand même 1/3 de moins que le débit direct...

Des idées pour améliorer? Est ce que je gagnerai à lire des bytes (pas de charset) dans un buffer fixe et en cherchant manuellement les fins de lignes pour retourner la ligne courante tout en ayant le début de celle d'après?