我正在实现一个软件连接到分析器和接收实验室数据。
在如何检测分析仪和我的软件之间的传输结束方面,我遇到了一个问题。
程序接收到的数据是正确的,但是当分析器完成发送数据时,我遇到了一个如何检测传输结束的问题,这样我就可以将数据发送到其他服务器。ASTM E 1394-97、E 1381-02/95第2.2.3节的通信规范提到;ETX字符是文本结束的指示,EOT字符是传输结束的指示器。
在我的程序中,我检查接收到的字节,以检查字符是ETX还是EOT,这样我就可以关闭套接字并使用数据,还可以检查接收到的字节是否等于-1 EOF。
由于未知的原因,分析器没有发送任何这些字符- ETX和EOT。
有什么方法来检测分析器是否结束了数据的传输?
下面是接受分析器连接的简单代码。
package ServerClient;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.InetAddress;
public class SimpleServer {
private static ServerSocket server;
private static Socket connection;
public static void main(String args[]) throws IOException {
server = new ServerSocket(5006);
while (true) {
System.out.println(" start... ");
connection = server.accept();
System.out.println("wait for connection");
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(connection.getInputStream()));
DataOutputStream outToServer = new DataOutputStream(connection.getOutputStream());
int i = 0;
StringBuilder sb = new StringBuilder();
do // process messages sent from client
{
try // read message and display it
{
//System.out.println("wait for message");
i = inFromServer.read();
System.out.println((char) i + " " + i);
//System.out.print(" *" + i + " " + (char) i + "* ");
sb.append((char) i);
//byte ACK = 0x06;
//outToServer.writeByte(ACK);
//outToServer.flush();
/*
outToServer.write(0);
i = inFromServer.read();
System.out.println(i);*/
} // end try
catch (Exception e) {
System.out.println(e.getMessage());
connection.close();
break;
} // end catch
} while (true && i != -1);
System.out.println("--------------\n" + sb.toString() + "\n--------------");
connection.close();
}
}
}发布于 2018-03-27 13:01:45
您使用的是无限时间循环,因此在ETX字符从analyzer.For ASTM通信接收到分析器后,您将无法中断循环,您必须在ETX字符接收到.below代码后中断循环。
请看下面的链接,您将得到许多关于ASTM的帮助。
链接: ASTM Communication Detail and Its fully Example
while (true) {
while((clientIntMessag=inFromClient.read())!=ASCIIValues.ETX) {
currentMsg += "" + (char) clientIntMessage;
if (clientIntMessage == ASCIIValues.ENQ) {
outToClient.writeBytes("" + ASCIIValues.ACK);
}
if (clientIntMessage == ASCIIValues.LF) {
outToClient.writeBytes("" + ASCIIValues.ACK);
}
if (clientIntMessage == ASCIIValues.NAK) {
outToClient.writeBytes("" + ASCIIValues.EOT);
}
}
System.out.println(currentMsg);
currentMsg = "";
}如果你还有任何困惑,请告诉我..。
https://stackoverflow.com/questions/36031607
复制相似问题