2号机
2号机窗体(Form)上也放置两个Winsock控件,一个名为TcpLsn,负责监听3号机的呼叫请求,另外一个为TcpConn,这是个控件数组,Index为1,即已经加载了TcpConn(1),这个控件是为了与1号机建立连接。在初始化过程中(Form_Load)同样要设置2号机作为服务器的监听端口号,然后使其处于监听状态,还要设置与其他几个站点连接成功的标志:TcpConnected(数组)。2号机作为服务器监听的过程同上,而呼叫1号机是通过VB6的定时器(Timer)实现的,定时器的作用是每隔一段时间(可自行设定间隔事件)触发Timer事件,即执行Timer事件中的代码,利用这个原理就可以实现一运行此程序就自动进行呼叫工作,首先将定时器间隔时间定为1000毫秒(定时器命名为TimConn,TimConn.Interval = 1000),然后在定时时间到事件中(TimConn_Timer)调用TcpConn的Connect方法呼叫1号机,当然要加一个判断:当TcpConnected(1)=False且TcpConn(1).State=sckClosed时才进行呼叫。
在客户机调用了TcpConn方法后,其连接状态是sckConnecting(正在连接服务器,值为6)。如果此时1号机在一段时间内(连接服务器超时时间)没有接受请求或者根本没有开启,那么就会触发连接错误事件(TcpConn_Error),这时连接状态是sckError(连接错误,值为9),就无法再进行连接服务器的工作了,如果1号机此时打开,客户机也不会再呼叫服务器了。要解决这个问题,可以在TcpConn的错误事件中(TcpConn_Error)加上一条语句:TcpConn(Index).Close即在错误事件中关闭当前的连接,使当前TcpConn控件状态处于sckClosed,这样在下一次的定时时间到事件中客户机又能呼叫1号机了。呼叫1号机成功后,不要忘记在TcpConn的Connect事件中置连接1号机成功的标志位。同样要注意关闭事件中不能卸载TcpConn(1)。
3号机
3号机在所有站点中只呼叫1号机和2号机。所以只要一个Winsock控件数组即可,命名为TcpClient,Index=1。在程序初始化过程中,加载呼叫服务器的所有Winsock控件:Load TcpClient(2)
TcpClient(1)已经放在窗体中了,故不必重复加载。还要设置连接成功的标志位(TcpConnected数组为False),并设置定时器间隔时间。然后在定时时间到事件中调用TcpClient的Connect方法连接服务器,这与2号机作为客户机呼叫服务器的过程类似,同样要在TcpClient的连接错误事件中添加以下语句:TcpClient(Index).Close。要注意的是在服务器的断开连接触发的客户机关闭事件中(TcpClient_Close)只需要置标志位,而不能卸载TcpClient控件数组,因为其不是动态加载的。
到此为止,基本上实现了运行此程序即进行多机互连的功能。
典型问题解析
1.各个站点建立连接后关闭3号机的程序,在其它的站点就会弹出对象已加载的错误提示。出现这个错误的可能原因是Winsock控件已经加载,而后又执行了一次加载动作。不过实验证明不是此Winsock控件被重复加载。在微软公司的官方网站,VB6最新的Service Pack 5补丁(SP5)的说明文档中有这样一条很重要的修正说明:重复加载或卸载Winsock控件会引起内存泄露。这一修正是不是可以针对用Winsock控件实现网络连接及通讯的程序呢?理论实践证明了这一猜测的真实性。下载完SP5并成功安装后,将程序原封不动运行一遍,“对象已加载”的错误窗口就再没出现过,这个问题也就成功的解决了。
2.由于设置了客户机的本地端口号(LocalPort),导致必须先关闭服务器再关闭客户机才能在下一次正常连接以及客户机异常退出时(比如客户机突然停电)导致下次无法正常连接。这是由于没有释放连接端口号造成的。这个错误的解决方法是不要设置客户机的本地端口号;如果非得设置,那么可以利用动态改变服务器监听端口号和客户机呼叫端口号的方法。具体做法是在服务器的Form_Load中改变监听端口号,在客户机的Winsock控件错误事件中改变呼叫端口号,端口号只要用两个就可以了(如1000和1001)。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




