Socket緩衝区の疑問
Socketの送信バッファサイズは64512=63 kで、受信バッファサイズは8192=8 kで、server端がclient接続を受信した時にスレッドが起動し、スレッドがブロック状態に入り(第2の接続を受信した時にクライアントデータの読み取りが開始されます)、クライアントプログラムはローカルファイルの読み取りを開始し、サーバにデータを送信します。毎回、ストリーム1 kデータを出力します。80回目に送信された場合、クライアントも閉塞しました。つまり、79回前のデータはサーバーに到着したか、あるいはローカルキャッシュで問題が来ました。79回*1 k/回-クライアント送信キャッシュ63 k-サーバ受信キャッシュ8 k=8 kです。この8 kデータはどこにありますか?
Server.java
Server.java
private static CountDownLatch latch = new CountDownLatch(1);
public static void main(String[] args) throws Throwable
{
ServerSocket serverSocket = new ServerSocket(80);
int i = 1;
while (i++ <= 2)// ,
{
new Thread(new Client(serverSocket.accept())).start();
}
latch.countDown();
serverSocket.close();
}
static class Client implements Runnable
{
Socket socket = null;
public Client(Socket socket) {
this.socket = socket;
}
@Override
public void run()
{
try{
//8192
System.out.println("socket.getReceiveBufferSize:" + socket.getReceiveBufferSize());
//64512
System.out.println("socket.getSendBufferSize:" + socket.getSendBufferSize());
//
latch.await();
int len = -1;
byte[] b = new byte[8*1024];// 8k
InputStream is = socket.getInputStream();
while((len = is.read(b)) > 0){
System.out.println(len);
}
}catch(Exception e){
e.printStackTrace();
}
try {socket.close();} catch (IOException e) {e.printStackTrace();}
}
}
Cient.javapublic static void main(String[] args) throws Throwable
{
Socket socket = new Socket("127.0.0.1", 80);
//64512
System.out.println("socket.getSendBufferSize:" + socket.getSendBufferSize());
//8192
System.out.println("socket.getReceiveBufferSize:" + socket.getReceiveBufferSize());
int len = -1;
byte[] b = new byte[1024];// 1k
InputStream is = new FileInputStream("c:/test.rar");// 1M
OutputStream os = socket.getOutputStream();
while ((len = is.read(b)) > 0) {
System.out.println(len);
os.write(b, 0, len);
//os.flush();
}
is.close();
socket.close();
}