0

サーバーリスナーを作成しようとしています。クライアントからのデータを待機し、データの性質に応じて設定アクションを実行します。しかし、現在、最初のデータストリームを受信した後、それはリソースを大量に消費し、メモリ使用量が急増し、CPU使用率がシングルコアを最大限に活用しています。

1-どうすればこれを修正できますか?本当に小さなプログラムであることがわかるように、リソースを大量に消費せずにリッスンさせるにはどうすればよいですか。

2-これらのデータストリームを送信するクライアント自体は、1回実行されます。起動し、サーバーに接続し、データを送信して終了します。サーバーがまだ「オン」のときに、クライアントの実行を再試行すると、サーバーはデータを受信しません。

サーバーコード:

package mediaserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
    ServerSocket ss;
    Socket s;
    BufferedReader br;

    public Main() throws IOException{
        ss = new ServerSocket(1111);
        s = ss.accept();
        br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        new Thread(new runner()).start();
    }

    class runner implements Runnable{

        public void run(){
          while(true){
            try {
                String n = br.readLine();
                System.out.println(n);
            } catch (IOException ex) {
            }
             finally{
                 try {
                       s.close();
                       ss.close();
                    } catch (IOException ex) {
                    }

             }
          }
        }
    }

    public static void main(String[] args) throws IOException {
        new Main();
    }

}

クライアントコード

package mediaserver;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class test {
public static void main(String [] args) throws UnknownHostException, IOException, InterruptedException{
    Socket s = new Socket("127.0.0.1", 1111);
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    bw.write("");
    bw.newLine();
    bw.flush();

    }
}
4

2 に答える 2

0

ss.accept() は 1 回しか呼び出されないため、サーバーが追加の実行でデータを取得することはありません。これをループでラップする必要があります。

s = ss.accept();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
new Thread(new runner()).start();
于 2012-10-29T14:10:44.193 に答える
0

次のコードは無限ループです。

while(true) {
    try {
        String n = br.readLine();
        System.out.println(n);
    } catch (IOException ex) {
        throw new RuntimeException(ex);
    }
    finally {
        ...
    }
}

クライアントが切断されると、BufferedReaderインスタンスはファイルの終わりに遭遇しreadLinenull. nullその後、ループは無限に印刷を続けます。

修正して、次を確認してくださいnull

while(true) {
    try {
        String n = br.readLine();
        if (n == null)
            break;
        System.out.println(n);
    } catch (IOException ex) {
    }
    finally {
        ...
    }
}
于 2012-10-29T06:49:37.347 に答える