1


0

optimiser les performances dans les sockets java

Mon application utilise des sockets et des threads pour envoyer des données en temps réel qui sont reçues aux clients qui s’y connectent. Pour ce faire, les étapes sont les suivantes:

  • Se connecte au serveur de données, puis attend les clients

  • Lancer un fil de discussion pour discuter des données entrantes, les formater et les envoyer aux clients, le cas échéant.

  • Lorsqu’un client se connecte, il lui ouvre un thread à travers lequel les données sera envoyé.

  • Enfin, utilisez un autre fil pour tester que vous recevez et envoyez données, sinon il est reconnecté à la source.

Les données reçues de la source sont stockées dans un tableau en attente d’être traitées par le thread. Dans chaque thread client, les données reçues sont également stockées dans un tableau à envoyer. Le but de ceci est qu’aucun bourrage dans la réception ou l’envoi de données. les données sont retardées de 10 secondes ou plus pour atteindre les clients

Que puis-je faire pour optimiser les performances? Cela fonctionne sur un serveur Windows, pouvez-vous recommander un profileur?

Merci beaucoup pour votre aide.

EDIT: Les données sont des chaînes de longueur variable. Une partie du code est: // crée un socket source dans la classe implémente Runnable puis attend le client

Socket entrada = new Socket(servidor,Integer.parseInt(puerto));
InputStream sIn = entrada.getInputStream();
        while (!error) {
          try {
              s = salida.accept();
              clientes.add(new ClientThread(s));
// run
while (((c = sIn.read()) != -1) && ((clientes.size() > 0))) {
if (c != 13 && c != 10) {
cad += (char) c;
}
if (c == 13) received[i] = cad

// In SendThread, run
// format received[i] and send result
for (i=0; i < clientes.size(); i++) {
  clientes.get(i).SendData(result);
}


// In ClientThread:
OutputString s1out = socket.getOutputStream();
// SendData
sending[i] = result;
// run
if cad forsending
              for (int j = 0;j

Merci.

1 Answer


0


Selon la quantité de données que vous envoyez, cela peut être la façon dont vous gérez les flux.

c = sIn.read () lit seulement quelques octets à la fois. Essayez de l’envelopper avec un BufferedReader et en utilisant readLine (). BufferedReader lira quelques ko à la fois, ce qui est beaucoup plus efficace. readLine () divisera également les entrées en lignes pour vous, ce qui simplifiera quelque peu le code.

Sur la connexion client, PrintWriter peut vous aider à sortir des lignes entières en une seule fois.