在Excel中使用WinSock控件远程通信

在Excel中使用WinSock控件远程通信


这是我在实际使用时想要达到的一个目的。感谢万能的网络。但也损害了我用心去研究而获得最终成功的快感!
贵州大学计算机软件与理论研究所 李 元

  本文讨论在Excel 电子表格里使用对WinSock 控件的VBA 编程,实现电子表格数据在Internet 网络上远程通信。具体地说,我们要求在Internet 网络上的两个Excel 用户的工作簿启动后,能够连接起来,既可互相将自己工作表单元里已有的数据传送给对方,也可将在表单文字框里现场输入的数据传送给对方,而且无论哪方都可将接收到的数据传到工作表指定的单元里保存下来。这样,用Excel 不仅实现了工作表数据在Internet 网络上传输的功能,同时也达到了用Excel 实现一个“聊天室”的目的。

  为实现上述要求,可在Excel 中使用微软的WinSock 控件,用UDP 协议(无连接的通讯协议)或TCP 协议进行。下面叙述用UDP 进行的具体做法。

  一、工作簿:Book_A.XLS

  1. 设计工作簿Book_A.XLS 的表单
  运行Excel,将工作簿用Book_A 存盘,选“工具| 宏| Visual Basic 编辑器”,在出现的Visual Basic 编辑器窗口里选菜单“插入| 添加用户窗体”,鼠标右击窗体选“属性”在左面的窗体属性栏里对窗体做一些设置,例如:设置窗体的名称为:frmA (缺省名为UserForm1),窗体标题(缺省名为Caption):Caption="A 聊天室”等。

  设置信息输入输出文本框:从工具箱里将下列控件放到窗体上:两个文字框:TextBox1(用来输入要发送的字符串)、TextBox2(用来接受对方发送来的字符串);再放三个命令按钮:CommandButton1(用来执行发送文本框TextBox1 里的数据的过程)、CommandButton2(用来执行发送工作表Sheet1 单元Cells(1,1) 的数据的过程)、CommandButton3(用来将在TextBox2 里接收到的数据传到工作表Sheet1 里的单元Cells(3,1) 里保存的过程)。

  在窗口中添加WINSOCK 控件:选菜单的“工具| 附加控件”,选“Microsoft Winsock Cotrol"(在Win98 中是6.0 版,在\windows\sytem 下的mswinsck.ocx),这时,该控件的图标已在工具箱里出现,将它放入窗体中后,左面出现“Winsock1 Winsock"属性栏窗口,这里Winsock1 是该控件的缺省名(用于编写代码),可在该属性栏里进行下面的设置,也可如下用代码进行设置。

  2. 对工作簿Book_A.XLS 的表单进行VBA 编程

Private Sub CommandButton1_Click()
  ' 发送用户在文字框TextBox1 里的数据
  Winsock1.SendData TextBox1.Text
End Sub

Private Sub CommandButton2_Click()
  ' 发送用户工作表指定单元里的数据
  Winsock1.SendData Cells(1, 1).Value
End Sub

Private Sub CommandButton3_Click()
  ' 将接收的数据保存在单元Cells(3,1) 里
  Cells(3, 1).Value = "接收的数据:" +TextBox2.Text
  ' 将积分结果保存在当前的活动单元里
  ActiveCell.Value = "接收的数据:" +TextBox2.Text
End Sub

Private Sub TextBox1_Change()
  ' 发送用户输入
  'Winsock1.SendData TextBox1.Text
End Sub
'
Private Sub UserForm_Initialize()
Winsock1.Protocol = 1
'winsock 通讯协议设为UDP 协议1, TCP:0
  ' 设置网络地址
  Winsock1.LocalPort = 1999
  'Winsock1.RemoteHost = "210.40.7.168"
  Winsock1.RemoteHost = "Localhost" ' 在本机测试
  Winsock1.RemotePort = 1024
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
  Dim rec As String
  ' 接收对方数据并在Text2 中显示
  Winsock1.GetData rec, vbString
  TextBox2.Text = rec
End Sub
  最后,为使调用工作簿Bokk_A.XLS 时即运行表单,打开窗口:双击“工程——VBAProject"栏里的“ThisWorkBook",出现代码窗口,在Worksheet_Activate 事件里录入下列代码(这个过程实现当打开工作簿时,首先显示名为frmDemo 的窗体):

  Private Sub Workbook_Activate()
    frmA.Show
End Sub

  二、工作簿:Book_B.XLS 

  另一方的工作簿Book_B.XLS 的做法与工作簿Book_A.XLS 几乎完全一样,不同的是在表单的初始化事件里对网络通信的远程主机和端口设置:
  Private Sub UserForm_Initialize()
     ' 设置网络协议
    Winsock1.Protocol = 1
    'winsock 通讯协议设为UDP 协议1, TCP:0
    ' 设置网络地址
    Winsock1.LocalPort = 1024      ' 本地端口
    'Winsock1.RemoteHost = "210.40.7.188" ' 远程主机
    Winsock1.RemoteHost = "Localhost"  ' 远程主机
    Winsock1.RemotePort = 1999      ' 远程端口
End Sub

  本文设计在Win98/Excel97/2000 下通过,下面是运行情况(A 接收B 的数据)。



如果系统没有Winsock控件的话,可以下载下面的控件MSWINSCK.OCX,然后将该文件复制到C:\Windows\System32目录下。

在VBE窗口中,从菜单“工具”->“引用”中,点击“浏览”按钮,选择MSWinSCK.ocx文件,再从“工具箱”的“附加控件”中选择Microsoft Winsock Control。

