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