VB如何使用Winsock进行1对多通信
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB如何使用Winsock进行1对多通信相关的知识,希望对你有一定的参考价值。
是在局域网内实现的通讯
01. 是不是建立几个连接就需要几个Winsock
02.自己有服务器的话如何做呢?是不是简单很多?具体怎样做?
03.自己没有服务器怎么做?
VB可通过通过创建Winsock控件数组,使用一个控件Winsock也可以同时接受多个连接请求。不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用 Accept 方法。
提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可使用它。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。
代码实例:
下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,intMax 被设置为 0,数组中第一个控件的
LocalPort 属性被设置为 1001。然后调用控件的 Listen 方法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连接请求
Option Explicit
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
Winsock数组就是form中画一个Winsock,把index属性设置成0
private sub form_load()
Winsock(0).localport=5555 '服务器端口
Winsock(0).listen
end sub
'重要: 当ConnectionRequest时,加载一个Winsock,用新的Winsock响应,新的Winsock会继承新的Winsock(0)的端口属性
Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Load Winsock1(Winsock1.Ubound+1)
Winsock1(Winsock1.Ubound).Accept requestID
End Sub
'这样就可以了
02:同下
03:服务器比普通计算机性能好,不过假如通讯规模小,普通计算机就行了,再去设置一下"TCP并发连接数",具体通讯代码和服务器是 一样的.本回答被提问者采纳 参考技术B 你看看有关VBWinsock的书籍吧,上面讲的比较全面
winsock多IP发送数据vb6
【中文标题】winsock多IP发送数据vb6【英文标题】:winsock multiple IP senddata vb6 【发布时间】:2012-10-31 06:58:38 【问题描述】:如果可以使用winsock 向不同IP 发送文本,我已经在不同的论坛中搜索了很长时间,但我找不到方法。 我尝试将两个不同的 Winsock 以相同的形式放置,但第二个 Winsock 的消息永远不会到达。 这是我的代码:
Private Sub Form_Load()
On Error Resume Next
a = bytMsg()
wsck.RemoteHost = strNombreATMMonitor2
wsck.RemotePort = vPuertoATMMonitor2
wsck.Connect
'Conectamos el segundo
Winsock1.RemoteHost = strNombreATMMonitor
Winsock1.RemotePort = vPuertoATMMonitor
Winsock1.Connect
End Sub
Private Sub wsck_Close()
On Error Resume Next
wsck.Close
End
End Sub
Private Sub wsck_Connect()
On Error GoTo Err_wsck_Connect
wsck.SendData a
End_wsck_Connect:
Exit Sub
Err_wsck_Connect:
GrabaLog "wsck_Connect", Err.Description, " " & Err.Number & " Host: " & strNombreATMMonitor
Resume End_wsck_Connect
End Sub
Private Sub wsck_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)
'si no es un recordatorio, lo grabo
If bytRecordatorio = 0 Then
GrabaOff strLineaComandos
End If
GrabaLog "wsck_Error", "RemoteHost" & " - " & wsck.RemoteHost & " - RemotePort - " & Trim(wsck.RemotePort), "Error = " & Trim(Number) & " - " & Description
End
End Sub
Private Sub wsck_SendComplete()
On Error GoTo Err_wsck_SendComplete
wsck.Close
'Graba en un log el mensaje de NCR pasado como parametro a ATMSpyNEW + FTP
TrazaLog "ATMMonitor1 - " & strLineaComandos
End_wsck_SendComplete:
End
Err_wsck_SendComplete:
GrabaLog "wsck_SendComplete", Err.Description, "" & Err.Number
Resume End_wsck_SendComplete
End Sub
Private Sub Winsock1_Close()
On Error Resume Next
Winsock1.Close
End
End Sub
Private Sub Winsock1_Connect()
On Error GoTo Err_Winsock1_Connect
Winsock1.SendData a
End_Winsock1_Connect:
Exit Sub
Err_Winsock1_Connect:
GrabaLog "Winsock1_Connect", Err.Description, " " & Err.Number & " Host: " & strNombreATMMonitor
Resume End_Winsock1_Connect
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)
'si no es un recordatorio, lo grabo
If bytRecordatorio = 0 Then
GrabaOff strLineaComandos
End If
GrabaLog "Winsock1_Error", "RemoteHost" & " - " & Winsock1.RemoteHost & " - RemotePort - " & Trim(Winsock1.RemotePort), "Error = " & Trim(Number) & " - " & Description
End
End Sub
有谁知道如何使用一个或两个 winsock 控件将一段文本发送到至少两个不同的 Ip (RemoteHost)?
【问题讨论】:
你肯定可以同时使用多个winsock对象。您确定有主机在监听第二个连接吗? 【参考方案1】:我创建了一个新的 VB6 项目并在 Form1 上添加了两个 Winsock 控件。即 Winsock1 和 Winsock2。然后我添加了两个文本框(仅用于测试以显示来自 Winsocks 的输入和输出)并将它们设置为允许多行。我添加了一个按钮(cmdSendData),它将向两个winsocks 发送数据。在 Form_Load 事件中,我让这两个 Winsocks 连接到我已经可以访问的公共 TelNet 服务器(您需要将 IP 地址更改为可以测试的地址)。我能够通过两个 Winsocks 发送数据(即使它们连接到同一台机器,它们的行为也不同,如果我知道我有另一个 IP 等待连接请求,可以轻松地将其中一个的 IP 更改为另一个)。
我跳过了错误处理,因为我相信您可以弄清楚该放在哪里。
Private Sub Form_Load()
Me.Winsock1.RemoteHost = "10.11.27.87"
Me.Winsock1.RemotePort = "23"
Me.Winsock1.Connect
Me.Winsock2.RemoteHost = "10.11.27.87"
Me.Winsock2.RemotePort = "23"
Me.Winsock2.Connect
End Sub
Private Sub cmdSendData_Click()
Me.Winsock1.SendData "admin" & vbCrLf
DoEvents 'This is necessary to immediatelly send the data without waiting for
' a certain buffer to be filled first
Me.Winsock2.SendData "admin" & vbCrLf
DoEvents 'same as above
End Sub
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim txt As String
Me.Winsock1.GetData txt
Me.Text1.Text = Me.Text1.Text & vbCrLf & txt
End Sub
Private Sub Winsock2_DataArrival(ByVal bytesTotal As Long)
Dim txt As String
Me.Winsock2.GetData txt
Me.Text2.Text = Me.Text2.Text & vbCrLf & txt
End Sub
【讨论】:
非常感谢!!我将尝试您的代码...但是在您的示例中,remoteHost Ip 在两个示例中都是“10.11.27.87”,更改它的结果是否相同? 是的。无论是相同的IP还是不同的IP都没有关系。只要你有两个独立的连接就可以完成这项工作以上是关于VB如何使用Winsock进行1对多通信的主要内容,如果未能解决你的问题,请参考以下文章
VB中使用winsock控件要实现网络通信怎么编程?服务端和客户端都必须各编个程序吗?