我正在开发一个用于连接分析仪和接收实验室数据的软件。
我遇到了如何检测分析仪和我的软件之间传输结束的问题。
程序正确接收数据,但是当分析仪完成发送数据时我遇到了如何检测传输结束的问题,因此我可以将其发送到其他服务器。 ASTM E1394-97,E1381-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();
}
}
}
答案 0 :(得分:1)
您正在使用无限 While循环,因此您无法在从分析仪收到 ETX 字符后中断循环。对于 ASTM通信分析器你必须在 ETX 字符收到后断开循环。下面的代码完全运行完美。
请查看以下链接,您将获得很多关于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 = "";
}
如果您仍有任何疑惑,请与我联系。