关键词搜索

源码搜索 ×
×

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

发布2021-02-10浏览404次

详情内容

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

    vb.net教程c

    相关技术文章

    点击QQ咨询
    开通会员
    返回顶部
    ×
    微信扫码支付
    微信扫码支付
    确定支付下载
    请使用微信描二维码支付
    ×

    提示信息

    ×

    选择支付方式

    • 微信支付
    • 支付宝付款
    确定支付下载