2011-06-23 11 views
1

私はAndroid上でアプリケーションを作成していますが、サーバー(C言語で記述したもの)が消滅したりシャットダウンされたときを知りたいと思っています。私は、サーバーがクライアント(Androidアプリ)に指定された間隔でメッセージを送信するようにすることでこれを実装しようとしています。このメッセージが表示されない場合、クライアントはサーバーに接続されていないことを認識します。 TCPソケットを使用して通信します。Javaクライアントに接続されたCサーバーソケットの問題

私の問題は、Androidアプリケーションがサーバーの書き込み内容を読み取れないように見えることです。サーバーソケットから読み取ろうとするコードの最初の部分に到達すると、ハングアップします。 Androidアプリケーションでは、BufferedReaderを使用してソケットtmpstr = inFromServer.readLine();から読み込みます。ここで、tmpstrは文字列で、inFromServerはBufferedReaderであり、Cサーバはwrite write(newsockfd,"I got your message",18);を使用しています。

また、私の基本的なプログラムロジックが間違っているかどうかを確認するために、別のJavaサーバーを使用してみました。テストサーバーはPrintWriterを使用し、Androidクライアントと完全に連携しました。

私はここで何が欠けていますか? JavaとCのデータをバッファリングする(またはバッファしない)方法に違いはありますか?追加情報が必要な場合は、私に知らせてください。

編集:クライアントから送信されたデータをCサーバに読み込ませることに問題はありません。私は、クライアントからサーバーから送信されたデータを読み取ることに問題があります。

編集:サーバーがクライアントに送信する文字列に改行文字(\n)を追加することで問題を解決しました。

+1

改行を待っていませんか?しかし、あなたに改行を送ることができません... – gnud

+1

改行文字 '' \ r \ n "'を送ろうとしましたか? – user786653

+0

Javaは送信するデータに自動的に改行を追加しますか?私は 'outToServer.println(" some strings ");'を使い、サーバはそれをうまく読み込めます。編集:私は、改行文字を送信しようとし、それが役立つかどうかを見てみましょう。私はその結果をすぐに取り戻すつもりです。 – purpletreefactory

答えて

2

正しく読み返すと、readLine()は完全な行を読み込むまで結果を返さないでしょう。それまでブロックされています。 Cプログラムからフルラインを送信していません。

ヌルターミネータを送信していないので、フルライン(\ n終了)を送信しないだけでなく、C文字列全体を送信しないこともあります(C文字列は実際には19文字ヌルターミネータを含める場合は18です)。私は、Javaが使用する文字列形式の型を思い出すことはできません。もしnullで終わるかどうかは分かりませんが、\ nではなく\ 0を探しているので、おそらく問題はありません。

Cサーバから「私はあなたのメッセージを受け取りました」と伝え、何が起こったのかをお知らせください。

おっと、私はちょうどその質問が既にコメントに答えられていたことに気付きました。しかたがない。人々は本当に答えを回答として掲示すべきです。

+0

最後の文に+1。とにかくお返事ありがとうございます! – EJP

+0

「\ n」を追加するというあなたの提案は、私がそれを機能させるためにやらなければならなかったことです。そして、はい、コメントに答えを出す人々はちょっと混乱します。 – purpletreefactory

関連する問題