2011-12-03 9 views
0

私は、サーバーに到達できない可能性のあるネットワークアプリケーションを持っています。クライアントは、30秒ごとにアイドル時間を文字列ping\nを介してサーバーに送信し、クライアントがオンラインかどうかをサーバーが確認できるようにします。私のサーバーはまったく応答しません。接続が中断され、クライアントが「ping」メッセージを送信すると、パッケージは、オペレーティングシステムによって、サーバーがパッケージを入手するまでバッファーに格納されます。サーバーがオンラインに戻った場合、サーバーが数十のpingパッケージを一度に取得する可能性があります。バッファのバイト数を取得することは可能ですか?ソケットのSendBufferのバイト数を取得する方法は?

編集: クライアントから送信する必要があるカウントバイトを取得するにはどうすればよいですか?

+0

あなたの質問は完全に不明です。 – bitbandit

答えて

0

ネットワークソケットで読み取りを呼び出す前に、読み取ることができるかどうかを確認する場合は、読み取ることができるバイト数を指定します。短い答えはnoです。 があるかどうかは、読み取ることができるのはバイトですが、バイト数は検出できません。クライアントは、カーネルに書き込まれたバイトをサーバのフルバッファによってブロックすることもできるため、サーバ自体は、読み込み可能なバイト数を知ることができません。また、クライアント側からは、クライアントによって書き込まれたデータの量はわかりませんが、サーバーによって消費されたデータの量はわかりません。

データはクライアント側とサーバー側の両方でバッファリングされますが、Javaではバッファ内のバイト数を確認することはできません。非常に特定のカーネルコールをC言語で入手することは可能かもしれませんが、非常に移植性がありません。

  • 考慮すべきことの1つは、ソケットを有効に保つためにTCPメカニズムを使用するSocket.setKeepAlive(true)を使用することです。私はサーバー側からどれくらいの信頼性があるのか​​分かりませんが、クライアントが離れた後にソケットがタイムアウトすると-1から読み取られます。
  • もう1つは、各pingに対して別々のTCP接続を作成することです。あまりにも高すぎる場合は、一定数のping試行後に再接続できます。
  • 3番目に考慮する必要があるのは、バッファリングされずにはるかに安価なUDPパケットをクライアントから送信することです。再試行もないので、より頻繁に送信する必要があります。
  • サーバは何らかの応答を返すこともできるので、クライアントはソケットがまだ良好であることをクライアントが知っていることを知っています。それは応答を取得しない場合、再接続することができます。
+0

送信するキューにいくつのバイトがあるか知りたいです。メッセージやパッケージを添付しません。私の混乱の疑いで申し訳ありません。 – rekire

+0

私は自分の答えを編集しました。あなたがデータを書き込んだ後、私はサーバによって読み込まれているかどうかを確認する方法がわかりません。 – Gray

+0

私は参照してください。しかし、私は、発信データはどこにでもバッファリングされなければならないと考えています。ネットワーク自体はTCPパッケージを再送しません。私が覚えている場合は、プログラムまたは動作しているシステムがACK TCPパッケージを取得するまで、TCPパッケージを再送信しようとします。バッファに問題はありませんが、年長の「ping-packages」が送信されない場合は、「ping」メッセージの送信を停止したいと考えています。何百万ものメッセージを送信しようとすると、オーバーフローなどが起こる可能性があると私は想像することができます。 – rekire

-1

バッファのバイト数を取得することはできますか?

次のread()は、アプリケーションバッファが十分な大きさであれば、それが戻り値として返されます。しかし、何が良いのですか?それでも、すべてのデータを読み込んで処理する必要があります。質問は無意味なようです。

+0

Downvoterは冗談でなければなりません:-) – EJP

関連する問題