エミュレータサーバに接続された複数のエミュレータクライアント

私は複数のアンドロイドエミュレータクライアントをアンドロイドエミュレータサーバに接続したいと考えています。私はこの投稿のコードを使用しています。私は少しサーバーを変更しましたビット。このコードは、1つのクライアントだけが接続しようとしているときに効果的です。私は2つのクライアントをサーバーに接続しようとすると、2番目のクライアントのメッセージが届かないようです。

私はこの目標を達成するために何をする必要があるのだろうと思っていましたか?私は他のポートをリダイレクトする必要がありますか、コードには何かがありませんか?

logcatは次のことを何度も繰り返し報告し、ループの中で止まっています。最初のクライアントが起動すると、すぐにこのエラーが表示されます。

11-25 00:47:46.543: W/System.err(198):  at java.lang.Thread.run(Thread.java:1096)
11-25 00:47:46.543: W/System.err(198): java.net.BindException: The address is already in use
11-25 00:47:46.552: W/System.err(198):  at org.apache.harmony.luni.platform.OSNetworkSystem.socketBindImpl(Native Method)
11-25 00:47:46.552: W/System.err(198):  at org.apache.harmony.luni.platform.OSNetworkSystem.bind(OSNetworkSystem.java:107)
11-25 00:47:46.552: W/System.err(198):  at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:184)
11-25 00:47:46.552: W/System.err(198):  at java.net.ServerSocket.(ServerSocket.java:136)
11-25 00:47:46.552: W/System.err(198):  at java.net.ServerSocket.(ServerSocket.java:87)
11-25 00:47:46.552: W/System.err(198):  at school.cpe434.ClassAidServer.ClassAidServer4Activity$CommsThread.run(ClassAidServer4Activity.java:64)
11-25 00:47:46.552: W/System.err(198):  at java.lang.Thread.run(Thread.java:1096)
11-25 00:47:46.552: W/System.err(198): java.net.BindException: The address is already in use
11-25 00:47:46.552: W/System.err(198):  at org.apache.harmony.luni.platform.OSNetworkSystem.socketBindImpl(Native Method)
11-25 00:47:46.552: W/System.err(198):  at org.apache.harmony.luni.platform.OSNetworkSystem.bind(OSNetworkSystem.java:107)
11-25 00:47:46.563: W/System.err(198):  at org.apache.harmony.luni.net.PlainSocketImpl.bind(PlainSocketImpl.java:184)
11-25 00:47:46.563: W/System.err(198):  at java.net.ServerSocket.(ServerSocket.java:136)
11-25 00:47:46.563: W/System.err(198):  at java.net.ServerSocket.(ServerSocket.java:87)
11-25 00:47:46.563: W/System.err(198):  at school.cpe434.ClassAidServer.ClassAidServer4Activity$CommsThread.run(ClassAidServer4Activity.java:64)

ここにクライアントがあります(他の投稿と同じです):

public class ClassAidClient4Activity extends Activity {
   private Button bt;
   private TextView tv;
   private Socket socket;
   private String serverIpAddress = "10.0.2.2";
//   private String serverIpAddress = "192.168.1.102";
  //AND THAT'S MY DEV'T MACHINE WHERE PACKETS TO
  //PORT 5000 GET REDIRECTED TO THE SERVER EMULATOR'S
  //PORT 6000
   private static final int REDIRECTED_SERVERPORT = 5000;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      bt = (Button) findViewById(R.id.button1);
      tv = (TextView) findViewById(R.id.textView1);

      try {
         InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
         socket = new Socket(serverAddr, REDIRECTED_SERVERPORT);
      } catch (UnknownHostException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }

      bt.setOnClickListener(new OnClickListener() {

         public void onClick(View v) {
            try {
               EditText et = (EditText) findViewById(R.id.editText1);
               String str = et.getText().toString();
               PrintWriter out = new PrintWriter(new BufferedWriter(
                     new OutputStreamWriter(socket.getOutputStream())),
                     true);
               out.println(str);
               Log.d("Client", "Client sent message");

            } catch (UnknownHostException e) {
               tv.setText("Error1");
               e.printStackTrace();
            } catch (IOException e) {
               tv.setText("Error2");
               e.printStackTrace();
            } catch (Exception e) {
               tv.setText("Error3");
               e.printStackTrace();
            }
         }
      });
   }
}

ここにサーバーがあります(少しポストから変更):

public class ClassAidServer4Activity extends Activity {
   ServerSocket ss = null;
   String mClientMsg = "";
   Thread myCommsThread = null;
   protected static final int MSG_ID = 0x1337;
   public static final int SERVERPORT = 6000;

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
      TextView tv = (TextView) findViewById(R.id.textView1);
      tv.setText("Nothing from client yet");
      this.myCommsThread = new Thread(new CommsThread());
      this.myCommsThread.start();
   }

   @Override
   protected void onStop() {
      super.onStop();
      try {
        //make sure you close the socket upon exiting
         ss.close();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }

   Handler myUpdateHandler = new Handler() {
      public void handleMessage(Message msg) {
         switch (msg.what) {
         case MSG_ID:
            TextView tv = (TextView) findViewById(R.id.textView1);
            tv.setText(mClientMsg);
            break;
         default:
            break;
         }
         super.handleMessage(msg);
      }
   };
   class CommsThread implements Runnable {
      public void run() {
//         Socket s = null;

         while(true) {
             try {
                 ss = new ServerSocket(SERVERPORT );

                 Socket socket = ss.accept();
                 Thread lThread = new Thread(new ListeningThread(socket));
                 lThread.start();

              } catch (IOException e) {
                 e.printStackTrace();
              }
         }


      }
   }

   class ListeningThread implements Runnable {

       private Socket s = null;

       public ListeningThread(Socket socket) {
       //TODO Auto-generated constructor stub
           this.s = socket;
       }

       @Override
       public void run() {
          //TODO Auto-generated method stub
           while (!Thread.currentThread().isInterrupted()) {
                Message m = new Message();
                m.what = MSG_ID;
                try {
                   if (s == null)
                      s = ss.accept();
                   BufferedReader input = new BufferedReader(
                         new InputStreamReader(s.getInputStream()));
                   String st = null;
                   st = input.readLine();
                   mClientMsg = st;
                   myUpdateHandler.sendMessage(m);
                } catch (IOException e) {
                   e.printStackTrace();
                }
             }
       }

   }
}
1

2 答え

私は自分の問題を見つけました。

ss = new ServerSocket(SERVERPORT ); needed to be outside the while loop.

誰か他の問題がある場合は、私に知らせてください。ありがとう

class CommsThread implements Runnable {
      public void run() {
//         Socket s = null;

        ss = new ServerSocket(SERVERPORT );

         while(true) {
             try {


                 Socket socket = ss.accept();
                 Thread lThread = new Thread(new ListeningThread(socket));
                 lThread.start();

              } catch (IOException e) {
                 e.printStackTrace();
              }
         }


      }
   }
1
追加された

私は単一のサーバに接続するために複数のクライアント(すなわち異なるエミュレータ)にThreadPoolを使用します。それはとてもうまくいく。

0
追加された