1

私のアプリケーションは、ソケットとスレッドを使用して、接続しているクライアントに受信中のリアルタイム データを送信します。そのための手順は次のとおりです。

  • データ サーバーに接続し、クライアントを待機します。
  • 受信データについて話し合うスレッドを立ち上げ、データをフォーマットして、顧客に送信します (存在する場合)。
  • クライアントが接続すると、データが送信されるスレッドが開かれます。
  • 最後に、別のスレッドを使用してデータの送受信をテストします。それ以外の場合は、ソースに再接続されます。

ソースから受信したデータは配列に格納され、スレッドによる処理を待ちます。各クライアント スレッドでは、受信したデータも配列に格納されて送信されます。これの目的は、データの送受信でジャムが発生しないようにすることです。データが顧客に到達するまでに 10 秒以上遅れる

パフォーマンスを最適化するにはどうすればよいですか? これは Windows サーバーで実行されています。プロファイラーをお勧めできますか?

ご助力ありがとうございます。

編集: データは可変長の文字列です。コードの一部は次のとおりです。 // クラスでソース ソケットを作成し、Runnable を実装してクライアントを待機します。

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<res.length();j++){
                try {
                    s1out.write((int)res.charAt(j));          
                  } catch (Exception e) {
                  }
              }

ありがとう。

4

1 に答える 1

0

送信するデータの量によっては、ストリームの処理方法が異なる場合があります。

c = sIn.read()一度に数バイトしか読み取れません。BufferedReaderでラップして、を使用してみてくださいreadLine()。BufferedReader は一度に数 kb を読み取るため、はるかに効率的です。readLine()また、入力を行に分割することで、コードがいくらか簡素化されます。

クライアント接続では、PrintWriter を使用すると、行全体を一度に出力できます。

于 2012-05-30T12:19:18.413 に答える