2

HL7メッセージを処理するための単純なTCPリスナーを作成しました。メッセージを正しく受信し、ACKメッセージを送り返そうとしています。反対側のサーバーは応答を受け取っていないようですが、この設定に何か問題がありますか?

少しリファクタリングする必要があることに気づきました。今は接続を確立しようとしています。

class Server
{
    private TcpListener tcpListener;
    private Thread listenThread;

    public Server()
    {
        this.tcpListener = new TcpListener(IPAddress.Parse("hidden"), 55555);
        this.listenThread = new Thread(new ThreadStart(ListenForClients));
        this.listenThread.Start();
    }

    private void ListenForClients()
    {
        this.tcpListener.Start();

        while (true)
        {
            TcpClient client = this.tcpListener.AcceptTcpClient();

            Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
            clientThread.Start(client);
        }
    }

    private void HandleClientComm(object client)
    {
        TcpClient tcpClient = (TcpClient)client;
        NetworkStream clientStream = tcpClient.GetStream();

        byte[] message = new byte[4096];
        int bytesRead;

        while (true)
        {
            bytesRead = 0;

            try
            {
                bytesRead = clientStream.Read(message, 0, 4096);
            }
            catch
            {
                break;
            }

            if (bytesRead == 0)
            {
                break;
            }

            ASCIIEncoding encoder = new ASCIIEncoding();
            string result = encoder.GetString(message, 0, bytesRead);

            string[] Lines = result.Split('\n');
            string id = "";
            foreach (string line in Lines)
            {
                string[] values = line.Split('|');
                if (values[0].Contains("MSH"))
                {
                    id = values[9];

                    byte[] buffer = encoder.GetBytes("\\vMSH|^~\\&|Rhapsody|JCL|EpicADT|JCL-EPIC-TEST|||ACK|A" + id + "|P|2.4|\\nMSA|AA|" + id + "|");

                    Console.WriteLine("MSH|^~\\&|Rhapsody|Test|EpicADT|TEST|||ACK|A" + id + "|P|2.4|\\nMSA|AA|" + id + "|");

                    clientStream.Write(buffer, 0, buffer.Length);
                    clientStream.Flush();
                }
            }
        }

        tcpClient.Close();
    }
}
4

1 に答える 1

1

メッセージを読んでソケットに応答を書き込んでいる間は、MLLPが実装されていません。

通常、MLLP は必要であり、ほとんどのアプリケーションは MLLP ブロックを検証します。MLLP がないと、クライアントはソケットに書き込まれるデータをスキップするだけです。

どうやら、MLLP がなくてもアプリケーションに問題はありません。クライアントが MLLP を実装していない場合、この回答は無効です。

これについては、他の回答で詳しく説明しました。

于 2018-10-24T13:12:09.290 に答える