0

以下は、ソケット サーバーを実装し、完全に機能する receive メソッドです。

    private void Receive(){ 
    log.info("Server started - waiting for the clients.");
     try {
         Boolean end = false;
         ServerSocket ss = new ServerSocket(12345);
         while(!end){
                 //Server is waiting for client here, if needed
                 Socket s = ss.accept();
                 BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
                 PrintWriter output = new PrintWriter(s.getOutputStream(),true); //Autoflush
                 String st = input.readLine();

                JSONObject jsonObj;
                try {
                    jsonObj = new JSONObject(st);
                    long id = jsonObj.optLong("DeviceID", count.addAndGet(1) );
                    String name = jsonObj.toString();
                    table.put(id, name);
                } catch (JSONException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                 etResult.setText(st);
                 Log.d("Tcp Example", "From client: "+st);
                 output.println("Response from Sever: Connectivity ok");
                 s.close();
                 if (st != null ){ end = true; }
         }
    ss.close();


    } catch (UnknownHostException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
    } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
    }   
}

唯一の問題は、ボタンを押してそのメソッドを呼び出すと、ソケットがリッスンを開始し、クライアント メッセージを待機することです。それが起こらない間、アプリはフリーズしたままで、他のボタンを押そうとすると、アプリがクラッシュする可能性があります。

画面全体をロックせずに、ソケットを「バックグラウンド」でリッスンしたままにする方法についてのヒントはありますか?

ありがとうございました

4

1 に答える 1

1

スレッドまたは AsyncTask を作成し、その上ですべてのソケット関数を実行します。めったにしないことで、それを起動して結果を処理したい場合は、AsyncTask を使用します。常に実行する必要があり、複数のワーカーを同時に実行したり、複数のワーカーをキューに入れたりしたくない場合は、スレッドを使用します。

于 2013-03-05T21:28:21.400 に答える