如何连续从套接字接收InputStream上的新数据

时间:2013-12-19 10:41:13

标签: java sockets

我的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 如何做到这一点,请帮助我。

2 个答案:

答案 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()方法中阻塞,直到有更多数据可用。