此时使用Winsock控件的话,将会出现提示不安全的ActiveX控件的提示。可以点击同时下载的REG文件注册该控件即可。

 zudhVJHh.rar (48.41 KB, 下载次数: 693)

一般在Excel的窗体中添加Winsock控件。

使用Winsock控件的应用程序一般是Client/Server结构,也就是客户端/服务器端。

以服务端为例,一般的步骤是:

先设置LocalPort本地端口,然后使用Listen方法侦听数据请求。然后处理ConnectionRequest和DataArrival事件。使用完后使用Close方法关闭连接。

Private Sub UserForm_Initialize()
    Winsock1.LocalPort = 1999
    Winsock1.Listen
End Sub
Private Sub UserForm_Terminate()
    Winsock1.Close
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    If Winsock1.State <> sckClosed Then Winsock1.Close
    Winsock1.Accept requestID
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim Buffer() As Byte
    TransferedBytes = TransferedBytes + bytesTotal
    ReDim Buffer(bytesTotal - 1)
    Winsock1.GetData Buffer, vbArray + vbByte
End Sub
Private Sub Winsock1_Error(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    Debug.Print "Sock Err:" & Description
End Sub

而客户端的一般步骤如下:

设置远程服务器端口RemotePort属性,然后使用Connect方法连接。处理ConnectionRequest和DataArrival事件。发送数据就直接使用Send方法就可以了,可以发送字符串或者Byte数组。

Private Sub UserForm_Initialize()
    Winsock1.RemoteHost = "127.0.0.1"
    Winsock1.RemotePort = 2999
    Winsock1.Connect
End Sub
Private Sub UserForm_Terminate()
    Winsock1.Close
End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
    If Winsock1.State <> sckClosed Then Winsock1.Close
    Winsock1.Accept requestID
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String
    Winsock1.GetData strData, vbString
    If strData = "OK" Then
        Winsock1.Close
        Winsock1.RemotePort = 1999
        Winsock1.Connect
        MsgBox "You can send file now"
    End If
End Sub


  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
一、WinSock简介 Socket(套接字)最初是由加利福尼亚大学Berkeley(伯克利)分校为UNIX操作系统开发的网络通信接口,随着UNIX的广泛使用,Socket成为当前最流行的网络通信应用程序接口之一。20世纪90年代初,由Sun Microsystems,JSB,FTP software,Microdyne和Microsoft等几家公司共同定制了一套标准,即Windows Socket规范,简称WinSock。 VB编写网络程序主要有两种方式:1.winsock控件 2.winsockAPI 二、WinSock控件使用 1.WinSock控件的主要属性 LocalHostName属性 本地机器名 LocalIP属性 本地机器IP地址 LocalPort属性 本地机器通信程序的端口(0<端口<65536) RemoteHost属性 远程机器名 RemotePort属性 远程机器的通信程序端口 Protocol属性 通过Protocol属性可以设置WinSock控件连接远程计算机使用的协议。可选的协议是TCP和UDP对应的VB的常量分别是sckTCPProtocol和sckUDPProtocol,Winsock控件默认协议是TCP。注意:虽然可以在运行时设置协议,但必须在连接未建立或断开连接后。 SocketHandle属性 返回当前socket连接的句柄,这是只读属性。 RemoteHostIP属性 属性返回远程计算机的IP地址。在客户端,当使用控件的Connect方法后,远程计算机的IP地址就赋给了RemoteHostIP属性,而在服务器端,当ConnectRequest事件后,远程计算机(客户端)的IP地址就赋给了这个属性。如果使用的是UDP协议那么当DataArrival事件后,发送UDP报文的计算机的IP才赋给了这个属性。 ByteReceived属性 返回当前接收缓冲区的字节数 State属性 返回WinSock控件当前的状态 常数 值 描述 sckClosed 0 缺省值,关闭。 SckOpen 1 打开。 SckListening 2 侦听 sckConnectionPending 3 连接挂起 sckResolvingHost 4 识别主机。 sckHostResolved 5 已识别主机 sckConnecting 6 正在连接。 sckConnected 7 已连接。 sckClosing 8 同级人员正在关闭连接。 sckError 9   错误 2.WinSock主要方法 Listen方法 方法用于服务器程序,等待客户访问。格式:Winsock对象.listen Connect方法 用于向远程主机发出连接请求。格式:Winsock对象.connect [远程主机IP,远程端口] Accept方法 用于接受一个连接请求。格式:Winsock对象.accept Request ID Senddata方法 用于发送数据。格式:Winsock对象.senddata 数据 Getdata方法 用来取得接收到的数据。格式:Winsock对象.getdata 变量 [,数据类型 [,最大长度]] Close方法 关闭当前连接。格式:Winsock对象.close Bind方法 用Bind方法可以把一个端口号固定为本控件使用,使得别的应用程序不能再使用这个端口。 Listen方法Listen方法只在使用TCP协议时有用。它将应用程序置于监听检测状态。 Connect方法 当本地计算机希望和远程计算机建立连接时,就可以调用Connect方法。Connect方法调用的规范为:Connect RemoteHost,RemotePort Accept方法 当服务器接收到客户端的连接请求后,服务器有权决定是否接受客户端的请求。 SendData方法当连接建立后,要发送数据就可以调用SendData方法,该方法只有一个参数,就是要发送的数据。 GetData方法 当本地计算机接收到远程计算机的数据时,数据存放在缓冲区,要从缓冲区取出数据,可以使用GetData方法。GetData方法调用规范如下:GetData

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值