Socket緩衝区の疑問

2169 ワード

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
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.java
public 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();
}