1

クライアントが1秒間に約10回文字列を送信する単純なサーバー(Javaアプリケーション)とクライアント(Androidアプリ)を実装しようとしています。サーバーがクライアントからのメッセージの受信を停止した後、すべてが 1 分間ほど正常に動作します。以下の関連コード。

ClientThread.java

public class ClientThread implements Runnable{
static Socket socket;
static String message = "";
InetAddress serverAddr;
BufferedOutputStream bos;

public ClientThread(String message){
    ClientThread.message = message;
}

@Override
public void run() {
    try{
        serverAddr = InetAddress.getByName(SERVER_IP);
        if(socket != null && socket.isConnected())socket.close();
        socket = new Socket(serverAddr, SERVER_PORT);
        bos = new BufferedOutputStream (socket.getOutputStream());
        OutputStreamWriter osw = new OutputStreamWriter(bos, "US-ASCII");
        osw.write(message);
        osw.flush();
        socket.shutdownOutput();
        socket.close();
    }catch (Exception e) {
    }
}
}

ServerThread.java

public class ServerThread extends Thread{
    private ServerSocket serverSocket;
    static String clientSentence;

   public ServerThread(int port) throws IOException, AWTException{
      serverSocket = new ServerSocket(port);
   }

   public void run() {
      while(true){
         try{
            Socket server = serverSocket.accept();
            BufferedReader d = new BufferedReader(new InputStreamReader(server.getInputStream()));
            clientSentence = d.readLine();
            System.out.println(clientSentence);
            server.close();
         }catch(IOException e){
            e.printStackTrace();
            break;
         }
      }
   }
}

ClientThread.java は、次を使用して 1 秒間に約 10 回呼び出されます。

Thread clientThread = new Thread(new ClientThread(message));
clientThread.start();

ServerThread.java は初期化され、以下を使用して開始されます。

t = new ServerThread(8888);
t.start();

少し実行した後にこれがフリーズする理由について何か考えはありますか? これを修正する唯一の方法は、サーバーを再起動することです。その後、1 分後に同じ問題が再び発生します。この問題の調査に多くの時間を費やしましたが、解決策を見つけることができませんでした。

編集: clientSentence = d.readLine(); でサーバーがフリーズすることがわかりました。部。理由はありますか?

4

2 に答える 2

1

毎秒 60 接続、1 分間実行: 毎分 3600 接続。

ソケットを閉じても、関連付けられているファイル記述子はすぐには解放されません。OS レイヤーでリソースが不足する可能性があります。

netstatサーバー側で実行して、アクティブな接続、保留中の接続、および閉じられた接続を確認してください。

この投稿は SU で読むことができます。

于 2013-03-16T17:40:52.763 に答える
0

スレッドが終了することはなく、新しいスレッドを作成し続けます。そのため、スレッドスペース、ソケット、FDなどの何かが不足します...

これはすべて間違っています。スレッドをループする新しいスレッドを作成する必要があります。両方ではありません。

また:

  1. メッセージごとに新しい接続ではなく、単一の接続を使用する必要があります。
  2. データに改行が含まれていない限り、行を読み取っていますが、送信する必要はありません。
于 2013-03-16T21:24:54.823 に答える