检测ASTM协议传输结束

时间:2016-03-16 09:33:34

标签: java sockets hl7

我正在开发一个用于连接分析仪和接收实验室数据的软件。

我遇到了如何检测分析仪和我的软件之间传输结束的问题。

程序正确接收数据,但是当分析仪完成发送数据时我遇到了如何检测传输结束的问题,因此我可以将其发送到其他服务器。 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();

        }
    }
}

1 个答案:

答案 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 = "";


        }

如果您仍有任何疑惑,请与我联系。