我的java代码是这个
package pack.client;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.net.UnknownHostException;
import org.apache.commons.codec.binary.Hex;
public class ReceiveHex
{
public static void main(String[] args) throws UnknownHostException, IOException
{
Socket s = new Socket("192.168.121.146", 6866);
byte[] data = new byte[5];
while(true)
{
InputStream stream = s.getInputStream();
stream.read(data);
System.out.println(Hex.encodeHexString(data));
data= null;
//stream.reset();
}
}
}
我希望从阵列中的服务器连续接收数据并打印出来。现在我得到0000000000 如何做到这一点,请帮助我。
答案 0 :(得分:1)
您需要分析读取返回值,它是读入数据的实际字节数
int len = stream.read(data);
...
如果为-1则表示EOS。
或者你可以按字节读取/打印
int byte = stream.read();
...
答案 1 :(得分:0)
鉴于您正在从套接字读取(我假设它引用java.net.Socket
),数据可能不会一直无法使用。
查看InputStream.read(byte [])的文档,我们看到:
从输入流中读取一些字节数并将它们存储到缓冲区数组b中。实际读取的字节数以整数形式返回。此方法将阻塞,直到输入数据可用,检测到文件结尾或抛出异常。
该方法返回一个整数,告诉您在此给定点可以读取(并且已读取)的字节数,仅当某些数据可用时才会阻止。注意:这意味着该方法可能不一定填充您的字节数组。
例如,可能是您的字节数组的大小为1000字节,但当时只能读取2个字节。在这种情况下,只会填充数组的前两个字节,read()方法将返回整数2。
从InputStream读取的“更多”正确方法如下所示:
int read; //Our read counter
while((read = stream.read(data)) != -1){
//Manipulate data over here.
//Note that the read variable contains the actual numbers of bytes read.
//E.G:
byte[] readdata = Arrays.copyOf(data, read); //Gives a copy of our read data, truncated to the read size.
System.out.println(Hex.encodeHexString(readdata));
}
//End of stream, no more data available.
对于每个循环,我们检查read()方法是否返回-1(表示流的结束[即没有更多可用数据])。在循环内部,我们可以对读取的数据进行操作记录读取变量。
如果数据可用,解决方案将“连续”读取数据。鉴于没有新数据可用,当前正在执行的线程将在read()方法中阻塞,直到有更多数据可用。