VB Socket编程(Winsock控件创建TCP/IP客户机/服务器程序)
 
   Winsock控件建立在TCP、UDP协议的基础上,完成与远程计算机的通信。即使对TCP/IP不太熟悉的用户,使用该控件也可以在十几分钟内创建一 个简单的客户机/服务器程序。下面我们对Winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。
下面是Winsock控件的相关属性,方法和事件。(略去一些暂用不到的)
*属性

-------------------------------------------------------------------------
LocalHostName >
先在一台计算机上运行服务器程序,此时窗口上只有一个“退出”按钮。 再在另一台计算机上运行客户机程序,在“连接”按钮右边的文本框中输入服务器的主机名后单击“连接”按钮。如果连接成功,则服务器和客户机程序窗口都会出 现两个文本框。这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现。
服务器程序使用的控件如下:
(1)Command1:退出按钮;
(2)textsend:发送数据文本框;
(3)Winsockserver: 服务器Winsock;
(4)textget :接收数据文本框。
服务器程序的界面如图所示。

服务器程序的源代码如下:

[vb] view>False

  • textget.Visible = False
  • Winsockserver.LocalPort = 1001
  • Winsockserver.Listen
  • End Sub
  • Private Sub textsend_Change()
  • Winsockserver.SendData textsend.Text
  • End Sub
  • Private Sub Winsockserver_Close()
  • Winsockserver.Close
  • End
  • End Sub
  • Private Sub Winsockserver_ConnectionRequest(ByVal requestID As Long)
  • textsend.Visible = True
  • textget.Visible = True
  • If Winsockserver.State <> sckClosed Then Winsockserver.Close
  • Winsockserver.Accept requestID
  • End Sub
  • Private Sub Winsockserver_DataArrival(ByVal bytesTotal As Long)
  • Dim tmpstr As String
  • Winsockserver.GetData tmpstr
  • textget.Text = tmpstr
  • End Sub

客户机程序使用的控件如下:
(1)Command1:退出按钮;
(2)Command2:连接按钮;
(3)Winsockclient:客户Winsock;
(4)Text1:主机名文本框;
(5)Textsend:发送数据文本框;
(6)Textget:接收数据文本框;   
客户机程序的源代码如下:

[vb] view>False

  • textget.Visible = False
  • Winsockclient.RemotePort = 1001
  • Winsockclient.RemoteHost = "sccdsz"
  • End Sub
  • Private Sub Text1_Change()
  • Winsockclient.RemoteHost = Text1.Text
  • End Sub
  • Private Sub textsend_Change()
  • Winsockclient.SendData textsend.Text
  • End Sub
  • Private Sub Winsockclient_Close()
  • Winsockclient.Close
  • End
  • End Sub
  • Private Sub winsockclient_Connect()
  • textsend.Visible = True
  • textget.Visible = True
  • Command2.Visible = False
  • End Sub
  • Private Sub winsockclient_DataArrival(ByVal bytesTotal As Long)
  • Dim tmpstr As String
  • Winsockclient.GetData tmpstr
  • textget.Text = tmpstr
  • End Sub  
     
建立多个客户端

Private intMax As Long

Private Sub Form_Load()
intMax = 0
sckServer(0).LocalPort = 1001
sckServer(0).Listen
End Sub Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
If Index = 0 Then
intMax = intMax + 1
Load sckServer(intMax)
sckServer(intMax).LocalPort = 0
sckServer(intMax).Accept requestID
Load txtData(intMax)
End If
End Sub

UDP 初步

创建 UDP 应用程序比创建 TCP 应用程序还要简单,因为 UDP 协议不需要显式的连接。在上面的 TCP 应用程序中,一个 Winsock 控件必须显式地进行“监听”,另一个必须使用 Connect 方法初始化连接。

UDP 协议不需要显式的连接。要在两个控件中间发送数据,需要完成以下的三步(在连接的双方):

  1. 将 RemoteHost 属性设置为另一台计算机的名称。
  2. 将 RemotePort 属性设置为第二个控件的 LocalPort 属性。
  3. 调用 Bind 方法,指定使用的 LocalPort。(下面将详细地讨论该方法。)

因为两台计算机的地位可以看成“平等的”,这种应用程序也被称为点到点的。为了具体说明这个问题,下面将创建一个“聊天”应用程序,两个人可以通过它进行实时的交谈。

