2010-11-24 18 views
3

私はJavaソケットサーバーを持っており、接続ソケットはうまく動作します。私が助けが必要なのは、クライアントに応答をストリーミングすることです。Javaのソケットでストリーミング応答

出力ストリームはsocket.getOutputStream()です。出力ストリームに書き込むと直ちに送信されるようにするにはどうすればよいですか?将来、同じ接続で別のチャンクを送信できます。

私はflushと一緒にwritewriteを使用して、単純にしようとしたが、私は本当に私がやっているかわからない...

答えて

2

flush()は強制的にデータをOSに送信します。 OSはデータをバッファすることができ、クライアント上のOSもデータをバッファすることができます。 OSが以前にデータを送信したい場合は、Nagleのアルゴリズムをオフにすることをお勧めします。 socket.setTcpNoDelay(true);しかし、OS /ドライバのパラメータにはまだバッファリング/パケットの連携が導入されていることがわかります。

SunのJDK 6 java.net.SocketOutputStreamを見ると、flush()メソッドは何もしません。これは、すべてのプラットフォームで当てはまるわけではなく、flush()が必要な場合があります。

+0

ありがとう! Nagleのアルゴリズムをオフにすることは、そのトリックでした! –

3

ネイティブ実装によっては、ソケットバッファを持っているし、送信しないことあなたがwrite()を呼び出す秒数。ただし、flush()はバイトを強制的に送信します。通常は、バイト単位ではなく、より大きなチャンクを送信することをお勧めします(ストリーミングの場合は、通常、受信側のバッファを構築することから始めます)。最適なネットワーク使用法は、可能な限り大きなパケット(MTUによって制限される)として送信される可能性があります。 javaでローカルバッファを使用するには、ソケットoutputstreamをBufferedOutputStreamにラップします。

+0

私の究極の目標は、さえずりに似たストリーミングAPIを提供することでしたので、私は情報の小さなチャンクを送信するために必要な。 –

1

別の解決策は、可能性がDataOutputStream
DataOutputStream dataOut = new DataOutputStream(socket.getOutputStream());
dataOut.writeInt(1)

関連する問題