[Socket] accélerer le débit
bonjour,
j'ouvre un port puis j'envoie un tableau sur ce port. Tout se passe bien je reçois exactement ce que je veux. Le problème est que la durée d'envoi des données est trop longue. Elle est de 300ms. On m'impose d'envoyer ces données en moins de 30ms.
Comment je peux accélérer le débit ? J'utilise un DataOuptuStream pour envoyer mon tableau :
Voici mon code : (j'ai volontairement enlevé les try{}catch{})
Le code après la méthode accept dure 300ms.
Code:
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
|
socketServerSender=new ServerSocket(4000);
socketServerSender.setSoTimeout(2000);
socketSender=this.socketServerSender.accept();
out=socketSender.getOutputStream();
dos=new DataOutputStream(out);
dos.writeInt(255);
dos.flush();
out.flush();
int n, m, o;
int i, j, k;
n = tabInt.length; //9(objets)
m = tabInt[0].length; //50(lignes)
o = tabInt[0][0].length; //20(colonnes)
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
for (k=0;k<o;k++)
{
dos.writeInt(tabInt[i][j][k]);
}
}
}
dos.flush();
out.flush(); |
J'ai essayé de remplacer mon tableau 3D par un tableau 1D, même chose j'ai un temps d'envoi de 300ms environ.
[edit]
Petite précision :
ce code se trouve dans un thread. Est-ce que ça peut expliquer la lenteur d'exécution ?
[/edit]
[Socket] optimiser les paramètres de connexion
bonjour,
j'ouvre un port de cette manière :
Code:
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
| socketServerSender=new ServerSocket(4000);
socketServerSender.setSoTimeout(2000);
socketSender=this.socketServerSender.accept();
// envoi des données
out=socketSender.getOutputStream();
dos=new DataOutputStream(out);
dos.writeInt(255);
dos.flush();
out.flush();
int n, m, o;
int i, j, k;
n = tabInt.length; //9(objets)
m = tabInt[0].length; //50(lignes)
o = tabInt[0][0].length; //20(colonnes)
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
for (k=0;k<o;k++)
{
dos.writeInt(tabInt[i][j][k]);
}
}
}
dos.flush();
out.flush();
//.... etc. |
Mon souci est que le débit est un peu lent : 300ms pour tout envoyer. Je voudrais envoyer les données en 30ms. De plus la méthode accept étant bloquante, je suis obligé de placer ce code dans un thread.
Les 300ms sont mesurés sur le poste client : le programme client ouvre le port, reçoit les données, puis ferme le port.
Mais visiblement un DataOuputStream n'est pas l'idéal pour ça il faudrait que j'utilise l'API nio plutôt que io.
A priori il faudrait que je passe par un SocketChannel pour envoyer mes données plus rapidement. Du coup je me demande :
- est-ce que je dois le configurer comme bloquant ou non bloquant ? Sur ce point je n'ai pas très bien compris la différence entre bloquant et non bloquant.
- est-ce je peux améliorer le débit en modifiant les paramètres de connexion de mon socket ? Je pensais à la méthode setTrafficClass et fermer le flux d'entrée (shutdownInput) car par ce port je ne reçois aucune donnée.