VB.net做的一个简单的聊天的例

来源:互联网 发布:VB debug.print 编辑:程序博客网 时间:2024/05/01 22:14
-
<pre name="code" class="vb">服务端:'用vb.net做一个简单的聊天工具,可以实现群发的Imports System.ThreadingImports System.NetImports System.Net.SocketsPublic Class Form1    Dim ListenSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) '创建监听的套接字    Dim Dict As New Dictionary(Of String, Socket) '用于保存连接的客户的套接字的键值对集合    Dim DictThre As New Dictionary(Of String, Thread) '用于保存通信线程的键值对集合    Private Sub ButListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButListen.Click '开始监听的按钮        TextBox.CheckForIllegalCrossThreadCalls = False '取消文本框的跨线程检查        Dim Address As IPAddress = IPAddress.Parse(TxtIP.Text.Trim)        Dim EndPoint As New IPEndPoint(Address, TxtPort.Text) '创建一个网络节点对象        ListenSocket.Bind(EndPoint) '给负责监听的套接字绑定一个网络节点        ListenSocket.Listen(2)        ShowMsg("正在监听……")        Dim thre As New Thread(AddressOf Connect) '创建一个新的线程用于处理客户端发来的连接请求        thre.IsBackground = True '设为后台线程        thre.Start() '开启线程    End Sub    Sub Connect() '处理客户端的连接请求的过程        While True            Dim SockConect As Socket = ListenSocket.Accept            ShowMsg("连接成功!" & "(连接信息:" & SockConect.RemoteEndPoint.ToString & ")")            Dict.Add(SockConect.RemoteEndPoint.ToString, SockConect) '将连接成功的套接字添加到键值对集合            LBOnLine.Items.Add(SockConect.RemoteEndPoint.ToString) '添加到列表            Dim Thre As New Thread(AddressOf RecClient) '创建一个新的线程用于和链接成功的套接字通信            Thre.IsBackground = True '设为后台线程            Thre.Start(SockConect)            DictThre.Add(SockConect.RemoteEndPoint.ToString, Thre) '将创建的通信线程添加到键值对集合        End While    End Sub    Sub RecClient(ByVal SockTelNet As Socket) '处理客户端发来的数据        While True            Dim AryMsg(1024) As Byte            Dim RecLen As Int32            Try '捕获异常                RecLen = SockTelNet.Receive(AryMsg) '接受客户端发来得信息            Catch ss As SocketException                ShowMsg(ss.NativeErrorCode & vbCrLf & ss.Message) '显示错误信息                Dict.Remove(SockTelNet.RemoteEndPoint.ToString) '移除断开连接的套接字                LBOnLine.Items.Remove(SockTelNet.RemoteEndPoint.ToString) '从列表中移除                Return            Catch s As Exception                ShowMsg(s.Message)                Return            End Try            Dim StrMsg As String            StrMsg = System.Text.Encoding.UTF8.GetChars(AryMsg, 0, RecLen)            ShowMsg("接收:" & StrMsg)        End While    End Sub    Sub ShowMsg(ByVal Msg As String) '显示信息        TxtMsg.AppendText(Format(DateTime.Now, "F") & vbCrLf & "   " & Msg & vbCrLf & vbCrLf) 'TxtMsg用途显示消息记录    End Sub    Sub SendMsg(ByVal Msg As String) '发送信息        Dim AryMsg() = System.Text.Encoding.UTF8.GetBytes(Msg)        Try '捕获异常            Dict(LBOnLine.SelectedItem).Send(AryMsg) '给选中用户发送消息        Catch ss As SocketException            ShowMsg(ss.NativeErrorCode & vbCrLf & ss.Message)            Return        Catch s As Exception            ShowMsg(s.Message)            Return        End Try        ShowMsg("发送:" & Msg)    End Sub    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Button1发送消息的按钮        SendMsg(TxtSendMsg.Text) '发送消息    End Sub    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 'Button2群发的按钮        For Each a In Dict.Values '遍历通信套接字键值对集合,群发消息            Dim AryMsg() = System.Text.Encoding.UTF8.GetBytes(TxtSendMsg.Text.Trim)            Try '捕获异常                a.Send(AryMsg) '发送消息            Catch ss As SocketException                ShowMsg(ss.NativeErrorCode & vbCrLf & ss.Message)            Catch s As Exception                ShowMsg(s.Message)            End Try        Next        ShowMsg("群发:" & TxtSendMsg.Text.Trim)    End SubEnd Class'客户端:'客户端和服务端发送和接收数据的处理基本一样的,只是一个是主动连接的,一个是被动连接的Imports System.NetImports System.Net.SocketsImports System.ThreadingPublic Class Form1    Dim SockClient As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) '穿件一个    Private Sub ButListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButListen.Click        TextBox.CheckForIllegalCrossThreadCalls = False '取消文本框的跨线程检查        Dim Address As IPAddress = IPAddress.Parse(TxtIP.Text.Trim)        Dim Endpoint As New IPEndPoint(Address, TxtPort.Text)        Try '捕获异常            SockClient.Connect(Endpoint) '发起连接        Catch ss As SocketException            ShowMsg(ss.Message)            Return        Catch s As Exception            ShowMsg(s.Message)            Return        End Try        ShowMsg("连接成功!")        Dim Thre As New Thread(AddressOf RecMsg) '创建接收数据的线程        Thre.IsBackground = True        Thre.Start()    End Sub    Sub RecMsg() '接受数据处理        While True            Dim AryMsg(1024) As Byte            Dim RecLen As Int32            Try '捕获异常                RecLen = SockClient.Receive(AryMsg)            Catch ss As SocketException                ShowMsg(ss.Message)                Return            Catch s As Exception                ShowMsg(s.Message)                Return            End Try            Dim StrMsg As String            StrMsg = System.Text.Encoding.UTF8.GetChars(AryMsg, 0, RecLen)            ShowMsg("接收:" & StrMsg)        End While    End Sub    Sub ShowMsg(ByVal Msg As String) '显示信息        TxtMsg.AppendText(Format(DateTime.Now, "F") & vbCrLf & Msg & vbCrLf)    End Sub    Private Sub ButSendMsg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButSendMsg.Click        SendMsg(TxtSendMsg.Text.Trim)    End Sub    Sub SendMsg(ByVal Msg As String) '发送数据        Dim AryMsg() = System.Text.Encoding.UTF8.GetBytes(Msg)        Try '捕获异常            SockClient.Send(AryMsg)        Catch ss As SocketException            ShowMsg(ss.Message)            Return        Catch s As Exception            ShowMsg(s.Message)            Return        End Try        ShowMsg("发送:" & Msg)    End SubEnd Class'这个简单的例子就到这了


	
				
		
原创粉丝点击