说明:我是在最近开发一个考试系统过程中搜索到上面文章的,它提供的思想非常实用。当然,这篇文章仅提供了一个基本思路,详细的实现在人民邮电出版社出版的《Visual Basic网络通信协议分析与应用实现》(汪晓平 钟军等编著)有更精彩的,在4.3《Winsock控件实现TCP聊天》一章,供开发者参考。

上面引用文章的原文如下:

使用winsock控件可以实现客户端和服务器间C/S结构的通信,如果把客户端和服务器放置于同一台电脑中,并且将客户端winsock的RemoteHost设置为本机IP,则可以实现客户端程序和服务端程序间的自由通信。在应用程序之间采用winsock通信比内存共享等方法更简单快捷,同时也更安全。

在客户端中添加一个窗体,拖拽一个winsock控件到该窗体上。

Private Sub Form_Load()

  1. Me.Winsock1.RemoteHost = "192.168.1.5"

  2. Me.Winsock1.RemotePort = 10002

  3. Me.Winsock1.Connect

  4. End Sub

Private Sub Form_Load() Me.Winsock1.RemoteHost = "192.168.1.5" Me.Winsock1.RemotePort = 10002 Me.Winsock1.Connect End Sub

RemoteHost代表需要连接的远程服务器IP地址,局域网中的通信可以使用路由器分配的IP地址。

RemotePort代表端口号,服务器和客户端通过该端口进行连接。

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

  1. Dim strGet As String

  2. '接收字符串并写入Text1控件中

  3. Winsock1.GetData strGet

  4. Text1.Text = strGet

  5. End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) Dim strGet As String '接收字符串并写入Text1控件中 Winsock1.GetData strGet Text1.Text = strGet End Sub

当客户端的winsock接收到服务器发送来的数据后会触发Winsock1_DataArrival事件,利用GetData方法可以将数据读取出来,一般来说将数据读取到byte()数组中是最好的,因为利用字节数组可以收发图片、音频等文件,本例中为了演示所以直接用一个字符串变量来读取数据了。

Dim strSet As String

  1. Winsock1.SendData strSet

Dim strSet As String Winsock1.SendData strSet

客户端向服务器发送数据可以用SendData方法,该方法同样可以发送字节数组,这里为了演示所以发送了个字符串。

服务器端为了能同时和很多个不同的客户端进行通信,所以需要采用winsock控件数组,在服务器窗体中拖拽一个winsock控件,将其名称更改为Listener,该控件用于接收客户端的连接请求。再拖拽一个winsock控件到窗体中,然后将其Index属性更改为0,0即代表该控件是一个控件数组,为了使用方便所以把控件名称更改为Sock,该控件数组用于动态的和不同的客户端通信。

在服务器端的窗口中写入如下代码:

Private Sub Form_Load()

  1. Load Sock(0)

  2. Listener.LocalPort = 10002   '端口号

  3. Listener.Listen             '开始侦听

  4. End Sub

Private Sub Form_Load() Load Sock(0) Listener.LocalPort = 10002 '端口号 Listener.Listen '开始侦听 End Sub

利用Listener来侦听,代码如下:

Private Sub Listener_ConnectionRequest(ByVal requestID As Long)

  1. Dim SockIndex As Integer: SockIndex = 8888

  2. Dim i As Integer

  3. '遍历控件

  4. For i = 0 To Sock.UBound

  5. If Sock(i).State = 0 Then SockIndex = i

  6. Next

  7. If SockIndex = 8888 Then

  8. Load Sock(Sock.UBound + 1)

  9. SockIndex = Sock.UBound

  10. End If

  11. '接受请求

  12. Sock(SockIndex).Accept (requestID)

  13. End Sub

Private Sub Listener_ConnectionRequest(ByVal requestID As Long) Dim SockIndex As Integer: SockIndex = 8888 Dim i As Integer '遍历控件 For i = 0 To Sock.UBound If Sock(i).State = 0 Then SockIndex = i Next If SockIndex = 8888 Then Load Sock(Sock.UBound + 1) SockIndex = Sock.UBound End If '接受请求 Sock(SockIndex).Accept (requestID) End Sub

当有客户端需要连接服务器时会触发Listener_ConnectionRequest事件,此时会遍历Sock控件数组,如果里面有空闲的Sock则用这个空闲的Sock和客户端进行连接,如果没有空闲的则重新Load一个进来。这里俺将SockIndex赋了个8888的值,这是因为用于和客户端连接的Sock控件数组的下标为0,为了省事所以赋了个8888,这个方法不***全的,所以大家别学我,呵呵

当客户端和服务器端成功连接后就可以利用Sock控件数组来和客户端相互传递数据了,当客户端将数据发送给服务器端时会触发Sock_DataArrival事件,代码如下:

Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)

  1. Dim strGet As String

  2. '接收字符串并写入text中

  3. Sock(Index).GetData strGet

  4. Text2.Text = strGet

  5. End Sub

Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim strGet As String '接收字符串并写入text中 Sock(Index).GetData strGet Text2.Text = strGet End Sub

Index参数代表正在和客户端保持连接的Sock控件数组的序号,而bytesTotal代表数据的长度(汗,这样解释貌似不怎么对)

,利用GetData方法即可以将数据读取出来。

如果服务器想给客户端发送数据,则直接用SendData方法即可,如下所示:

