用Socket做简单聊天程序(VB.net)

有位网友发贴问我一个聊天的问题,不好拒绝;也看到最近VB.net版问这个的人很多,就写了一个放在这里。

本例只适合初学用Socket编程的人,因而力求简单,让老鸟见笑了J

另本示例用的是vs2005

1、服务端

ImportsSystem.Net

ImportsSystem.Net.Sockets

ImportsSystem.Threading

ImportsSystem.Text

ImportsSystem.Diagnostics

 

PublicClass frmServer

 

   '服务端的Socket

   Dim listener As Socket

   '与客户端会话的Socket

   Dim mySocket As Socket

   '服务端的运行状态

   Dim IsRun As Boolean = False

   '监听接收数据线程

   Dim myThread As Thread

 

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

       myThread = New Thread(AddressOf Listen)

       myThread.Start()

   End Sub

 

   Public Sub Listen()

       Dim bytes() As Byte = New [Byte](1024) {}

       Dim data As String = String.Empty

       Dim tokens() As String

 

       Dim localEndPoint As New IPEndPoint(Net.IPAddress.Parse("127.0.0.1"), 11000)

       '初始化socket

       listener = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

       '绑定端口

       listener.Bind(localEndPoint)

       '开始监听

       listener.Listen(10)

 

       BeginInvoke(New EventHandler(AddressOf AddInfo), "服务端已启动,正在等待连接......")

 

       mySocket = listener.Accept()

       IsRun = True

 

       While True

           Dim bytesRec As Integer = mySocket.Receive(bytes)

           data = Encoding.UTF8.GetString(bytes, 0, bytesRec)

 

           tokens = data.Trim.Split("|")

           Select Case tokens(0) '分析接收到的数据,可自己定义更多一些

               Case "Chat"

                   BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全

               Case "Exit"

                   IsRun = False

                   BeginInvoke(New EventHandler(AddressOf AddInfo), tokens(1)) 'Invoke保证线程安全

                   mySocket.Shutdown(SocketShutdown.Both)

                   mySocket.Close()

                   Exit Sub

           End Select

       End While

 

   End Sub

 

   '发送信息

   Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click

       Dim msg As Byte() = Encoding.UTF8.GetBytes("Chat|" + TextBox1.Text)

       mySocket.Send(msg)

       ListBox1.Items.Add("本地信息: " + TextBox1.Text)

 

       TextBox1.Text = ""

   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 IsRun Then

           Dim msg As Byte() = Encoding.UTF8.GetBytes("Exit|服务端退出: " + Me.Handle.ToString)

           Dim bytesSent As Integer = mySocket.Send(msg)

       End If

       listener.Close()

       mySocket = Nothing

       myThread.Abort()

   End Sub

 

EndClass

 

2、客户端

ImportsSystem.Net

ImportsSystem.Net.Sockets

ImportsSystem.Text

ImportsSystem.Threading

 

PublicClass 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

           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 = ""

   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 Sub

EndClass

 

源程序下载:

VB聊天程序.rar


版权声明:本文为chendazhi原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。