2012-02-22 11 views
0

私はサーバークライアントアプリケーションを持っています。私は、「ログイン失敗コード」の並べ替えを使って奇妙なスピードバンプを打ちました。Javaソケットが未送信のバイトを取得する

私がしたいことは、ログインの有効性を説明するコードを送信し、必要に応じてOutputStreamを閉じます。 この問題は、クライアントが応答を読み取る前にソケットが閉じられているため、一見してランダムで謎のエラーにつながります。

setSoLinger()(など)を使用する以外に、書き込まれた最後のバイト(またはそれ以上)がクライアントによって読み取られたことを確認する方法はありますか?

ありがとうございました。

+0

['close()'](http://docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#close())または['shutdownOutput () '](http://docs.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#shutdownOutput())を使用してストリームを閉じますか? – sarnold

+0

'この問題は、クライアントが応答を読み取る前にソケットが閉じられているように見えます。これは、一見ランダムで潜在的な障害につながります。記述してください。あなたが送信するものは、大規模なネットワーク障害が発生していない限り、そのまま送信されます。 – EJP

答えて

1

Javaでは、クライアントが何かを受け取ったことをサーバーアプリケーションが知る唯一の方法は、のこのプロパティを含むです。クライアントはデータを受信したことを示す何らかのメッセージを送信する必要があります何らかのチェックサムが必要な場合)、サーバーはこのメッセージを待たなければなりません。それだけで、何かを確かめることができます。

他のエンドポイントが何らかのデータを受信したことを確認する他の信頼できる方法はありません:.close().flush()なし、他のエンドポイントによる受信を保証するものはありません。

+0

ありがとうございます。しかしタイムアウトを設定しても、クライアントが通知を送信するとは信じられません。特に、悪意のある行為 – Whired

関連する問題