2013-06-23 33 views
0

在我当前的项目中,我发送和接收来自serversocket/clientsocket(TCP)的textmessages,就像聊天(我的项目是用VB.NET编写的)。只要我将发送的字节转换为字符串并将它们呈现在msgbox()中,就可以工作。 此代码处理该部分:将数据从socket通信传递到用户界面

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 =消息时,出现错误:“写入收到的消息时出错”。那么,我的问题就是为什么会发生这种情况,我可以采取什么措施来纠正它,以便我的套接字能够接收可添加到文本框和UI中其他内容的信息?

在此先感谢您的帮助,您可以提供

回答

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 
+0

确定感谢这么多Idle_Mind,我会试试这个明天再回来给你结果。我感到宽慰的是,修复可能相当简单,所以我可以回到我的项目中,这个项目已经停止了很多。 –

+0

尽管我并不知道代码的功能如何,但这似乎仍在工作:)非常感谢您的帮助 –

+0

您不应该从其他线程更新UI元素。这样做会导致NewMessage()通过使用BeginInvoke()在UI主线程中运行。当查询的控件(“Me”= Form)在另一个线程上创建时,InvokeRequired行将返回true。 BeginInvoke()行在与创建控件相同的线程中运行委托。这会导致对第二次运行返回false的同一方法进行递归调用,并且您可以放入else块来安全地更新UI。 –

相关问题