2

我在 Java 中创建了一个套接字侦听器,它在两个端口上侦听数据并对侦听的数据进行操作。现在的场景是,当监听器和传输数据的设备都启动并运行时,监听器接收数据,一次一个(每个数据以“#S”开头,以“.”结尾),当侦听器未启动或未侦听,设备将数据存储在其本地内存中,一旦侦听器启动,它就会以附加形式发送所有数据,例如:

"#S ...DATA...[.]#S...DATA...[.]..."

现在我已经实现了这样一种方式,无论监听器在任一端口上获得什么数据,它都会转换为十六进制形式,然后对输入数据的十六进制格式进行操作。“#S”的十六进制形式是“ 2353”和“.”的十六进制形式 是“2e”。处理输入数据的十六进制转换形式的代码如下。 hexconverted1是一个包含整个输入数据的十六进制转换形式的字符串,它来自任何端口。

String store[];
store=hexconverted1.split("2353"); 
for(int m=0;m<store.length;m++)
    store[m]="2353"+store[m];

 PrintWriter out2 = new PrintWriter(new BufferedWriter(new FileWriter("C:/Listener/array.bin", true)));
    for(int iter=0;iter<store.length; iter++)
        out2.println(store[iter]);
    out2.close();

我试图通过上面的代码来完成的是,每当一堆数据到达时,我都会尝试扫描数据并从一堆数据中提取每一个数据并存储在一个字符串数组中,以便我希望的操作可以以更简单的方式对数据的十六进制转换形式进行。因此,当我将数组的内容写入 BIN 文件时,对于相同的输入,输出会有所不同。当我发送 280 个数据包的捆绑数据时,一个接一个地附加,有时数组包含 180,有时包含 270。但是对于较小的束大小,我得到了所需的结果,“存储”数组的大小是也如预期。

我对发生的事情一无所知,任何指示都会有很大帮助。

为了让事情更清楚,我在端口上获得的数据大多是不可读的,通常唯一可读的部分是起始位“#S”和结束位“.”。所以我使用BufferedInputStream和的组合InputStream来读取传入的数据并将其转换为十六进制格式,我很确定转换为十六进制的工作顺利进行。

4

1 回答 1

0

我使用 BufferedInputStream 和 InputStream 的组合来读取传入的数据

在这里抓着稻草。如果您同时使用 InputStream 和 BufferedInputStream 方法从 Stream 中读取数据,您将遇到困难:

InputStream is = ...
BufferedInputStream bis = new BufferedInputStream(is);

// This is OK
int b = bis.read();
...
// Reading the InputStream directly at this point is liable to
// give unpredictable results.  It is likely that some bytes still
// remain in "bis"'s buffer, and a read on "is" will not return them.
int b2 = is.read();
于 2010-01-30T08:00:17.357 回答