要创建一个 UDP 伙伴,请按照以下步骤执行:

  1. 创建一个新的 Standard EXE 工程。
  2. 将缺省的窗体的名称修改为 frmPeerA。
  3. 将窗体的标题修改为“Peer A”。
  4. 在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerA。
  5. 在“属性”页上,单击“协议”并将协议修改为 UDPProtocol。
  6. 在窗体中添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。
  7. 为窗体增加如下的代码。
VBScript code复制代码
Private Sub Form_Load()
'控件的名字为 udpPeerA
With udpPeerA
'重点:必须将 RemoteHost 的值
'修改为计算机的名字。
.RemoteHost = "PeerB"
.RemotePort = 1001 '连接的端口号。
.Bind 1002 '绑定到本地的端口。
End With
frmPeerB.Show '显示第二个窗体。
End Sub Private Sub txtSend_Change()
'在键入文本时,立即将其发送出去。
>Text
End Sub Private Sub udpPeerA_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
>Text = strData
End Sub

要创建第二个 UDP 伙伴,请按照以下步骤执行:

  1. 在工程中添加一个标准窗体。
  2. 将窗体的名字修改为 frmPeerB。
  3. 将窗体的标题修改为“Peer B”。
  4. 在窗体中放入一个 Winsock 控件,并将其命名为 udpPeerB。
  5. 在“属性”页上,单击“协议”并将协议修改为“UDPProtocol”。
  6. 在窗体上添加两个 TextBox 控件。将第一个命名为 txtSend,第二个命名为 txtOutput。
  7. 在窗体中添加如下的代码。
VBScript code复制代码
Private Sub Form_Load()
'控件的名字为 udpPeerB。
With udpPeerB
'重点:必须将 RemoteHost 的值改为
'计算机的名字。
.RemoteHost = "PeerA"
.RemotePort = 1002 '要连接的端口。
.Bind 1001 '绑定到本地的端口上。
End With
End Sub Private Sub txtSend_Change()
'在键入后立即发送文本。
>Text
End Sub Private Sub udpPeerB_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
>Text = strData
End Sub

如果要试用上面的例子,按 F5 键运行工程,然后在两个窗体的 txtSend TextBox 中分别键入一些文本。键入的文字将出现在另一个窗体的 txtOutput TextBox 中。

关于 Bind 方法

在上面的代码中,在创建 UDP 应用程序时调用了 Bind 方法,这是必须的。Bind 方法的作用是为控件“保留”一个本地端口。例如,如果将控件绑定到 1001 号端口,那么其它应用程序将不能使用该端口进行“监听”。该方法阻止其它应用程序使用同样的端口。

Bind 方法的第二个参数是任选的。如果计算机上存在多个网络适配器,可以用 LocalIP 参数来指定使用哪一个适配器。如果忽略该参数,控件使用的将是计算机上“控制面板”设置中“网络”控制面板对话框中列出的第一个适配器。

