在Java中从套接字读取字节
我在Java中有一个套接字(在Java中从套接字读取字节,java,sockets,Java,Sockets,我在Java中有一个套接字(Java.net.ServerSocket)。我使用InputStream读取它 我想从套接字读取几个字节,如果它们可用的话。所以我使用InputStream.read(字节,0,num) 当我在本地测试它时(超过127.0.0.1),它工作得很好。但当我把它放到互联网上并连接到它时,它只读取2916字节。我怎样才能准确地读取“num”字节,并且在收到它们后不继续呢?听起来与您的网络设置方式有关。其他的东西可能正在向它发送数据。您是否尝试过使用其他端口 如果这不起作用
Java.net.ServerSocket
)。我使用InputStream
读取它
我想从套接字读取几个字节,如果它们可用的话。所以我使用InputStream.read(字节,0,num)
当我在本地测试它时(超过127.0.0.1),它工作得很好。但当我把它放到互联网上并连接到它时,它只读取2916字节。我怎样才能准确地读取“num”字节,并且在收到它们后不继续呢?听起来与您的网络设置方式有关。其他的东西可能正在向它发送数据。您是否尝试过使用其他端口
如果这不起作用,请尝试禁用网络连接/断开与网络的连接,以查看是否是外部原因导致了问题。听起来与网络设置方式有关。其他的东西可能正在向它发送数据。您是否尝试过使用其他端口
如果不起作用,请尝试禁用网络连接/断开与网络的连接,以查看是否是外部原因导致了问题。这就是套接字读数通常的工作方式。当使用比环回更慢的“网络”时,所有数据不会立即传输
read(bytes,0,num)
将在有可用数据时返回。可能有一个或多个字节,甚至超过可用的num
字节num
仅限制将多少数据移动到字节
数组
因此,如果您想接收excatlynum
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
仅限制将多少数据移动到字节
数组
因此,如果您想接收excatlynum
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的版本。