Java:从套接字读取字节流

时间:2019-07-02 16:15:06

标签: java sockets byte

我正在设置一个软件,该软件在字节[]中发送消息并接收字节流。 例如,发送数组

byte[] replayStatuse = new byte[] { 0x55, (byte) 0xAA, 0x0B, 0x00, 0x0A, 
0x1C, 0x03, 0x41, 0x01, 0x00 }

,我收到类似的信息。我使用PacketSender进行了测试,当我询问状态时可以在十六进制中看到答案。 我正在使用

InputStream socketInputStream = socket.getInputStream();

我已经尝试过在堆栈和其他论坛上找到的各种方法,但是没有用。 像这样的方法:

int read;
while((read = socketInputStream.read(buffer)) != -1)
{
   String output = new String(buffer, 0, read);
   System.out.print(output);
   System.out.flush();
}

我尝试使用char,byte或其他格式的int读取,但是什么也没有。在我的控制台中,它会打印出奇怪的字符(U)

我正在使用:

InputStream socketInputStream = socket.getInputStream();
socketInputStream.read();

我希望获得一个byte []并且可以使用以下功能进行读取:

System.out.println(Arrays.toString(byteArray));

因此我可以处理各种情况,并在需要时转换为String或HEX 谢谢大家

2 个答案:

答案 0 :(得分:0)

字符'U'并不奇怪,它是十六进制值0x55的ASCII字符(即与测试数组中的第一个值相同)。数组中接下来的几个值可能会抛出print语句。我建议检查/显示“缓冲区”的长度,以使您知道在数组中放置了多少字节。

答案 1 :(得分:0)

我不确定我是否完全理解您的问题,但请尝试

从一开始,您就拥有一个字节源,我将假定大小是未知的。

byte[] buffer = new byte[4096]; //I assume you have something like this

//Lets use this to accumulate all the bytes from the inputstream
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();

int read;
while((read = socketInputStream.read(buffer)) != -1)
{
    byteStream.write(buffer, 0, read); //accumulates all bytes
}

byteStream.flush(); //writes out any buffered byte

byte[] allBytesRead = byteStream.toByteArray(); //All the bytes read in an array

这是已发送的所有字节。假设您要以十六进制打印每个字节

for(byte b : allBytesRead) {
    //might not be a good ideia if its something big. 
    //build a string with a StringBuilder instead.
    System.out.println(String.format("%02X", b));
}

现在由您决定如何处理这些字节。