在使用 UDP 协议的时候,可以任意地改变 RemoteHost 和 RemotePort 属性,同时始终保持绑定在同一个 LocalPort 上。TCP 协议与此不同,在改变 RemoteHost 和 RemotePort 属性之前,必须先关闭连接。

 
————————————————————————————————————————————————————————————————————-
以上为介绍,可以有个大概的了解,也是转载的,不过当时情况混乱,没有附链接……
以下为完整的一个多对一的TCP通信实例,感谢原作者的帮助!转自:http://www.cnblogs.com/findw/archive/2012/06/22/2558876.html
—————————————————————————————————————————————————————————————————————
 
 
  1. 1 通信程序通常都是采用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中一个用来侦听网上请求信号,取名为Listener;另外一个为初始的连接口,取名叫Sock(0)。注意,后一个控件要设为动态数组的形式,以后当客户增多时,可在这个控件基础上动态增加。由于受资源限制,我们在本例中设定最多可以同时接纳15个客户。客户机一般只与一个主机相连,因此程序只须一个Winsock进行连接就足够了。这个程序要用到的控件较少,除了Winsock和Form控件外,只须再添加Commmand控件即可。下面是具体程序和详细注释。
  2. 2 ******************************
  3. 3 '服务器程序
  4. 4 ******************************
  5. 5 Option Explicit
  6. 6 定义常量
  7. 7 Const BUSY As Boolean = False
  8. 8 Const FREE As Boolean = True
  9. 9 定义连接状态
  10. 10 Dim ConnectState() As Boolean
  11. 11 Private Sub Form_Load()
  12. 12 ReDim Preserve ConnectState(0 To 1)
  13. 13 On Error Resume Next
  14. 14 ConnectState(0) = FREE
  15. 15 ConnectState(1) = FREE
  16. 16 '指定网络端口号
  17. 17 Listener.LocalPort = 1011
  18. 18 '开始侦听
  19. 19 Listener.Listen
  20. 20 End Sub
  21. 21 Private Sub Listener_ConnectionRequest(ByVal requestID As Long)
  22. 22 Dim SockIndex As Integer
  23. 23 Dim SockNum As Integer
  24. 24 On Error Resume Next
  25. 25 Form1.Print requestID & "连接请求"
  26. 26 '查找连接的用户数
  27. 27 SockNum = UBound(ConnectState)
  28. 28 If SockNum > 14 Then
  29. 29 Form1.Print SockIndex & ""
  30. 30 Exit Sub
  31. 31 End If
  32. 32 '查找空闲的sock
  33. 33 SockIndex = FindFreeSocket()
  34. 34 '如果已有的sock都忙,而且sock数不超过15个,动态添加sock
  35. 35 If SockIndex > SockNum Then
  36. 36 Load Sock(SockIndex)
  37. 37 End If
  38. 38 ConnectState(SockIndex) = BUSY
  39. 39 Sock(SockIndex).Tag = SockIndex
  40. 40 '接受请求
  41. 41 Sock(SockIndex).Accept (requestID)
  42. 42 Form1.Print SockIndex & "接受请求"
  43. 43 End Sub
  44. 44
  45. 45 '客户断开,关闭相应的sock
  46. 46 Private Sub Sock_Close(Index As Integer)
  47. 47 If Sock(Index).State <> sckClosed Then
  48. 48 Sock(Index).Close
  49. 49 End If
  50. 50 ConnectState(Index) = FREE
  51. 51 Form1.Print Index & "close"
  52. 52 End Sub
  53. 53
  54. 54 '接收数据
  55. 55 Private Sub Sock_DataArrival(Index As Integer, ByVal bytesTotal As Long)
  56. 56 Dim dx As Double
  57. 57 Form1.Print "数据来自" & Index
  58. 58 Sock(Index).GetData dx, vbDouble
  59. 59 Form1.Print "dx=" & dx
  60. 60 End Sub
  61. 61
  62. 62 '寻找空闲的sock
  63. 63 Public Function FindFreeSocket()
  64. 64 Dim SockCount, i As Integer
  65. 65 SockCount = UBound(ConnectState)
  66. 66 For i = 0 To SockCount
  67. 67 If ConnectState(i) = FREE Then
  68. 68 FindFreeSocket = i
  69. 69 Exit Function
  70. 70 End Ifs
  71. 71 Next i
  72. 72 ReDim Preserve ConnectState(0 To SockCount + 1)
  73. 73 FindFreeSocket = UBound(ConnectState)
  74. 74 End Function
  75. 75
  76. 76 ***************************
  77. 77 '客户程序
  78. 78 ’***************************
  79. 79 Option Explicit
  80. 80 '发送数据
  81. 81 Private Sub command1_Click()
  82. 82 Dim dx As Double
  83. 83 dx = 23.9
  84. 84 sock.SendData dx
  85. 85 MsgBox ("data sended")
  86. 86 End Sub
  87. 87
  88. 88 Private Sub Form_Load()
  89. 89 '远程主机名
  90. 90 sock.RemoteHost = "media2"
  91. 91 '网络端口
  92. 92 sock.RemotePort = 1011
  93. 93 '发出连接命令
  94. 94 sock.Connect
  95. 95 Command1.Enabled = False
  96. 96 End Sub
  97. 97
  98. 98 '服务器关闭
  99. 99 Private Sub sock_Close()
  100. 100 MsgBox ("socket closed")
  101. 101 End Sub
  102. 102
  103. 103 '连接成功
  104. 104 Private Sub sock_Connect()
  105. 105 MsgBox ("socket connected")
  106. 106 Command1.Enabled = True
  107. 107 End Sub
  108. 复制代码

