java套接字读取数据的方式是否完全相同;s发送
假设我们在两个设备(a和B)之间有一个套接字连接。现在,如果我只向A侧套接字的输出流(而不是BufferedOutputStream)写入16个字节(这里大小无关紧要),则写入3次,或者通常不止一次,如下所示:java套接字读取数据的方式是否完全相同;s发送,java,sockets,Java,Sockets,假设我们在两个设备(a和B)之间有一个套接字连接。现在,如果我只向A侧套接字的输出流(而不是BufferedOutputStream)写入16个字节(这里大小无关紧要),则写入3次,或者通常不止一次,如下所示: OutputStream outputStream = socket.getOutputStream(); byte[] buffer = new byte[16]; OutputStream.write(buffer); OutputStream.write(buffer); Outp
OutputStream outputStream = socket.getOutputStream();
byte[] buffer = new byte[16];
OutputStream.write(buffer);
OutputStream.write(buffer);
OutputStream.write(buffer);
我使用套接字输入流(非BufferedInputStream)读取B侧的数据,该流的缓冲区大于发送缓冲区,例如1024:
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int read = inputStream.read(buffer);
现在我想知道B侧是如何接收数据的?它可能会累积数据,还是会在A发送数据时准确地读取数据?换句话说,每个文档读取的变量可能超过16?:
public int read(byte[] b) throws IOException
从输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。字节数
实际读取以整数形式返回。此方法将阻止,直到
输入数据可用,检测到文件结束,或出现异常
扔。如果b的长度为零,则不读取字节,0为零
返回;否则,将尝试读取至少一个字节。如果
没有可用的字节,因为流位于文件的末尾
返回值-1;否则,至少读取并存储一个字节
进入b
读取的第一个字节存储在元素b[0]中,下一个字节存储在元素b[0]中
b[1],依此类推。读取的字节数最多等于
b的长度。设k为实际读取的字节数;这些字节
将存储在元素b[0]到元素b[k-1]中,保留元素b[k]
通过b[b.length-1]不受影响
Read(…)
告诉您它放入数组的字节数,是的,您可以进一步读取;您将获得已经存在的任何内容。根据文档:
public int read(byte[] b) throws IOException
从输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。字节数
实际读取以整数形式返回。此方法将阻止,直到
输入数据可用,检测到文件结束,或出现异常
扔。如果b的长度为零,则不读取字节,0为零
返回;否则,将尝试读取至少一个字节。如果
没有可用的字节,因为流位于文件的末尾
返回值-1;否则,至少读取并存储一个字节
进入b
读取的第一个字节存储在元素b[0]中,下一个字节存储在元素b[0]中
b[1],依此类推。读取的字节数最多等于
b的长度。设k为实际读取的字节数;这些字节
将存储在元素b[0]到元素b[k-1]中,保留元素b[k]
通过b[b.length-1]不受影响
Read(…)
告诉您它放入数组的字节数,是的,您可以进一步读取;您将获得已经存在的任何内容。根据文档:
public int read(byte[] b) throws IOException
从输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。字节数
实际读取以整数形式返回。此方法将阻止,直到
输入数据可用,检测到文件结束,或出现异常
扔。如果b的长度为零,则不读取字节,0为零
返回;否则,将尝试读取至少一个字节。如果
没有可用的字节,因为流位于文件的末尾
返回值-1;否则,至少读取并存储一个字节
进入b
读取的第一个字节存储在元素b[0]中,下一个字节存储在元素b[0]中
b[1],依此类推。读取的字节数最多等于
b的长度。设k为实际读取的字节数;这些字节
将存储在元素b[0]到元素b[k-1]中,保留元素b[k]
通过b[b.length-1]不受影响
Read(…)
告诉您它放入数组的字节数,是的,您可以进一步读取;您将获得已经存在的任何内容。根据文档:
public int read(byte[] b) throws IOException
从输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。字节数
实际读取以整数形式返回。此方法将阻止,直到
输入数据可用,检测到文件结束,或出现异常
扔。如果b的长度为零,则不读取字节,0为零
返回;否则,将尝试读取至少一个字节。如果
没有可用的字节,因为流位于文件的末尾
返回值-1;否则,至少读取并存储一个字节
进入b
读取的第一个字节存储在元素b[0]中,下一个字节存储在元素b[0]中
b[1],依此类推。读取的字节数最多等于
b的长度。设k为实际读取的字节数;这些字节
将存储在元素b[0]到元素b[k-1]中,保留元素b[k]
通过b[b.length-1]不受影响
Read(…)
告诉您它放入数组的字节数,是的,您可以进一步读取;您将获得已经存在的任何内容。InputStream
很少保证通过调用多字节read()
方法将读取多少数据。有一整类常见的编程错误围绕着误解和错误的假设。比如说,
- 如果
读取的字节数少于提供的数组所能容纳的字节数,这并不意味着已到达流的末尾,甚至不意味着另一次读取必然会阻塞InputStream.read(byte[])
的任何一次调用读取的字节数不一定与流所绘制的字节源的任何特征相关,除非流不在流的末尾时,它总是至少读取一个字节,并且它读取的字节数不会超过返回时实际可用的字节数InputStream.read(byte[])
方法指示的可用字节数不能可靠地指示后续读取应该或将读取多少字节。非零返回值可靠地指示onavailable()