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

简介:

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

注意:本文转载自http://blog.csdn.net/geohuskyer/article/details/6261062

说明:我是在最近开发一个考试系统过程中搜索到上面文章的,它提供的思想非常实用。当然,这篇文章仅提供了一个基本思路,详细的实现在人民邮电出版社出版的《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.   

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

  4. Winsock1.GetData strGet  

  5. Text1.Text = strGet  

  6. 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.   

  3. Dim i As Integer  

  4.   

  5. '遍历控件  

  6. For i = 0 To Sock.UBound  

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

  8. Next  

  9.   

  10. If SockIndex = 8888 Then  

  11.     Load Sock(Sock.UBound + 1)  

  12.     SockIndex = Sock.UBound  

  13. End If  

  14.   

  15. '接受请求  

  16. Sock(SockIndex).Accept (requestID)  

  17. 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 IntegerByVal bytesTotal As Long)  

  1. Dim strGet As String  

  2.   

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

  4. Sock(Index).GetData strGet  

  5. Text2.Text = strGet  

  6. 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很简单但学习的时候也是着实费了不少力气,为了能给以后的初学者提供一点参考的范例所以俺写了这篇短文,并且尽量采用简单的语言来给大家演示,希望能对初学者有点帮助。












本文转自朱先忠老师51CTO博客,原文链接:http://blog.51cto.com/zhuxianzhong/1440176 ,如需转载请自行联系原作者




相关文章
|
10天前
|
人工智能 搜索推荐 程序员
用 Go 语言轻松构建 MCP 客户端与服务器
本文介绍了如何使用 mcp-go 构建一个完整的 MCP 应用,包括服务端和客户端两部分。 - 服务端支持注册工具(Tool)、资源(Resource)和提示词(Prompt),并可通过 stdio 或 sse 模式对外提供服务; - 客户端通过 stdio 连接服务器,支持初始化、列出服务内容、调用远程工具等操作。
151 3
|
1月前
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
75 10
|
3月前
|
存储 开发工具 git
[Git] 深入理解 Git 的客户端与服务器角色
Git 的核心设计理念是分布式,每个仓库既可以是客户端也可以是服务器。通过 GitHub 远程仓库和本地仓库的协作,Git 实现了高效的版本管理和代码协作。GitHub 作为远程裸仓库,存储项目的完整版本历史并支持多客户端协作;本地仓库则通过 `.git` 文件夹独立管理版本历史,可在离线状态下进行提交、回滚等操作,并通过 `git pull` 和 `git push` 与远程仓库同步。这种分布式特性使得 Git 在代码协作中具备强大的灵活性和可靠性。
94 18
[Git] 深入理解 Git 的客户端与服务器角色
|
4月前
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
1553 16
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
5月前
|
开发框架 .NET C#
在 ASP.NET Core 中创建 gRPC 客户端和服务器
本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
95 5
在 ASP.NET Core 中创建 gRPC 客户端和服务器
|
6月前
|
Python
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
使用Python的socket库实现客户端到服务器端的图片传输,包括客户端和服务器端的代码实现,以及传输结果的展示。
256 3
Socket学习笔记(二):python通过socket实现客户端到服务器端的图片传输
|
6月前
|
JSON 数据格式 Python
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
本文介绍了如何使用Python的socket模块实现客户端到服务器端的文件传输,包括客户端发送文件信息和内容,服务器端接收并保存文件的完整过程。
316 1
Socket学习笔记(一):python通过socket实现客户端到服务器端的文件传输
|
6月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
149 4
|
6月前
|
安全 区块链 数据库
|
22天前
|
存储 缓存 网络协议
阿里云特惠云服务器99元与199元配置与性能和适用场景解析:高性价比之选
2025年,阿里云长效特惠活动继续推出两款极具吸引力的特惠云服务器套餐:99元1年的经济型e实例2核2G云服务器和199元1年的通用算力型u1实例2核4G云服务器。这两款云服务器不仅价格亲民,而且性能稳定可靠,为入门级用户和普通企业级用户提供了理想的选择。本文将对这两款云服务器进行深度剖析,包括配置介绍、实例规格、使用场景、性能表现以及购买策略等方面,帮助用户更好地了解这两款云服务器,以供参考和选择。

热门文章

最新文章