从Java中的套接字读取字节

时间:2012-06-26 21:25:16

标签: java sockets

我有一个Java套接字(java.net.ServerSocket)。我使用InputStream读取它。

我想从socket中读取几个字节,当它们可用时。所以我使用InputStream.read(bytes, 0, num)

当我在本地测试它(超过127.0.0.1)时,它工作正常。但是,当我把它放在互联网上并连接到它时,它只读取2916字节。如何准确读取“num”字节并且不继续,我接收它们?

2 个答案:

答案 0 :(得分:2)

听起来与您的网络设置方式有关。还有其他东西可以向它发送数据。您是否尝试过使用其他端口?

如果这不起作用,请尝试禁用网络连接/断开与网络的连接,以查看是否有来自外部的内容实际导致问题。

答案 1 :(得分:2)

这就是套接字读数通常如何工作的方式。使用较慢的“网络”而不是环回时,不会立即传输所有数据。

当有可用数据时,

read(bytes, 0, num)将返回。可能有一个或多个字节,甚至超过num个字节。 num仅限制将数据移至bytes数组的数量。

因此,如果您想要接收令人兴奋的num字节,则必须再次呼叫read。具有较小len和较大off参数的cource。

示例:

    int offset = 0;
    int wanted = buffer.length;

    while( wanted > 0 )
    {
        final int len = istream.read( buffer, offset, wanted );     
        if( len == -1 )
        {
            throw new java.io.EOFException( "Connection closed gracefully by peer" );
        }
        wanted -= len;
        offset += len;
    }