4

私は TCP/IP サーバー/クライアントを非同期に作成しましたが、メッセージを連結します。最初にヘッダーを追加し、最後に文字列ビルダーを使用して完全なメッセージの連結を解除するにはどうすればよいですか。

サーバー読み取りメッセージ:

  Private Sub ReadCallback(ByVal result As IAsyncResult)
    Try
        allDone.Set()
        Dim success As Boolean = result.AsyncWaitHandle.WaitOne(500, True)
        If success Then
            Dim client As ServerClient = TryCast(result.AsyncState, ServerClient)
            If client Is Nothing Then
                Return
            End If
            Dim networkStream As NetworkStream = client.NetworkStream
            Dim read As Integer = networkStream.EndRead(result)
            If read = 0 Then
                SyncLock Me.Clients
                    Me.Clients.Remove(client.ClientID)
                    Return
                End SyncLock
            End If
            If client.NetworkStream.CanRead Then

                dataString.Append(Me.Encoding.GetString(client.buffer, 0, read))

                networkStream.BeginRead(client.buffer, 0, client.buffer.Length, AddressOf ReadCallback, client)
                allDone.WaitOne(500, True)
            End If
        End If
    Catch ex As IO.IOException
        Dim client As ServerClient = TryCast(result.AsyncState, ServerClient)
        SyncLock Me.Clients
            Me.Clients.Remove(client.ClientID)
            Return
        End SyncLock
    Catch ex As Exception
        If Not Me.tcpListener.Server.Connected Then
            Return
        End If
    End Try
End Sub

クライアント書き込みメッセージ:

    Public Function Write(value As String, encoding As Encoding) As Guid
    Dim buffer As Byte() = encoding.GetBytes(value)
    Return Me.Write(buffer)
End Function

Public Function Write(buffer As Byte()) As Guid
    Dim guid__1 As Guid = Guid.NewGuid()
    Dim networkStream As NetworkStream = Me.client.GetStream()
    Dim result As IAsyncResult = networkStream.BeginWrite(buffer, 0, buffer.Length, Nothing, guid__1)


    result.AsyncWaitHandle.WaitOne()
    networkStream.EndWrite(result)
    Return guid__1
End Function
4

1 に答える 1

5

1 つのメッセージの開始位置と終了位置を認識できるようにするには、TCP/IP の上に (おそらく薄くて単純な) プロトコルを定義する必要があります。TCP/IP は、受信者がメッセージの一部、メッセージ全体、または複数のメッセージを取得できるように、送信するメッセージを断片化できます。簡単な方法は、メッセージの長さに続いてメッセージを書くことです。次に、受信者はバイト バッファに読み込み、(送信された長さに基づいて) 適切な量のバイトが受信されると、メッセージを取り出して文字列にエンコードすることができます。

于 2012-08-14T12:14:39.420 に答える