[转]vb socket通信(TCP/UDP)一对一、多对一的更多相关文章

  1. php socket通信(tcp/udp)

    注意 1.在socket_bind的时候ip地址不能真回环地址如127.0.0.1 2.server.php后台跑起来的时候 nohup php server.php > /var/tmp/a. ...

  2. 网络编程—网络基础概览、socket,TCP/UDP协议

    网络基础概览 socket概览 socket模块—TCP/UDP的实现 TCP/UDP总结 网络基础概览 osi七层协议各层主要的协议 # 物理层传输电信号1010101010 # 数据链路层,以太网 ...

  3. Python的网络编程[0] -> socket[2] -> 利用 socket 建立 TCP/UDP 通信

    Socket 目录 socket 的 TCP/IP 通信基本建立过程 socket 的 UDP 通信基本建立过程 socket 的 UDP 广播式通信基本建立过程 socket 的多线程通信建立过程 ...

  4. 网络编程、三要素、Socket通信、UDP传输、TCP协议、服务端(二十五)

    1.网络编程概述 * A:计算机网络 * 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传 ...

  5. SOCKET,TCP/UDP,HTTP,FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  6. [网络] SOCKET, TCP/UDP, HTTP, FTP

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  7. socket http tcp udp ip 协议

    Socket可以支持不同的传输层协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接. socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作 ...

  8. rpc、socket、tcp/udp简要梳理

    RPC:远程过程调用(分布式.微服务间的方法调用) HTTP:无状态,每次请求都要发送一个request,服务器响应之后就断掉(http header中的keep-alive指的是tcp) TCP:面 ...

  9. Python的网络编程[0] -> socket[0] -> socket 与 TCP / UDP

    Socket socket 简述 / socket Abstract 网络进程通信与 socket 网络中进程之间如何通信,首要解决的问题是如何唯一标识一个进程,否则通信无从谈起.在本地可以通过进程 ...

随机推荐

  1. 获取ip ,百度地图坐标点 和 在 后台调用 url()

        protected  void getip()         {             string ips = HttpContext.Current.Request.UserHostA ...

  2. C++求一个十进制的二进制中1的个数

    int oneNumInBinary(int n){ ; while(n){ n = n&(n-); cnt++; } return cnt; }

  3. 好用的Markdown编辑器一览

    Markdown 是一种简单的.轻量级的标记语法.用户可以使用诸如 * # 等简单的标记符号以最小的输入代价生成极富表现力的文档. Markdown具有很多优点: 写作中添加简单符号即完成排版,所见即 ...

  4. RSA加密

    1.RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密? 答:公钥加密私钥可解,私钥加密公钥可解. 2.RSA非对称加密特点? 答:算法强度复杂.加密解密速度比对称加密解密的速度慢.一个公钥,对外开 ...

  5. Django补充及初识Ajax

    Django创建一对多表结构 首先现在models.py中写如下代码: from django.db import models # Create your models here. class Bu ...

  6. js时间格式化

    const formatDate = timestamp => { const date = new Date(timestamp); const m = date.getMonth() + 1 ...

  7. Google Code Jam Round 1A 2015 解题报告

    题目链接:https://code.google.com/codejam/contest/4224486/ Problem A. Mushroom Monster 这题题意就是,有N个时间点,每个时间 ...

  8. 用花生壳实现内网映射,决解无域名、无公网IP、无服务器空间问题

    无域名.无公网IP.无服务器空间用花生壳提供的免费内网映射吧.你的PC就是服务器,花生壳提供的自定义二级域名轻松访问你的个人网站. 1.首先你得注册哦,然后申请免费的域名(2个) 2.设置路由器,下面 ...

  9. 用于 Linux 平台的 Java

    切换到所需的安装目录.键入:cd directory_path_name例如,要将软件安装到 /usr/java/ 目录中,请键入:cd /usr/java/ 将 .tar.gz 档案二进制文件移到当 ...

  10. Nodejs express 文件上传

    文件上传 以下我们创建一个用于上传文件的表单,使用 POST 方法,表单 enctype 属性设置为 multipart/form-data. index.htm 文件代码修改如下: <html ...