在VB中实现客户端程序自动查找并连接服务端程序

原创 2001年06月07日 17:31:00

 

 

 

 

在VB中实现客户端程序自动查找并连接服务端程序
               (南京审计学院教育技术中心 210029  丁国勇)
在一般的讲解WINSOCK控件的用法的文章中,无论是使用TCP还是UDP,客户端程序连接服务端程序时无一例外的要指定IP地址(或机器名)和端口号,那么,在端口已知而服务端程序所在机器地址或名称未知的情况下,怎样实现客户端程序发起并建立连接呢,笔者在实际编程中遇到了这种情况,并使用如下方法解决了这个问题。
这种方法巧妙的将 TCP与UDP结合起来,概括起来就是UDP查找,TCP连接。
对于客户端程序,使用了三个WINSOCK 控件:
1 sockclient   协议sckTcpprotocol 用于向服务端程序发起TCP连接
2 socklink     协议sckUdpprotocol 用于向本网广播地址发送数据
3 sockgetdata  协议sckUdpprotocol 用于接受从服务端程序返回的信息
定义一个String类型全局变量 MeIp,用于存放本机的IP地址。
在Form_load()事件中,编写如下程序:
Dim netbcaddress As String
MeIp = socklink.LocalIP     获得本机IP地址
netmask存放本网的广播地址,
设IP地址为192.168.100.215,子网掩码为255.255.255.0
该网的广播地址即为192.168.100.255,从本机IP地址怎样得到
广播地址请读者自己考虑。
sockgetdata.Bind "9400"  ' 定到本地端口9400
socklink.RemoteHost = netmask   '本网广播地址发送信息,内容是本机的IP地址
socklink.RemotePort = 9401
socklink.SendData "dgy.." & MeIp
在sockgetdata的DataArrival里这样定义
Private Sub sockgetdata_DataArrival(ByVal bytesTotal As Long)
Dim StrData As String
sockgetdata.GetData StrData  '得数据,数据为服务端程序所在机器的IP地址
If Trim(StrData) <> "" Then
sockclient.RemoteHost = StrData  '户端程序与服务端程序建立连接。
sockclient.RemotePort = 8092
sockclient.Connect
End If
End Sub
在服务端程序中,则要从广播地址获得客户端的IP地址,并将自己的IP地址发送到客户端,让客户
端与自己建立连接.
服务端程序中,同样也用到如下三个winsock控件:
1 sockserver控件数组  协议sckTcpprotocol 用于接受客户端的TCP连接
2 sockgetdata   协议sckUdpprotocol  用于从广播地址获得客户端的IP地址
3 sockudpsend   协议sckUdpprotocol  用于向客户端发送服务端程序的IP地址
在Form_load()中
sockgetdata.Bind "9401"  '9401端口侦听
定义如下结构和函数用于分离数据
Option Explicit
Private Type UdpData
    ok As Boolean
    IP As String
End Type
Private Function UdpDataSwitch(UdpData As String) As UdpData
Dim p As String
Dim MyStrs As Variant
Dim strs As Variant
p = ""
MyStrs = Split(UdpData, "..")
For Each strs In MyStrs
    If p = "dgy" Then
        UdpDataSwitch.ok = True
        UdpDataSwitch.IP = strs
        Exit Function
    End If
    p = strs
Next
UdpDataSwitch.ok = False
UdpDataSwitch.IP = ""
End Function
在sockgetdata的DataArrival事件中
Private Sub sockgetdata_DataArrival(ByVal bytesTotal As Long)
DoEvents
Dim DataArrival As String
Dim CanSend As Boolean
Dim Cip As String
sockudplink.GetData DataArrival
CanSend = UdpDataSwitch(DataArrival).ok
If CanSend = True Then
    sockudpsend.RemoteHost = UdpDataSwitch(DataArrival).IP
    sockudpsend.RemotePort =9400
    sockudpsend.SendData sockudpsend.LocalIP
    End If
End Sub
至于sockserver 怎样响应sockclient 的连接请求,看一般的介绍winsock编程的文章就可以
得到答案。
这样,就能完成在端口已知而服务端程序所在机器地址或名称未知的情况下,巧妙使用UDP和TCP,完成客户端程序与服务端程序的连接。
关于在VB中怎样得到本机所在网络的广播地址(特别是在动态获得IP地址的情况下),欢迎大家来信与我探讨   netmuse@njai.edu.cn

(注:本网广播地址可使用255.255.255.255,有兴趣的不妨试一试)
 

java__网络编程01

package cn.itcast.ip;import java.net.InetAddress; import java.net.UnknownHostException;/* 网络编程: 网络编...
  • qq_20261343
  • qq_20261343
  • 2015年09月19日 16:18
  • 191

VB中一个服务器和多个客户端的程序

具体的理论只是,参考  http://blog.csdn.net/olinxi1234567/article/details/40072229的上一部分...
  • oLinXi1234567
  • oLinXi1234567
  • 2014年10月15日 08:23
  • 1234

用Java实现一个简单的服务器与客户端程序

用Java实现一个简单的服务器与客户端程序 ====================================================================== Sampl...
  • Primary_wind
  • Primary_wind
  • 2012年05月04日 23:38
  • 3474

一个简单的服务器与客户端程序

利用linux系统IO、socket,实现服务器与客户端直接的通信
  • yk_ee
  • yk_ee
  • 2016年11月19日 21:25
  • 1209

Java网络编程(一)- 一个简单的服务端/客户端应用程序

在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能。Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程。下面所说的内容只适用...
  • tracker_w
  • tracker_w
  • 2013年05月04日 23:22
  • 2946

简单的计算器服务器端/客户端程序

//应用层协议 //客户端连接到服务器端后以1字节整数形式穿肚运算数个数 //客户端向服务器端传递的每个待算整数占4字节 //传递待算数后传递运算符,运算符占1字节 //选择字符+、-、*之一传递 ...
  • Hello_World_LVLcoder
  • Hello_World_LVLcoder
  • 2016年12月16日 21:03
  • 591

linux中UDP程序流程、客户端、服务端

UDP--- 用户数据报协议(User Datagram Protocol),是一个无连接的简单的面向数据报的运输层协议。   优点:传输速度快 缺点:不可靠   socket的中文意思是接...
  • xun527
  • xun527
  • 2017年08月15日 22:32
  • 179

Java服务器程序

---- 一、Java中的服务器程序与多线程 -- Java软件包内在支持的网络协议为TCP/IP,Java有关网络的类及接口定义在java.net包中。客户端软件通常使用java.net包中的核心类...
  • lanjun2005
  • lanjun2005
  • 2005年10月30日 11:20
  • 3744

vb中的 winsock如何实现监听功能和连接功能

通信程序通常都是采用Client/Server形式。这就要求作为服务器的主机可以同时处理多个客户的请求。因此在编写服务器程序时要添加多个Winsock控件。在开始我们先加入两个Winsock控件。其中...
  • tiger777
  • tiger777
  • 2007年12月31日 13:03
  • 2068

Oracle服务端和客户端版本补丁不一致造成Tuxedo应用程序出core案例

这是一个CU**系统调用的查询天气预报的Tuxedo服务,Oracle Pro*C程序,连接的是Oracle 10.2.0.4库,出现问题的现象是不定时的产生core,服务down,触发Tuxedo服...
  • bisal
  • bisal
  • 2016年12月20日 17:47
  • 930
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在VB中实现客户端程序自动查找并连接服务端程序
举报原因:
原因补充:

(最多只允许输入30个字)