加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 08:18:58 所属栏目:百科 来源:网络整理
导读:- 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.Str
-
<pre name="code" class="vb">服务端:
'用vb.net做一个简单的聊天工具,可以实现群发的
Imports System.Threading
Imports System.Net
Imports System.Net.Sockets

Public 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,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 Sub
End Class
'客户端:
'客户端和服务端发送和接收数据的处理基本一样的,只是一个是主动连接的,一个是被动连接的
Imports System.Net
Imports System.Net.Sockets
Imports System.Threading

Public Class Form1
    Dim SockClient As New Socket(AddressFamily.InterNetwork,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,"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 Sub
End Class
'这个简单的例子就到这了

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读