2017-09-07 22 views
1

メッセージを受信し、応答を返す必要があるTCPリスナー(サーバー)を作成しています。かなり基本的なもの。文字通り数多くの例がありますが、MSDNを含めて、私は自分のコードの多くをコピーしました。私は問題なくメッセージを受け取ることができます。問題は、返信を返そうとするときに発生します。送信側クライアント(Corepoint HL7エンジン)は、次のエラーを報告:応答/応答が送信される前にTCPリスナー接続が閉じられています

The connection was closed before a response was received

私は(MSDNからコピーしたコードを使用して書かれた)私自身のTCP送信テストアプリで自分のサービスをテストして、それが動作します。しかし、私がCorepointからのメッセージを受け取ったとき、応答は戻ってこない。

以下は私のコードです。 NetworkStream.Writeメソッドが実際にデータを送信していない理由(またはクライアントが受信していない理由)を知っている人はいますか?私は私の問題に似ている他の投稿で見つけたすべてのアイデアを試しましたが、何も動いていません。私は何か間違っているのですか、あるいはCorepointの設定に何か間違っていますか?

Sub Main() 
    listenThread.Start() 
End Sub 

Private serverSocket As TcpListener 
Dim listenThread As New Thread(New ThreadStart(AddressOf ListenForClients)) 

Private Sub ListenForClients() 
    Dim port As Int32 = '(pick a port #) 
    Dim localIP As IPAddress = 'enter your IP 

    serverSocket = New TcpListener(localIP, port) 
    serverSocket.Start() 

    While True 'blocks until a client has connected to the server 
     Dim client As TcpClient 

     If serverSocket.Pending Then 
     client = serverSocket.AcceptTcpClient 
     'tried these 2 settings with no effect 
     'client.NoDelay = True  
     client.Client.NoDelay = True 

     ProcessIncomingMessageSocketTCPClient(client) 'I was doing this in a separate thread but temporarily kept it on this thread to eliminate threading as the possible cause (but no luck) 
     client.Close() 
     Else 
     Threading.Thread.Sleep(1000) 'wait 1 second and poll again    
     End If 
    End While 
End Sub 

Private Sub ProcessIncomingMessageSocketTCPClient(ByRef objClient As TcpClient) 

    Dim strMessageText As String 
    Dim clientStream As NetworkStream 
    Dim msgBuffer(4096) As Byte 
    Dim numberOfBytesRead As Integer 
    Dim strChunk As String 
    Dim strCompleteMessage As New Text.StringBuilder 
    Dim sendBytes As Byte() 

    clientStream = objClient.GetStream() 

    Do 
     numberOfBytesRead = clientStream.Read(msgBuffer, 0, msgBuffer.Length) 
     strChunk = Encoding.ASCII.GetString(msgBuffer, 0, numberOfBytesRead) 
     strCompleteMessage.AppendFormat("{0}", strChunk) 
    Loop While clientStream.DataAvailable 
    strMessageText = strCompleteMessage.ToString 

    sendBytes = Encoding.ASCII.GetBytes("I received a message from you") 
    clientStream.Write(sendBytes, 0, sendBytes.Length) 
    objClient.Close() 'tried it with and without this line 

End Sub 
+0

あなたはポーリングループでクライアントを閉じようとしませんでしたか?通常、この動作は、実際に接続からデータを取得する前に、意図的に接続を閉じた(またはプログラムを終了した)ためです。 – derelict

+0

はい、私はそれを試みました。違いはなかった –

答えて

0

私のコードで何も問題はないことが判明しました。 TCPが正しく動作していました。このアプリケーションはHL7リスナーであり、私のACKの周りにMLPのラッピングがありませんでした。私がそれを追加するとすぐに、送信アプリケーションは私のACKを受け入れ、すべてが良いです。