VB.net Socket客户端的几点问题。
1.Sub ReciveMsg()里的while true是什么意义?
2.点击Button1_Click发送消息,为什么用线程接收服务器返回的消息,而不是直接在Button1_Click事件中接收?
谢谢。
- VB.NET code
客户端Imports System.NetImports System.Net.SocketsImports System.TextImports System.ThreadingPublic Class frmClient '客户端Socket Dim cliSocket As Socket '连接状态 Dim IsConnected As Boolean = False '接收信息线程 Dim myThread As Thread Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim remoteEP As New IPEndPoint(Net.IPAddress.Parse("127.0.0.1"), 11000) cliSocket = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) Try cliSocket.Connect(remoteEP) ListBox1.Items.Add("连接服务端成功!") IsConnected = True myThread = New Thread(AddressOf ReciveMsg) myThread.Start() Catch ex As Exception ListBox1.Items.Add(ex.Message) End Try End Sub Sub ReciveMsg() Dim bytes() As Byte = New Byte(1024) ...{} Dim data As String = String.Empty Dim tokens() As String While True '1.Sub ReciveMsg()里的while true是什么意义? Dim bytesRec As Integer = cliSocket.Receive(bytes) data = Encoding.UTF8.GetString(bytes, 0, bytesRec) tokens = data.Trim.Split("|") Select Case tokens(0) '分析接收到的数据,可自己定义更多一些 Case "Exit" IsConnected = False BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全 cliSocket.Shutdown(SocketShutdown.Both) cliSocket.Close() Exit Sub Case "Chat" BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全 End Select End While End Sub '发送信息 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim msg As Byte() = Encoding.UTF8.GetBytes("Chat|" + TextBox1.Text) Dim bytesSent As Integer = cliSocket.Send(msg) ListBox1.Items.Add("本地信息: " + TextBox1.Text) TextBox1.Text = ""'2.点击Button1_Click发送消息,为什么用线程接收服务器返回的消息,而不是直接在Button1_Click事件中接收? End Sub '非UI线程调用窗体控件,保证线程安全。与聊天实现无关。 Sub AddInfo(ByVal sender As System.Object, ByVal e As System.EventArgs) ListBox1.Items.Add("远程信息: " + sender.ToString) End Sub '关闭窗口时发关退出信息并清理资源 Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing If IsConnected Then Dim msg As Byte() = Encoding.UTF8.GetBytes("Exit|客户端退出: " + Me.Handle.ToString) Dim bytesSent As Integer = cliSocket.Send(msg) myThread.Abort() End If End SubEnd Class[解决办法]
用线无限循环来读取是否有数据进来,这样就相当于实时,不放线程里会造成程序无响应,如果直接在button1中就只会是每点一下button1才会去接收下数据,不点button1时就不会接受,
楼主俺要积分下载东西,麻烦给分吧谢谢啦,哈哈