动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Visual Basic教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Visual Basic教程 ]的信息

本月文章推荐
.保存窗口位置来增加专业性.
.动态改变屏幕设置.
.用VB编写一个光驱保镖.
.在VB5中生成统计图形.
.VB中使用数据窗体设计器插件.
.在VB中调用API函数动态改变及恢复.
.VB随机图像的魅力.
.使用调用外部程序函数实现API函数.
.VB查找并替换WORD文档中的字符串.
.VB5.0中实现鼠标拖放.
.用VisualBasic与MS-Draw开发通用.
.一个实用的VB屏幕程序.
.VB数据库数据的选项录入及选项增.
.开发ADOCE搭配WinCE资料存取应用.
.如何自动移动Mouse.
.SQLServer数据对象结构的动态建立.
.创建新表时,快速拷贝字段.
.VB入门之“HelloWorld”.
.VBScript数据类型.
.巧用VB编程使XMPLAYER自动播放VCD.

VB6实现局域网多站点互连手册

发表日期:2006-2-27 |


这里对Winsock控件的属性、方法和事件的介绍限于篇幅就不介绍了,下面以最简单的C/S模式下一台服务器和一台客户机的连接来说明其整个连接过程。

  用框图表示如图1所示。首先运行服务器端的程序,使TcpServer处于监听状态,然后运行客户机端的程序,单击【连接服务器】按钮后,客户机端调用Connect方法呼叫服务器(根据RemoteHostIP远程计算机IP地址和RemotePort远程计算机端口号两个参数),然后客户机便处于正在连接服务器状态,等待服务器的响应。客户机调用Connect方法触发了服务器ConnectRequest事件,这时服务器端可以在此事件中判断是否要接受客户机的请求,如要就调用Accept方法,并置标志位说明已成功连接客户机。服务器端调用Accept方法后又触发了客户机端Connect事件,说明服务器端接受客户端的请求,双方已经建立连接了,这时再置客户机端的标志位,这就是一个完整的连接过程。当服务器或客户机调用Close方法关闭连接时,都会触发对方的Close事件,使其关闭连接。另外建立连接后发送数据的情况是客户机通过调用SendData方法发送数据给服务器,会触发服务器端的DataArrival事件,在这个事件中,服务器端可以调用GetData或PeekData方法把客户机发来的数据保存起来。服务器给客户机发信息同理。要注意一点的是,在服务器的Close事件中应该加上继续监听的代码,这样客户机才可以继续呼叫服务器。



  Winsock控件实现多机互连方案

  下面是实现多机互连的三种方案。这里以三台机(分别命名为1号机、2号机和3号机)为例介绍。

  方案一:一台机作为服务器,其余两台机作为客户机

  1号机作为服务器,用一个Winsock控件数组负责监听客户机的呼叫请求并用来与客户机建立连接。用TcpServer(2)和TcpServer(3)两个Winsock控件数组分别与2号机和3号机建立连接。

  这里采用的是动态加载和卸载Winsock控件数组来实现连接的,也就是服务器一定要开着,下面的客户机才能与其通过Winsock控件实现通讯,当服务器已经与其中的一台建立连接后,其它客户机还要呼叫服务器时,服务器就会加载新的Winsock控件来与其建立连接,当客户机退出连接时,服务器再卸载该Winsock控件。服务器建立连接时是根据客户机的IP地址来接受响应的,所以可以方便的区分不同客户机的呼叫请求。

  不过这种方案会遇到一些问题:比如只要服务器关闭,其它客户机之间就无法进行数据交换了,而在服务器开的情况下,可以通过服务器的转发来完成客户机之间的数据交换。

  方案二:三台机同时作为服务器和客户机

  1号机、2号机和3号机没有层次等级之分,采用C/S模式。比如1号机既可以作为服务器接受其它两台机的呼叫请求,又可以作为客户机对其它两台机进行呼叫。用1号机做个比方:在1号机程序窗口中用两个Winsock控件数组,分别命名为TcpServer和TcpClient,TcpServer(0)用来对客户机进行监听,TcpServer(2)和TcpServer(3)是动态加载用来接受相应的客户机的请求来建立连接的。而TcpClient(2)和TcpClient(3)不是动态加载的,而是在Form_Load初始化过程中加载,用来呼叫相应的服务器。

  这样也是可以实现多机互连的,不过也有些问题。如果1号机作为客户机呼叫2号机并已经收到2号机的响应建立了一条通讯链路,这时1号机又作为服务器接收到2号机的呼叫请求,并且也建立了一条通讯链路。这样二台机之间建立了两条链路,理论上两台机只要有一条链路就可以正常通讯,现在建立了两条链路,收发数据是否正常呢?通过测试,收发数据不会出错:当1号机给2号机发数据时,是通过1号机的TcpServer(2)或TcpClient(2)发送数据给2号机,而2号机是通过其TcpClient(1)或TcpServer(1)接收1号机的数据,双方两条链路互不干扰。不过这种方案还是不太可取,因为加载控件需要占用内存资源,每两台机之间其实只需一条链路就能正常通讯,现在又多了条链路,这对系统有限的资源是极大的浪费。

  方案三:三台机有差互连

  先解释一下什么叫有差互连。具体做法是:1号机只作为服务器监听2号和3号机的呼叫请求而不呼叫它们;2号机既是客户机又是服务器:作为客户机只呼叫1号机,而作为服务器监听3号机的呼叫请求;3号机只作为客户机对1号机和2号机进行呼叫,而不具备服务器监听的功能。所以说这几台机的连接是有差的,这种连接方式不会在两台机之间建立两条链路,因为网络中任意两台机只有一台可以呼叫对方或监听对方的呼叫请求,这样无论如何都不会产生两条通讯链路,节省了系统资源,又满足了局域网中任意两台机互连的要求,由此看来这个方案是最优方案。

  下面介绍方案三的实现过程。

  1号机

  1号机的窗体(Form)上放置两个Winsock控件,一个名为TcpLsn,负责监听2号机和3号机的呼叫请求,另外一个为TcpConn,这是个控件数组,Index为2,即已经加载了TcpConn(2),这个控件是为了和2号机建立连接。在初始化过程中(Form_Load)设置服务器的监听端口号(TcpLsn.LocalPort)并使其处于监听状态(TcpLsn.Listen),并置与客户机连接成功的标志(TcpConnected数组,布尔型常量)为False。当TcpLsn监听到某个客户机的呼叫请求后(具体是哪个客户机是根据客户机IP地址判断),在TcpLsn的ConnectionRequest事件中动态加载TcpConn控件并调用Accept方法接受客户机的请求,与其建立连接(如果客户机是2号机,则无需再加载控件,因为在Form_Load中已经加载过了)。要注意的是,TcpLsn只是用来监听客户机的呼叫请求,而不是用来与客户机建立连接的,TcpConn控件数组才是与客户机建立连接的。当某一客户机断开连接时,会触发Tcpconn控件数组的Close事件,在这里可以根据客户机的IP地址来调用Close方法关闭与其相连的Tcpconn控件,并动态卸载之。同样TcpConn(2)不能卸载,因为其不是动态加载的。

  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控件:LoadTcpClient(2)
