0

次のコードを使用して、クライアントをサーバーに接続しています。問題は、これが終了せず、この後に新しいアクティビティを開始できないことです。

問題は、ソケットを閉じていないか、スレッドが終了していないことだと思います。

でスレッドを開始しますonCreate()

cThread = new Thread(new ClientThread());
cThread.start();

そして、これが私のものですRunnable

public class ClientThread implements Runnable {
    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            socket = new Socket(serverAddr, 8080);
            connected = true;
            while (connected) {
                try {
                    Log.d("ClientActivity", "C: Sending command.");
                    PrintWriter out = new PrintWriter(new BufferedWriter(new
                      OutputStreamWriter(socket
                                .getOutputStream())), true);
                        // where you issue the commands

                        out.println(serverIpAddress);
                        Log.d("ClientActivity", "C: Sent.");

                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error while sending", e);
                }

                connected = false;
            }
            //socket.close();
            Log.d("ClientActivity", "C: Closed.");

        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error while connecting", e);
            connected = false;
        }

    }


}
4

1 に答える 1

1

あなたのプログラムはまったく役に立ちません。ソケットが確立されていると仮定すると、whileループは 1 回だけ実行されます。これは、最初の反復の最後に に設定connectedfalse、それ以上のサイクルを無効にするためです。バッファリングされた出力をフラッシュして書き込まれることを確認せず、ソケットから読み取ることさえしないので、カスタムプロトコルがどのように見えるか疑問に思います...この時点で、プログラムは単に文字列を書き込むだけですサーバー、そして終了します。提供されたコードには、新しいアクティビティを開始することを妨げるものは何もないため、新しいアクティビティを開始できない理由もわかりません。

基本的に2種類のTCPプロトコルがあります

  1. 要求応答ベース (HTTP のように、チャット プログラムには適していません)。クライアントは、接続を確立し、リクエストを作成し、応答を読み取り、別の要求を作成し、新しい応答を読み取り、というように、クライアントがジョブを完了するまで続けます。グラフィカル クライアントには少なくとも 2 つのスレッドが必要です。1 つは UI の更新用で、もう 1 つはネットワーク通信用です。
  2. クライアントとサーバーの両方がランダムな時間にメッセージを送信します。これはソケット通信の全二重機能を活用しますが、GUI プログラムには少なくとも 3 つのスレッドが必要です。1 つは UI 用、もう 1 つはソケットの入力ストリームでブロックされたスレッド、もう 1 つは書き込み用です。ストリームを共有する可能性が高く、手動で同期する必要があるため、事態はかなり厄介になります。

これが別のチャット プログラムである場合は、独自の TCP プロトコルを設計するのではなく、WebSocketsなどの標準テクノロジから始めることをお勧めします。利用可能なJava クライアントがあり、ブラウザで Javascript を少しだけ使用してサーバーをテストすることができます。サーバー側にはさらに多くの選択肢があります ( Socket.IO - JS ソリューションの場合、Jetty、Glassfishなど)。 .

ある程度の経験を積んで仕事に慣れてきたら、独自のカスタム TCP プロトコルを設計してみてください。その頃には、少なくともソケット、スレッド、Android プログラミングの基礎を学んでいるはずです。

ところで、ユーザーの操作を必要としないバックグラウンド タスクのServiceAPIを確認することをお勧めします。

于 2012-09-24T12:47:37.253 に答える