Dim strSend as String

  1. Sock(Index).SendData strSend

Dim strSend as String Sock(Index).SendData strSend

Index代表的是Sock数组的序号,如果想给所有保持连接的客户端都发送相同的内容,则可以遍历一下Sock数组,然后挨个发送就是了,如下所示:

For i = 0 To Sock.UBound

  1. If Sock(i).State = 7 Then

  2. Sock(i).SendData "范例"

  3. End If

  4. Next i

For i = 0 To Sock.UBound If Sock(i).State = 7 Then Sock(i).SendData "范例" End If Next i

如果服务器端想关闭某个连接,则需要关闭对应的Sock(),如下所示:

Sock(Index).Close

Sock(Index).Close

上面的这些代码演示了如何实现一个简单的C/S结构服务器和客户端连接。俺只是个业余编程爱好者,虽然VB很简单但学习的时候也是着实费了不少力气,为了能给以后的初学者提供一点参考的范例所以俺写了这篇短文,并且尽量采用简单的语言来给大家演示,希望能对初学者有点帮助。

VB6 通过winsock控件数组实现客户端和服务器多对一通信相关推荐

  1. VB6实现动态增加和删除控件数组中的控件2021-06-02

    VB6实现动态增加和删除控件数组中的控件 2021-6-3修改一个BUG 控件的添加: 1From1名称改为FrmWork 2.添加Picture控件名称改为PicCharacterContainer ...

  2. 基于VB中WINSOCK控件的网上象棋系统的实现

    本文发表在<微型机与应用>杂志2001年第3期. 基于 VB 中 WINSOCK 控件的网上象棋系统的实现 马根峰1   ,  孙艳2  , 王平1 (1.重庆邮电学院自动化学院,重庆,4 ...

  3. 如何利用Winsock控件编写自己的Internet程序

    VB自带的Winsock控件是一个非常强大的工具,利用它你可以在你的程序中使用各种Internet协议.如果你对网络协议及计算机之间通信的原理有所了解的话,理论上讲你可以编写任何Internet程序. ...

  4. WinSock控件及WinSockAPI

    WinSock简介       Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络 ...

  5. VFP中使用winsock控件收发二进制数据

    VFP中使用winsock控件收发网络数据时,如果包含有二进制数据,总是会丢失,或者与实际数据不符,这是由于字符转换的问题引起的. vfp的字符串本质与二进制数据没有任何区别,而所有的OCX控件和CO ...

  6. .NET中添加控件数组

    作者:cuike519的专栏   http://blog.csdn.net/cuike519/ 添加控件数组 在.NET里面我好像没有找到有关于控件数组的说明,但是前两天偶在网上看到了一篇关于如何在. ...

  7. 增强DropDownList和ListBox控件:保持客户端脚本添加的options

            DropDownList.ListBox由于Items是保存在ViewState中,回传后服务端会从ViewState恢复所有Items,所以,客户端对options的设置在回传后无法 ...

  8. C#中如何实现控件数组

    下面已制作label控件数组为例 System.Windows.Forms.Label[] labdesk =new Label[2]; for (int i=0;i<2;i++) { labd ...

  9. VB编程:全局变量控件数组实例简单计算器-12

    运行效果: 程序代码: Dim current, prev, choice    '全局变量 '-------------这段代码是个额外加上的小测试可以忽略---------- '--------- ...

最新文章

  1. python函数图像绘制、函数不固定_无法在函数中绘制tkinter图像
  2. 将不确定变为确定~对象被new后什么时候会抛System.NullReferenceException
  3. 爬虫学习笔记(十三)—— scrapy-redis(二):存储到MySQL、Scrapy项目部署
  4. DayDayUp:本博主预计2019下半年将会出两本书(关于人工智能算法及其实战案例应用方向、计算机算法竞赛集锦方向),如有合作意向,请留言告知
  5. 给采购凭证分配合作伙伴方案
  6. 转发程序无法决定链接类型
  7. 诗与远方:无题(四)
  8. 语言在线组卷系统_如何使用在线考试系统创建题库?
  9. Apache-Shiro-会话管理
  10. 基于单片机控制的程控有源滤波器电路
  11. 微警务:网上公安服务一键开启
  12. 三款Linux文件传输工具简单介绍
  13. 车联网V2X深度应用,聚焦CIDI智能网联交叉路口技术
  14. 不用社保也可以办理深圳居住证(全程网上办理) 解决提交后一直暂存状态
  15. Markdown 插入目录索引、更改目录名称方法
  16. 基于Android的医院挂号系统设计与实现(MySQL+Spring Boot+MyBatis+Android Studio+IDEA)
  17. 毕业设计 拉钩网招聘大数据分析与可视化
  18. 给入门程序员找培训班的一些建议
  19. 正则表达式匹配任意字符串
  20. 注意力模型(GAT)

热门文章

  1. SkipList 跳表
  2. ElasticSearch基础杂烩-配置-索引-优化
  3. 通过setTimeout处理click,dblclick,mousedown等事件的冲突
  4. Gantt Chart in JavaScript (HTML5) | FusionCharts
  5. 常用Git代码托管服务分享
  6. java常用类型转换
  7. 今天在YY上听课感觉不错
  8. 解密中国研发团队如何开发VS2010新特性
  9. 湖北大数据采集平台的应用价值及领域,数道云
  10. form表单只提交数据而不进行页面跳转的解决方案