A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马谦 中级黑马   /  2013-3-11 07:43  /  3595 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. 服务端:
  2. '用vb.net做一个简单的聊天工具,可以实现群发的
  3. Imports System.Threading
  4. Imports System.Net
  5. Imports System.Net.Sockets

  6. Public Class Form1

  7.     Dim ListenSocket As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) '创建监听的套接字
  8.     Dim Dict As New Dictionary(Of String, Socket) '用于保存连接的客户的套接字的键值对集合
  9.     Dim DictThre As New Dictionary(Of String, Thread) '用于保存通信线程的键值对集合

  10.     Private Sub ButListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButListen.Click '开始监听的按钮
  11.         TextBox.CheckForIllegalCrossThreadCalls = False '取消文本框的跨线程检查
  12.         Dim Address As IPAddress = IPAddress.Parse(TxtIP.Text.Trim)
  13.         Dim EndPoint As New IPEndPoint(Address, TxtPort.Text) '创建一个网络节点对象
  14.         ListenSocket.Bind(EndPoint) '给负责监听的套接字绑定一个网络节点
  15.         ListenSocket.Listen(2)
  16.         ShowMsg("正在监听……")
  17.         Dim thre As New Thread(AddressOf Connect) '创建一个新的线程用于处理客户端发来的连接请求
  18.         thre.IsBackground = True '设为后台线程
  19.         thre.Start() '开启线程
  20.     End Sub

  21.     Sub Connect() '处理客户端的连接请求的过程
  22.         While True
  23.             Dim SockConect As Socket = ListenSocket.Accept
  24.             ShowMsg("连接成功!" & "(连接信息:" & SockConect.RemoteEndPoint.ToString & ")")
  25.             Dict.Add(SockConect.RemoteEndPoint.ToString, SockConect) '将连接成功的套接字添加到键值对集合
  26.             LBOnLine.Items.Add(SockConect.RemoteEndPoint.ToString) '添加到列表
  27.             Dim Thre As New Thread(AddressOf RecClient) '创建一个新的线程用于和链接成功的套接字通信
  28.             Thre.IsBackground = True '设为后台线程
  29.             Thre.Start(SockConect)
  30.             DictThre.Add(SockConect.RemoteEndPoint.ToString, Thre) '将创建的通信线程添加到键值对集合
  31.         End While
  32.     End Sub

  33.     Sub RecClient(ByVal SockTelNet As Socket) '处理客户端发来的数据
  34.         While True
  35.             Dim AryMsg(1024) As Byte
  36.             Dim RecLen As Int32

  37.             Try '捕获异常
  38.                 RecLen = SockTelNet.Receive(AryMsg) '接受客户端发来得信息
  39.             Catch ss As SocketException
  40.                 ShowMsg(ss.NativeErrorCode & vbCrLf & ss.Message) '显示错误信息
  41.                 Dict.Remove(SockTelNet.RemoteEndPoint.ToString) '移除断开连接的套接字
  42.                 LBOnLine.Items.Remove(SockTelNet.RemoteEndPoint.ToString) '从列表中移除
  43.                 Return
  44.             Catch s As Exception
  45.                 ShowMsg(s.Message)
  46.                 Return
  47.             End Try

  48.             Dim StrMsg As String
  49.             StrMsg = System.Text.Encoding.UTF8.GetChars(AryMsg, 0, RecLen)
  50.             ShowMsg("接收:" & StrMsg)
  51.         End While
  52.     End Sub

  53.     Sub ShowMsg(ByVal Msg As String) '显示信息
  54.         TxtMsg.AppendText(Format(DateTime.Now, "F") & vbCrLf & "   " & Msg & vbCrLf & vbCrLf) 'TxtMsg用途显示消息记录
  55.     End Sub

  56.     Sub SendMsg(ByVal Msg As String) '发送信息
  57.         Dim AryMsg() = System.Text.Encoding.UTF8.GetBytes(Msg)
  58.         Try '捕获异常
  59.             Dict(LBOnLine.SelectedItem).Send(AryMsg) '给选中用户发送消息
  60.         Catch ss As SocketException
  61.             ShowMsg(ss.NativeErrorCode & vbCrLf & ss.Message)
  62.             Return
  63.         Catch s As Exception
  64.             ShowMsg(s.Message)
  65.             Return
  66.         End Try
  67.         ShowMsg("发送:" & Msg)
  68.     End Sub

  69.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 'Button1发送消息的按钮
  70.         SendMsg(TxtSendMsg.Text) '发送消息
  71.     End Sub

  72.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 'Button2群发的按钮
  73.         For Each a In Dict.Values '遍历通信套接字键值对集合,群发消息
  74.             Dim AryMsg() = System.Text.Encoding.UTF8.GetBytes(TxtSendMsg.Text.Trim)
  75.             Try '捕获异常
  76.                 a.Send(AryMsg) '发送消息
  77.             Catch ss As SocketException
  78.                 ShowMsg(ss.NativeErrorCode & vbCrLf & ss.Message)
  79.             Catch s As Exception
  80.                 ShowMsg(s.Message)
  81.             End Try
  82.         Next
  83.         ShowMsg("群发:" & TxtSendMsg.Text.Trim)
  84.     End Sub
  85. End Class
  86. 客户端:
  87. 客户端和服务端发送和接收数据的处理基本一样的,只是一个是主动连接的,一个是被动连接的
  88. Imports System.Net
  89. Imports System.Net.Sockets
  90. Imports System.Threading

  91. Public Class Form1
  92.     Dim SockClient As New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) '穿件一个

  93.     Private Sub ButListen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButListen.Click
  94.         TextBox.CheckForIllegalCrossThreadCalls = False '取消文本框的跨线程检查
  95.         Dim Address As IPAddress = IPAddress.Parse(TxtIP.Text.Trim)
  96.         Dim Endpoint As New IPEndPoint(Address, TxtPort.Text)
  97.         Try '捕获异常
  98.             SockClient.Connect(Endpoint) '发起连接
  99.         Catch ss As SocketException
  100.             ShowMsg(ss.Message)
  101.             Return
  102.         Catch s As Exception
  103.             ShowMsg(s.Message)
  104.             Return
  105.         End Try

  106.         ShowMsg("连接成功!")
  107.         Dim Thre As New Thread(AddressOf RecMsg) '创建接收数据的线程
  108.         Thre.IsBackground = True
  109.         Thre.Start()
  110.     End Sub

  111.     Sub RecMsg() '接受数据处理
  112.         While True
  113.             Dim AryMsg(1024) As Byte
  114.             Dim RecLen As Int32

  115.             Try '捕获异常
  116.                 RecLen = SockClient.Receive(AryMsg)
  117.             Catch ss As SocketException
  118.                 ShowMsg(ss.Message)
  119.                 Return
  120.             Catch s As Exception
  121.                 ShowMsg(s.Message)
  122.                 Return
  123.             End Try

  124.             Dim StrMsg As String
  125.             StrMsg = System.Text.Encoding.UTF8.GetChars(AryMsg, 0, RecLen)
  126.             ShowMsg("接收:" & StrMsg)
  127.         End While
  128.     End Sub

  129.     Sub ShowMsg(ByVal Msg As String) '显示信息
  130.         TxtMsg.AppendText(Format(DateTime.Now, "F") & vbCrLf & Msg & vbCrLf)
  131.     End Sub

  132.     Private Sub ButSendMsg_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButSendMsg.Click
  133.         SendMsg(TxtSendMsg.Text.Trim)
  134.     End Sub

  135.     Sub SendMsg(ByVal Msg As String) '发送数据
  136.         Dim AryMsg() = System.Text.Encoding.UTF8.GetBytes(Msg)

  137.         Try '捕获异常
  138.             SockClient.Send(AryMsg)
  139.         Catch ss As SocketException
  140.             ShowMsg(ss.Message)
  141.             Return
  142.         Catch s As Exception
  143.             ShowMsg(s.Message)
  144.             Return
  145.         End Try

  146.         ShowMsg("发送:" & Msg)
  147.     End Sub
  148. End Class
  149. 这个简单的例子就到这了
复制代码

评分

参与人数 1技术分 +7 黑马币 +8 收起 理由
黑马-吕老师 + 7 + 8 赞一个!(项目加分,与被贴内容无关).

查看全部评分

1 个回复

倒序浏览
值得学习ing!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马