1

私はAndroidデバイス用のTCPクライアントを開発しています。サーバーに接続でき、サーバーからメッセージを受信したことを追跡できます。サーバーから送信された結果をクライアントGUIに表示したいTextView textview_textin

それをするのを手伝ってくれませんか

どうもありがとう

public class JssclientActivity extends Activity {
private EditText serverIp;

private Button connectPhones;

private String serverIpAddress = "192.168.0.2";

private boolean connected = false;

private TextView textview_textin;



public class ClientThread implements Runnable {

    public void run() {
        try {

            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            Socket socket = new Socket(serverAddr, 2600);
            connected = true;
            while (connected) {
                try {

                    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                    String inMsg = "";
                    char buf[] = null;
                     int val = in.read();
                     while (-1 != val) {
                        inMsg = in.readLine();
                    }

                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
            Log.d("ClientActivity", "C: Closed.");
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    textview_textin = (TextView) findViewById(R.id.textin);
    connectPhones = (Button) findViewById(R.id.connect);

    connectPhones.setOnClickListener( new View.OnClickListener() {  
     @Override
     public void onClick(View v) {
         if (!connected) {
             //serverIpAddress = serverIp.getText().toString();
            if (!serverIpAddress.equals("")) {
                 Thread cThread = new Thread(new ClientThread());
                 cThread.start();
                }            
         }
     }
 });

}
}

返信ありがとうございます

デバイスに接続できますが、何も受信しません。どうしてか分かりません?

ここで私が試したことは、

 public class JssclientActivity extends Activity {
 private EditText serverIp;

 private Button connectPhones;

 private String serverIpAddress = "192.168.20.21";

private boolean connected = false;

 private TextView textview_textin;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.main);

  textview_textin = (TextView) findViewById(R.id.textin);
connectPhones = (Button) findViewById(R.id.connect);



ClientThread ct = new ClientThread(new ClientThread.SocketCallback() {
      public void onReceived(final String msg) {
        JssclientActivity.this.runOnUiThread(new Runnable() {
          @Override
          public void run() {
              textview_textin.setText(msg);
          }
        });
      }
    });

  }
 }




 class ClientThread implements Runnable {

interface SocketCallback {
  void onReceived(String msg);
}
private SocketCallback callback;

private boolean connected;

private Socket socket;

public ClientThread(ClientThread.SocketCallback cb) {
      this.callback = cb;
      try {InetAddress serverAddr = InetAddress.getByName("192.168.20.21");
      Log.d("ClientActivity", "C: Connecting...");
      //Socket
    socket = new Socket(serverAddr, 2600);
      connected = true;
      } catch (Exception e) {
          Log.e("ClientActivity", "C: Error", e);
          connected = false;
      }
    }

 public void run() {
      while (connected) {
          try {

              BufferedReader in = new BufferedReader(new        InputStreamReader(socket.getInputStream()));
              String inMsg = "";
              char buf[] = null;
               int val = in.read();
          //     while (-1 != val) {
           //       inMsg = in.readLine();
            //  }
               while (-1 != val) {
                  inMsg = in.readLine();
                  this.callback.onReceived(inMsg);
                }

          } catch (Exception e) {
              Log.e("ClientActivity", "S: Error", e);
          }
      }
    //  socket.close();
      Log.d("ClientActivity", "C: Closed.");

 }
 }

手伝ってくれませんか。

ありがとう

4

2 に答える 2

1

コールバック クラスを作成し、

interface SocketCallback {
  void onReceived(String msg);
}

ClientThreadこれらは論理的に関連しているため、これは の内部になる可能性があります。必須ではありませんが、良いデザインです。

クラスがRunnableコンストラクターでこのコールバックのインスタンスを受け入れるようにします。

public ClientThread(ClientThread.SocketCallback cb) {
  this.callback = cb;
}

Runnable( )を構築するときはClientThread、UI クラス ( JssClientActivity) から次のように行います。

ClientThread ct = new ClientThread(new ClientThread.SocketCallback() {
  public void onReceived(String msg) {
    JssClientActivity.this.runOnUiThread(new Runnable() {
      @Override
      public void run() {
        myTextView.setText(msg);
      }
    });
  }
}};

最後に、 でClientThread、メッセージを受信したら、コールバックを呼び出します。

while (-1 != val) {
  inMsg = in.readLine();
  this.callback.onReceived(inMsg);
}

ClientThread が実行されているスレッドから UI を更新できないことに注意してください。UI スレッドから更新する必要があるため、runOnUiThread().

于 2012-06-21T22:38:18.020 に答える
0

setText()TextViewのメソッドを使用して、TextViewのテキストを設定できます。

例:

textview_textin.setText(yourText)

を使用runOnUiThread()すると、TextViewにアクセスできるようになります。この回答を参照してください。

于 2012-06-21T22:35:34.387 に答える