あなたの友人は正しいですが、それはtcpipプロトコルがどのように機能するかに関係があります。クライアントに送信される大幅に簡素化されたパケットを確認する必要があります。クライアントが応答しない場合 (着信データの読み取りに失敗した、コンピューターに負荷がかかっているなど)、サーバーは確認応答を受信せず、データの送信を停止します。TCP/IP に組み込まれたこのメカニズムは、通信の一方の端が大量のデータを送信するのを防ぎます。これにより、大量のデータを再送信する必要がなくなります。
Java では、これは への書き込みをブロックするものとして現れOutputStream
ます。基礎となる TCP/IP スタック/オペレーティング システムは、クライアントが受信準備が整うまで、それ以上データを送信することを許可しません。
これで簡単にテストできます!接続を受け入れるが受信データの読み取りに失敗する単純なサーバーを実装しました。
new Thread(new Runnable() {
@Override
public void run() {
try {
final ServerSocket serverSocket = new ServerSocket(4444);
final Socket clientSocket = serverSocket.accept();
final InputStream inputStream = clientSocket.getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
そして、4K バッチでできるだけ多くのデータを送信するだけのシンプルなクライアント:
final Socket client = new Socket("localhost", 4444);
final OutputStream outputStream = client.getOutputStream();
int packet = 0;
while(true) {
System.out.println(++packet);
outputStream.write(new byte[1024 * 4]);
}
95 回繰り返した後、クライアント ループが私のコンピューターでハングします (マイレージは異なる場合があります)。inputStream
ただし、サーバースレッドから読み取ると、ループが延々と続きます。