前端之家收集整理的这篇文章主要介绍了
VB.net做的一个简单的聊天的例,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
-
<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
'这个简单的例子就到这了