メッセージを受信し、応答を返す必要がある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
あなたはポーリングループでクライアントを閉じようとしませんでしたか?通常、この動作は、実際に接続からデータを取得する前に、意図的に接続を閉じた(またはプログラムを終了した)ためです。 – derelict
はい、私はそれを試みました。違いはなかった –