0

私の現在のプロジェクトでは、チャットのように、serversocket/clientsocket (TCP) との間でテキストメッセージを送受信しています (私のプロジェクトは VB.NET で記述されています)。これは、送信されたバイトを文字列に変換し、それらを msgbox() で表示している限り機能します。このコードはその部分を処理します:

Try
    client = ar.AsyncState
    client.EndReceive(ar)
    client.BeginReceive(bytes2, 0, bytes2.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), client)
    Try
        Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytes2)
        MsgBox(message)
        Array.Clear(bytes2, bytes2.GetLowerBound(0), bytes2.Length)
    Catch ex As Exception
        MsgBox("Error writing received message")
    End Try
 Catch ex As Exception
    MsgBox("Error receiving message from server")
 End Try

ここまでは順調ですね。ただし、「MsgBox(メッセージ)」を label1.text = message に変更しようとすると、「受信メッセージの書き込みエラー」というエラーが表示されます。私の質問は、なぜこれが起こるのか、それを修正してソケットがテキストボックスや UI の他のものに追加できる情報を受信できるようにするにはどうすればよいでしょうか?

あなたが提供できる助けを前もって感謝します

4

1 に答える 1

0

デリゲートと BeginInvoke() を使用して、メイン UI スレッドへの呼び出しを適切にマーシャリングします。

Private Sub OnRecieve(ar As IAsyncResult)
    Try
        client = ar.AsyncState
        client.EndReceive(ar)

        Try
            Dim message As String = System.Text.ASCIIEncoding.ASCII.GetString(bytes2)
            NewMessage(message)
        Catch ex As Exception
            MsgBox("Error writing received message")
        Finally
            Array.Clear(bytes2, bytes2.GetLowerBound(0), bytes2.Length)
        End Try

        client.BeginReceive(bytes2, 0, bytes2.Length, SocketFlags.None, New AsyncCallback(AddressOf OnRecieve), client)
    Catch ex As Exception
        MsgBox("Error receiving message from server")
    End Try
End Sub

Private Delegate Sub MessageDelegate(ByVal msg As String)

Private Sub NewMessage(ByVal msg As String)
    If Me.InvokeRequired Then
        Me.BeginInvoke(New MessageDelegate(AddressOf NewMessage), New Object() {msg})
    Else
        Label1.Text = msg
    End If
End Sub
于 2013-06-23T21:17:25.183 に答える