2011-09-14 10 views
0

ここでスタックオーバーフローで質問するのは初めてです。 私はこれを簡潔にしておきます。Javaスレッドが正しく動作していないようです

私は単純なクライアントソケットアンドロイドアプリケーションを書いています。 私が接続しているサーバーには、Aliceという名前のチャットロボットがあります。 私はサーバに接続できましたが、 "Hello from alice"というメッセージが表示されますが、それ以上のメッセージを受信して​​いないためスレッドが停止しているようです。ここで

はいくつかのコードです:

@Override 
public void run() { 

    try 
    { 
     while (true) 
     { 
     String _input = _rd.readLine(); 
     if (_input != null) 
     { 
     _field.append("Alice : "+ _input+"\n"); 
     } 
     else 
     { 
      _field.append("null"); 
     } 
      sleep(50); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

あなたは私がメッセージを受信しない場合でも、「ヌル」を追加することによって、自分のコードのトラブルシューティングをしようとしている見ることができるように、しかし、これはどちらも私のEditTextに示されています。

ユーザーがボタンを押したときに私のメインアクティビティクラスから.start()を呼び出します。

 @Override 
     public void onClick(View arg0) { 

      setContentView(R.layout.second); 
      InitiateSecondFrame(); 

      _cs = new ClientSocket(); 
      String _check = _cs.EstablishConnection(_host.getText().toString(), 
        Integer.parseInt(_port.getText().toString()), 
        (EditText)findViewById(R.id.historyField)); 

      _cs.start(); 

      Toast.makeText(getApplicationContext(), _check, 100).show(); 
      SaveHostPort(_host.getText().toString(), _port.getText().toString());       
     } 
    }); 

ClientSocketクラスはスレッドによって拡張し、Runnableを実装して、私はまた、単に拡張または実装しようとしましたさ。 エラーメッセージは一切表示されません。 私が与えた情報が、間違ったことを理解するのに十分であることを願っています。 私はマルチスレッドとソケットでは新しいので、何か基本的なものを見逃しているかもしれないことを覚えておいてください。

+0

私は今何が起こっているのか、助けてくれてありがとう! – Orujimaru

答えて

0
_rd.readLine(); 

はここにあなたの問題です。これは、リモートシステムからの入力をブロックして永遠に待機し、リモートシステムから改行文字を検出したときに受信したコンテンツのみを返します。

+0

あなたの答えをありがとう、サーバが私にメッセージを送ったかどうかを継続的にチェックしたいのであれば私の選択肢は何ですか? – Orujimaru

+0

あなたはすでにそれをしています:readLineは、行が受信されるまでブロックします。 –

+1

は、リモートシステムからの入力ストリームに対してavailable()メソッドを使用する習慣があります。これは、読み込みのためにストリーム上でいくつのバイトが利用可能であるかを知らせます。0はリモート側にデータがないことを意味します。 – mcfinnigan

1

それが助け場合は、ここであなたがスレッドを開始する方法は次のとおりです。

Runnable runnable = new MyRunnableClass(); // has the run() method 
new Thread(runnable).start(); 
0

スレッドは停止しません。メッセージが来るのを待っているだけです。 _rd.readLine()は、改行文字で終わるいくつかの行が読み込まれるまで、または接続が終了するまでブロックします。だからアリスが接続を開いたままにして何も送信しない場合、readLineは永遠にブロックされ、あなたの "null"メッセージは決して印刷されません。

+0

これは、私の問題は主にサーバー側であることを意味しますか? – Orujimaru

+0

サーバー側に問題があるかどうかは不明です。チャットは、通常、何らかの会話を意味します。アリスはあなたに「アリスからのこんにちは」と言って、何も答えなかった。私がアリスなら、私は話す前に答えを期待します。つまり、私は通信プロトコルについて何も知らない。アリスは、「アリスからのこんにちは」よりも多くの行を送ってきますか? –

+0

私はチャットロボットが会話できると言われましたが、私はそれを疑うようになっています。私はサーバー管理者に連絡しましたが、まだ回答がありません。あなたの助けをありがとう、少なくとも私は自分のコードが正しいはずです知っている。 – Orujimaru

関連する問題