读书人

VB.net Socket客户端的几点有关问题

发布时间: 2012-03-20 14:01:10 作者: rapoo

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时就不会接受,

楼主俺要积分下载东西,麻烦给分吧谢谢啦,哈哈

读书人网 >VB Dotnet

热点推荐