Tim,

Thank you very much.  I revised the test case a little according to your
suggestion, but RI still fails sometimes.
Would you please review the test?  The error message is: expected <400> but
was: <200>
Thanks a lot in advance!


   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();
       out.close();

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

       // should receive CAPACITY_NORMAL * 2 bytes data
       long count = 0;
       do{
           long ret = channel.read(buf);
           if(ret == -1){
               break;
           }
           count += ret;
       }while(count < CAPACITY_NORMAL*2);
       assertEquals(CAPACITY_NORMAL * 2, count);
   }

Best regards,

On 6/23/06, Tim Ellison <[EMAIL PROTECTED]> wrote:

Andrew,

There is no guarantee that the out.flush() will actually send the bytes
(it will just ensure that they get from Java to the OS).  Indeed, there
is no guaranteed way to force the TCP stack to send the bytes; but you
can try by reducing the socket send buffer size (SO_SNDBUF) and setting
no delay on (TCP_NODELAY).  The best bet is to close the output stream
socket when you have finished writing, and read until you get a -1 on
the client.

Regards,
Tim

Andrew Zhang wrote:
> 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,
>

--

Tim Ellison ([EMAIL PROTECTED])
IBM Java technology centre, UK.

---------------------------------------------------------------------
Terms of use : http://incubator.apache.org/harmony/mailing.html
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]




--
Andrew Zhang
China Software Development Lab, IBM

Reply via email to