Hi everybody,

It seems RI Socket.getOutputStream().write(byte[])  doesn't send all data
sometimes. Consider following test, which often blocks on RI:

   public void test_SocketChannel_BlockWriteRead() throws IOException {
       final int CAPACITY_NORMAL = 200;
       InetSocketAddress localAddr1 = new InetSocketAddress("127.0.0.1
",1234);
       ServerSocket server = new ServerSocket(1234);

       SocketChannel channel = SocketChannel.open();
       channel.connect(localAddr1);
       Socket serverSocket = server.accept();

       OutputStream out = serverSocket.getOutputStream();
       byte[] sendBuf = new byte[CAPACITY_NORMAL * 2];
       for (int i = 0; i < CAPACITY_NORMAL * 2; i++) {
           sendBuf[i] = (byte) i;
       }
       // send CAPACITY_NORMAL * 2 bytes data
       out.write(sendBuf);
       out.flush();

       ByteBuffer buf1 = ByteBuffer.allocate(CAPACITY_NORMAL);
       ByteBuffer buf2 = ByteBuffer.allocate(CAPACITY_NORMAL);
       ByteBuffer[] buf ={buf1, buf2};

       // should receive CAPACITY_NORMAL * 2 bytes data
       // RI often hangs here, with CAPACITY_NORMAL bytes data received.
       long count = 0;
       do{
           count += channel.read(buf);
       }while(count < CAPACITY_NORMAL*2);
       assertEquals(CAPACITY_NORMAL * 2, count);
   }

I think it's a bug of RI. Am I missing something? Please correct me if I'm
wrong. There're also some similar tests in NIO module with FIXME mark.

If it's a bug of RI, I'll raise a JIRA to tidy up those "FIXME" in NIO.

Thanks!

Best regards,

--
Andrew Zhang
China Software Development Lab, IBM

Reply via email to