加载中…
个人资料
玄雨清风
玄雨清风
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,889
  • 关注人气:36
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB Winsock控件创建多个连接

(2012-05-23 15:21:52)
标签:

it

分类: VB编程笔记

用VB写的一个简单的服务端程序,

服务器端程序:
Private Sub Form_Load()
    tcpserver.LocalPort = 1001     '将 LocalPort 属性设置为一个整数。
    tcpserver.Listen     '然后调用 Listen 方法。
End Sub


Private Sub tcpServer_ConnectionRequest(ByVal requestID As Long)
    If tcpserver.State <> sckClosed Then tcpserver.Close     '检查控件的 State 属性是否为关闭的。 '如果不是,    '在接受新的连接之前先关闭此连接。
    tcpserver.Accept requestID    '接受具有 requestID 参数的    '连接。
    msgbox("有人连接服务端")
End Sub


客服端程序

Private Sub Form_Load()
    tcpClient.RemoteHost = "192.168.1.2"
    tcpClient.RemotePort = 1001
End Sub

Private Sub cmdConnect_Click()   '连接按钮
    tcpClient.Connect
    MsgBox ("连接服务器成功")
End Sub
运行后,启动服务端,然后启动客户端,点“连接”按钮,客服端端跳出窗口“连接服务器成功”,服务端跳出窗口“有人连接服务端”。表示双方建立了连接。这个时候关闭客户端,然后再启动,点“连接”按钮,就只是跳出连接服务器成功(程序设置不完美)。然后在输入框中输入向服务端发送数据,出现“错误“40006” 所需事物请求的错误协议连接或连接状态”。这个时候发现第二次连接就不行,看来服务端只是支持单个连接,第二次连接相当于,第二个连接,就找不到服务器,这个错误跟没有启动服务端程序的错误是一样,说明客户端找不到服务端。
    解决办法:创建控件数组
上面设计的基本服务器只能接受一个连接请求。通过创建控件数组,使用一个控件也可以同时接受多个连接请求。利用这种方法,不需要关闭连接,而只需创建新的控件实例(通过设置其索引属性),然后在新的实例上调用 Accept 方法。

下面的代码假定名为 sckServer 的窗体上有一个 Winsock 控件,它的 Index 属性被设置为 0;因此控件是控件数组的一部分。在声明部分,声明了一个模块级的变量 intMax。在窗体的 Load 事件中,intMax 被设置为 0,数组中第一个控件的 LocalPort 属性被设置为 1001。然后调用控件的 Listen 方法,使之成为“监听”控件。在连接请求到达时,代码将检测 Index 是否为 0(“监听”控件的值)。如果为 0,监听控件将增加 intMax 的值,并使用该号码来创建新的控件实例。然后,使用新的控件实例接受连接请求。

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
   End If
End Sub

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有