Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从套接字读取字节流_Java_Sockets_Byte - Fatal编程技术网

Java:从套接字读取字节流

Java:从套接字读取字节流,java,sockets,byte,Java,Sockets,Byte,我正在设置一个软件,该软件以字节[]发送消息并接收字节流。 例如,发送数组 byte[] replayStatuse = new byte[] { 0x55, (byte) 0xAA, 0x0B, 0x00, 0x0A, 0x1C, 0x03, 0x41, 0x01, 0x00 } 我收到了类似的消息。我使用PacketSender进行了测试,当我询问状态时,我可以看到十六进制的答案。 我正在使用 我已经尝试了在stack和其他论坛上找到的各种方法,但都不起作用。 方法如下: int rea

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

byte[] replayStatuse = new byte[] { 0x55, (byte) 0xAA, 0x0B, 0x00, 0x0A, 
0x1C, 0x03, 0x41, 0x01, 0x00 }
我收到了类似的消息。我使用PacketSender进行了测试,当我询问状态时,我可以看到十六进制的答案。 我正在使用

我已经尝试了在stack和其他论坛上找到的各种方法,但都不起作用。 方法如下:

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-read,但什么也没有。在我的控制台上,它打印奇怪的字符U

即时通讯使用:

InputStream socketInputStream = socket.getInputStream();
socketInputStream.read();
我希望得到一个字节[],并且能够使用函数读取:

System.out.println(Arrays.toString(byteArray));
因此,我可以处理各种情况,并在需要时转换为字符串或十六进制
谢谢大家

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

我不确定是否完全理解您的问题,但让我们试试看

从一开始你就有一个字节的来源,我假设大小是未知的

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));
}

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

到底是什么问题?我不清楚你想做什么或问题出在哪里。您已经在读取缓冲区中的字节,缓冲区是一个字节数组。为什么要从从套接字读取的字节中创建字符串?您需要解释您在这里尝试执行的操作。您读取字节数组的代码似乎是正确的。问题在于读取字节数组后如何处理它。您的代码似乎正在将其呈现为文本,但不清楚您是否打算这样做,或者您实际上想要实现什么。后者将决定如何呈现数组。@ILightWas的主要问题是如何读取主板发送回我的数据。我甚至不知道哪一个是结束字符,以停止的时候-1不工作!我的目标是在控制台中有一个人类可读的字符串或将答案放入字节数组中,然后在之后能够使用System.out.printlnArrays.toStringbyteArray打印出来@JamesKPolk我正在创建一个字符串,这样我就可以在控制台上读取它,并且可以轻松地进行操作,但是我也可以使用字节数组。谢谢你的回复,帮了我很多忙!我的问题不是很清楚,但你帮了我很多,我找到了解决办法!当我尝试打印输出时,我没有转换输出,所以控制台会显示随机内容!另外,我的数据包有一个包含消息长度的字节,因此使用该字节和一个循环,我可以在不使用While的情况下读取hwole消息!!!!再次感谢
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));
}