TcpClient(1)已经放在窗体中了,故不必重复加载。还要设置连接成功的标志位(TcpConnected数组为False),并设置定时器间隔时间。然后在定时时间到事件中调用TcpClient的Connect方法连接服务器,这与2号机作为客户机呼叫服务器的过程类似,同样要在TcpClient的连接错误事件中添加以下语句:TcpClient(Index).Close。要注意的是在服务器的断开连接触发的客户机关闭事件中(TcpClient_Close)只需要置标志位,而不能卸载TcpClient控件数组,因为其不是动态加载的。

  到此为止,基本上实现了运行此程序即进行多机互连的功能。

  典型问题解析

  1.各个站点建立连接后关闭3号机的程序,在其它的站点就会弹出对象已加载的错误提示。出现这个错误的可能原因是Winsock控件已经加载,而后又执行了一次加载动作。不过实验证明不是此Winsock控件被重复加载。在微软公司的官方网站,VB6最新的ServicePack5补丁(SP5)的说明文档中有这样一条很重要的修正说明:重复加载或卸载Winsock控件会引起内存泄露。这一修正是不是可以针对用Winsock控件实现网络连接及通讯的程序呢?理论实践证明了这一猜测的真实性。下载完SP5并成功安装后,将程序原封不动运行一遍,“对象已加载”的错误窗口就再没出现过,这个问题也就成功的解决了。

  2.由于设置了客户机的本地端口号(LocalPort),导致必须先关闭服务器再关闭客户机才能在下一次正常连接以及客户机异常退出时(比如客户机突然停电)导致下次无法正常连接。这是由于没有释放连接端口号造成的。这个错误的解决方法是不要设置客户机的本地端口号;如果非得设置,那么可以利用动态改变服务器监听端口号和客户机呼叫端口号的方法。具体做法是在服务器的Form_Load中改变监听端口号,在客户机的Winsock控件错误事件中改变呼叫端口号,端口号只要用两个就可以了(如1000和1001)。->

上一篇:在你的应用程序里实现简单的加密 人气:4467
下一篇:用SendMessage实现剪贴板操作 人气:3602
浏览全部Visual Basic的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-12-2 OpenPNE中文 v2.12.5 for win 中
2008-12-2 谷秋精品课程软件课程版 v2.3
2008-12-2 晴天电影系统(带一键迅雷/自定义
2008-12-2 QQip138闪字程序
2008-12-2 SmartWeb企业智能建站系统 v1.0.2
2008-12-2 梦想不死个人主页 v2009
2008-12-2 开良ASP小偷程序生成器 v1.1
2008-12-2 toolxp.cnalexa世界排名查询 php
2008-12-2 腾讯留言板 v1.3
2008-11-29 Tencent Traveler 4.4
2008-11-29 龙卷风网络收音机 v3.0.0.0
2008-11-29 Intel Chipset Software Install
2008-11-29 TweakVI 1.0 Build 1100
2008-11-29 Opera 9.62 Build 10469
2008-11-29 MPlayer WW编译版 SVN-r28044(20
2008-11-29 NetTools网络工具v1.0.0破解版
2008-11-29 3DGallery三维体验1.1破解版
2008-11-29 SecretBook保密本v1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | OPEN参数生成器 | 弹出式窗口代码产生器 | 密码登录生成器 | 在线按钮生成器 | Meta标签生成器 | 多色彩特效字代码生成器 | 网页代码调试器 | 在线FTP登陆 | Flash取色器 | 配色代码对照表 | 配色辞典 | CSS生成器 | 广告代码 | 框架网页代码生成器 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | 在线调色板 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 元素周期表 | 健康查询 | 世界时间 | 万年历 | 二十四节气 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2009 www.knowsky.com All rights reserved | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成