3

私は初心者なので、ばかげた質問をしたらごめんなさい。
サーバーとのソケット接続を行う必要があります。
クライアント(Androidデバイス)はサーバーにメッセージを送信し、ackメッセージを待つ必要があります。次に、サーバーは、クライアントから30秒間何も受信しない場合、ackメッセージの要求を送信します。
私がやったことは最初の部分です。クライアントがメッセージを送信し、応答を読み取ります。
私が尋ねるのは、クライアントはサーバーからのメッセージの可能性をどのように待つことができるかということです。
これは私が書いたコードです:
onCreateメソッドで:

Thread myThread = new Thread(new myRunnable());
myThread.start();

そしてこれはmyRunnableです:

public class myRunnable implements Runnable{
  public void run(){
    try{
      Socket socket = new Socket(serverIp, serverPort);
      InputStream is = socket.getInputStream();
      OutputStream out = socket.getOutputStream();
      out.write(byteBuffer.array());
      out.flush();
      byte[] bbb = new byte[1024];
      // Receive message from server
      int bytesToRead= is.read(bbb);
      is.close();
      out.close();
      socket.close();

連続した読み取り操作は-1を返しますが、サーバーメッセージを待機し続けるにはどうすればよいですか?
アドバイスありがとうございます。

4

1 に答える 1

4

ストリームを閉じるべきではありません。ストリームを閉じると、サーバーとの通信が閉じます。通常、サーバー通信は無限ループで発生します。このようなもの:

public class myRunnable implements Runnable{
  public void run(){
    try{
      Socket socket = new Socket(serverIp, serverPort);
      InputStream is = socket.getInputStream();
      OutputStream out = socket.getOutputStream();
      out.write(byteBuffer.array());
      out.flush();
      byte[] bbb = new byte[1024];
      while (true) {
         // Read next message.
         bytesToRead = is.read(bbb);
         // handle message...
         // If you need to stop communication use 'break' to exit loop;
      }
      is.close();
      out.close();
      socket.close();

したがって、サーバーがメッセージを送信するまでスレッドはオンラインで停止しbytesToRead = is.read(bbb)、その後、メッセージを任意の方法で処理し、次のメッセージの読み取りに戻ります。を使用して通信終了ループを停止する必要がある場合break

于 2012-11-22T14:20:36.613 に答える