2016-12-26 10 views
0

現在、私は、入力ストリームを1バイトしか入っていないバイト配列に読みたいと思っています。私は、これを一定回数繰り返して、対応する長さのバイトを取得するようにします。たとえば、40バイトで40回読み取ります。しかし、このソケットの反対側では、各書き込みメソッドに512バイトを書き込みます(実際には、ほとんどの場合、読み取りバッファは512バイトですが、特定の条件では1バイトずつ読み取ります)。この場合、送信ソケットが毎回ネットワーク上に512バイトを書き込んで、受信ソケットがそれらのすべてを受け取り、それらをローカルバイト配列に格納し、readメソッドがローカル配列から毎回1バイトを読み込むか、送信ソケットは毎回1バイトしか書きませんか?この質問は混乱しているように聞こえるかもしれませんが、うまくいけば私はそれを明確にしました。tcpソケットのreadメソッドはどのように機能しますか?

答えて

3

カーネルのソケット受信バッファでデータが使用可能になるまでブロックし、利用可能なバイト数だけ転送します。

+0

これは、readメソッドが1バイトの配列を1回だけ満たしても、受信ソケットがすでに512バイトを受け取っている可能性があり、readメソッドを40回呼び出すと、送信ソケットで40回書き込みメソッドが呼び出される? – user1870797

+0

"とし、使用可能なバイト数だけ転送します。私はちょっと混乱しているようです。 readメソッドがバイト配列に何バイト埋め込んでも、新しい入力ストリームデータに対してカーネルの受信バッファがリセットされることを意味しますか? – user1870797

+0

@ user1870797(1)readメソッドを呼び出すと、 '書き込みメソッドがトリガされません'。送信アプリケーションはwriteメソッドを呼び出します。 (2)「読み込み方法がバイト配列に何バイト充填されても、新しい入力ストリームデータをリセットする」という文言は混乱している。私はあなたがここで何を話しているのか、「リセット」という言葉から始まって、何も知らない。 – EJP

関連する問題