在Java中从套接字读取字节

在Java中从套接字读取字节,java,sockets,Java,Sockets,我在Java中有一个套接字(Java.net.ServerSocket)。我使用InputStream读取它 我想从套接字读取几个字节,如果它们可用的话。所以我使用InputStream.read(字节,0,num) 当我在本地测试它时(超过127.0.0.1),它工作得很好。但当我把它放到互联网上并连接到它时,它只读取2916字节。我怎样才能准确地读取“num”字节,并且在收到它们后不继续呢?听起来与您的网络设置方式有关。其他的东西可能正在向它发送数据。您是否尝试过使用其他端口 如果这不起作用

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

我想从套接字读取几个字节,如果它们可用的话。所以我使用
InputStream.read(字节,0,num)


当我在本地测试它时(超过127.0.0.1),它工作得很好。但当我把它放到互联网上并连接到它时,它只读取2916字节。我怎样才能准确地读取“num”字节,并且在收到它们后不继续呢?

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


如果这不起作用,请尝试禁用网络连接/断开与网络的连接,以查看是否是外部原因导致了问题。

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


如果不起作用,请尝试禁用网络连接/断开与网络的连接,以查看是否是外部原因导致了问题。

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

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

因此,如果您想接收excatly
num
bytes,那么必须再次调用
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;
    }

这就是插座读数通常的工作方式。当使用比环回更慢的“网络”时,所有数据不会立即传输

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

因此,如果您想接收excatly
num
bytes,那么必须再次调用
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;
    }


请展示一个简短但完整的程序来演示问题,并阅读您是否正在检查
InputStream.read()
的返回值?毫无疑问,您的代码是错误的。在这里发布,将其编辑到你的回复中。发布你认为你的代码是如何工作的是毫无意义的,因为它没有做你认为它做的事情。张贴实际代码。例如,“何时可用”是什么意思?无限循环是什么样子的?对不起,我太笨了。我只是在谷歌上搜索并解决了它。我使用DataInputStream.readFully(字节)。真的不知道为什么InputStream.read(字节,偏移量,长度)中有第三个参数,而它只读取2916字节。请展示一个简短但完整的程序来演示这个问题,read您是否正在检查
InputStream.read()
的返回值?毫无疑问,您的代码是错误的。在这里发布,将其编辑到你的回复中。发布你认为你的代码是如何工作的是毫无意义的,因为它没有做你认为它做的事情。张贴实际代码。例如,“何时可用”是什么意思?无限循环是什么样子的?对不起,我太笨了。我只是在谷歌上搜索并解决了它。我使用DataInputStream.readFully(字节)。真的不知道为什么InputStream.read(字节,偏移量,长度)中有第三个参数,而它只读取2916字节。是的,我更改了5次端口号。真的不知道发生了什么。试试我的第二个建议。。。可能会缩小我的帖子是否相关的范围。所以,它在前4个字节读得很好,但在之后发送字节时会出现问题。当我不发送任何东西时,它是正常的,但当我将数据发送到服务器时,它读取错误的数据。似乎它将新字节与上一条消息中的字节混合在一起。我让我的老师更新Java的版本。我不确定我是否理解。您需要接受Jon Skeet的建议并提供更多信息。@IvanKuckir这当然不取决于Java的版本。是的,我更改了5次端口号。真的不知道发生了什么。试试我的第二个建议。。。可能会缩小我的帖子是否相关的范围。所以,它在前4个字节读得很好,但在之后发送字节时会出现问题。当我不发送任何东西时,它是正常的,但当我将数据发送到服务器时,它读取错误的数据。似乎它将新字节与上一条消息中的字节混合在一起。我让我的老师更新Java的版本。我不确定我是否理解。您需要接受Jon Skeet的建议,并向我们提供更多信息。@IvanKuckir这当然不取决于Java的版本。