说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

VB利用Winsock控件实现局域网通信

HTML文档下载 WORD文档下载 PDF文档下载
VB利用Winsock控件实现局域网通信

对于局域网用户中的编程爱好者来说,如果能自己编一个局域网通信程序,那么这一切将是多么美妙!可是,如果要从头开始完全由自己来编写一段用于通信的程序,必须对相关的网络协议及其他的一些较底层的技术有较深入的了解,这可不是一件容易的事。而现在有了Winsock控件,一切就不同了,它已经替你封装了所有烦琐的技术细节,并提供了访问TCP和UDP网络服务的方便途径。你只需通过设置控件的属性并调用其方法就可轻易连接到一台远程计算机中,并且还可以双向交换数据,而这一切都不需你了解TCP的细节或调用低级的Winsock APIs。
  Winsock控件可以供Microsoft Acess、Visual Basic,Visual C++或Visual Foxpro的开发人员使用。本文以Visual Basic 6企业版为开发环境来向大家介绍一下Winsock控件的初步应用。

  Winsock控件可以使用两种协议:TCP协议和UDP协议,下面来分别介绍。

  TCP协议即数据传输协议,它允许创建和维护与远程计算机的连接,使其彼此可以进行数据传输。利用TCP协议通讯必须分别建立客户应用程序和服务器应用程序。

  在创建客户应用程序时,必须知道服务器计算机名或其IP地址(存于RemoteHost属性)、及服务器计算机进行侦听的端口(存于RemotePort属性),然后调用Connect方法。

  创建服务器应用程序时,就应相应设置一个侦听端口(LocalPort属性)并调用listen方法。当客户机需要连接时(connect),就会发生ConnectionRequest事件。为了完成连接,你可以在ConnectionRequest事件中调用Accept方法。建立连接后,任何一方计算机都可以发送、接收对方数据。如果你要发送数据,需调用SendData方法。当接收到数据时,会发生DataArrival事件,调用DataArrival事件中的GetData方法就可以获得对方传送的数据。

  说了这么多,大家可能还是不太了解,让我用程序来详细说明。

  如果只有两台计算机,那十分容易。假设甲机为客户机,乙机为服务器,且其IP为192.192.192.1,接收端口为1200(任意选一个未被使用的端口即可)。首先在甲机客户端程序中加入一个Winsock控件,起名为sckconnect,并设置其属性:RemoteHost=“192.192.192.1”,(即甲机IP地址), RemotePort=1200(即甲机侦听端口);再在乙机服务器程序中假如一个名为sckserver(0)的Winsock控件,其LocalPort=1200,

  在乙机服务器程序中Form_Load()加入

  sckserver(0).bind sckserver(0).LocalPort '与本地端口绑定

  sckserver(0).listern ' 侦听

  如果要传输数据,两机必须先建立连接。建立连接的程序如下:

  甲机客户机要先请求连接

  sckconnect.connect sckconnect.RemoteHost, sckconnect.RemotePort

  此句执行时会触发服务器程序中的ConnectRequest事件,在此过程中决定是否建立连接,其代码如下:

  Private sub sckserver_connectionrequest(index as Integer,Byval requestid as long)

  if sckserver.count=1 then

  load sckserver(1)

  sckserver(1).accept requestId

  end if

  end sub

  连接建立好以后,甲机或乙机都可以应用SendData方法来传送数据。例如,如果是甲机要传送一个叫string的字符串,只需在代码中加入:

  sckconnect.SendData string

  甲机传送数据后,会触发乙机的DataArrival事件,在其过程中用GetData方法可以收到传送的数据:

  Private sub sckserver_DataArrival(Index as integer,Byval BytesTotal as long)

  dim sdata as string

  sckserver(1).GetData sdata,vbstring

  end sub

  最后别忘了在关闭程序前要先关闭Winsock控件

  privat sub form_unload(cancel as integer)

  if sckconnect.state <>sckclosed then

  sckconnect.close

  end if

  end sub

 

  这只是最简单的情况,如果有多台计算机,那就稍微复杂一些,客户端程序可以不做改动,而服务器端程序需要略做改动:

  Private sub sckserver_connectrequest(Index as Integer,Byval requestid as long)

  dim sip as string

  dim I as integer

  sip=sckserver(0).RemoteHostIP '获得登录者的IP地址

  I=1

  Do while I<=sckserver.ubound '检查是否已经有该地址的记录

  If sckserver(I).RemoteHostIP=sip then '如有,不必加载新的控件

  Sckserver(I).Accept requestid

  Exit sub

  End if

  I=I+1

  Loop

  Load sckserver(I) '否则,加载新的控件

  Scksrver(I).accept requestID

  End sub

  注意到:以上的信息交谈实际上都发生在客户机与服务器之间,如果要做成聊天室那样,每个人的话都可以被别人“听到”,那就要在服务器端的DataArrival事件中,把接收到的客户机传来的数据,转发给所有客户机即可。

  其循环转发信息的代码如下:

  For I=1 to sckserver.count

  if sckserver(I).state<>sckclosed then

  sckserver(I).SendData sdata

  end if

  next I

 

  怎么样,这样我们就作好了自己的通信软件!

 

  不过,不知大家注意到没有,上述程序都需要有一台计算机做为服务器,但如果我们的局域网中没有哪台计算机是可以常开的,也就是说,如果服务器端程序没有运行的话,其他客户端程序也没有办法通信。而这种情况却可能是经常出现的!至少,我所用的局域网那就是这样的。难道这样我们就无法享受局域网通信的乐趣了吗?

  不要急,记得吗,我们的Winsock控件还有另一个主角:UDP协议。

  UDP协议也称为用户数据报文协议,是一个无连接协议。何谓无连接协议?就是说利用此协议连接时,不必象TCP协议那样:需要服务器端侦听,客户机端请求连接,服务器端建立连接后双方才能通信。另外,UDP应用程序可以是客户机,也可以是服务器程序,而不必向TCP应用程序那样必须分别建立客户机程序和服务器程序。

  下面,来简述一下UDP协议通信的过程:UDP协议中,为了在甲乙两机中传输数据,必须先分别设置两机的LocalPort属性;再将甲机的RemoteHost属性设置为乙机的IP地址,RemotePort属性设置为乙机的LocalPort属性值,此时甲机调用SendData方法就可以传送数据了,乙机同样使用DataArrival事件中的GetData方法来获取甲机发送给乙机的信息。如想乙机向甲机传送数据,只需仿照上面的过程设置即可。

  用UDP协议来传输信息较TCP协议来说简单的多,它无须侦听(LISTEN),也无须请求连接(CONNECT),就象我们平时发信一样,只要写好地址及收信人姓名并发送出去即可。我们可以借此来编写一个局域网中的信息传送程序,下面来简单介绍以下程序中想实现的功能及其基本思想:

  首先,我们一定想让程序的图标显示在system tray中而不显示在任务栏中吧!这要是自己编程实现可不是太容易,幸好VB光盘中在common\tools\vb\unsupport\systemTray 中有一个现成的程序,我们只要把它编译成systray.ocx 控件,然后在编写自己的程序时添加此控件即可。其使用方法十分简单,它已经定义好了鼠标单击、双击等事件,你只需编写相应的鼠标事件即可,这里不再多说。

  程序的关键是:UDP协议在通讯时要知道对方的IP和Port,这要如何实现呢?最简单的方法是建立一个配置文件,里面放置了局域网上每台计算机的名字、IP和Port,在程序初始化时读出所有信息,在程序中只要知道向谁通信,读出其对应的IP和Port即可。

  我们知道了每台计算机的IP和Port,但我们怎样才能知道其它计算机是否在线呢,否则发出信息别人收不到怎么办?我们可以把此程序放在启动菜单中,让其一开机就自动启动,并最小化,放于窗口右下角的system tray中。在程序刚开始运行时,它会自动向它从配置文件中所知道的所有IP发一条信息:“我来了!”,如果有计算机在线,它会自动返回一条信息:“欢迎!”,如此则两机通信成功,它们会分别把对方的名字加入到自己的可通信人名单中去;如果有计算机关机,程序在退出之前会自动向所有人告别:“再见!”,接收到此信息的计算机会自动把发送信息的计算机的名称从自己的可通信人名单中去除。这样,如果某人不在线,你将无法发送信息给它;如果除了你以外,其他人都没有开机,那你的可发送人名单中将没有任何人。而其它人只要一上线,会自动去你那里“登记”,其他人只要一离线,会自动去你那里“告别”,你可以据此知道他人是否正在使用计算机,你甚至可以以此程序来统计他人的每天上机时间,不错吧!

  好了,一个局域网通信的程序的基本模型已经有了,并不复杂吧!大家赶快动手吧,来享受用自己的程序来聊天的乐趣!

  不过,要想编写一个出色的程序,不光是要有良好的创意与功能,更重要的是程序的兼容性与容错性。本例中,对错误处理没有做详细的解释,关于这一点,大家可以在Winsock控件的error事件及其帮助中找到满意的答案。

  另外,还可以从以下几方面来考虑功能的扩充:如传送图形、声音等多媒体信息、局域网互传文件(主动传送)、历史通话记录、系统日志、个人上机时间统计等等,而所有的这一切仅仅取决于你的想象力与你的聪明才智!下面,笔者以传送文件为例来讲一讲其功能实现的代码。

  你可以把本地的文件(图形、声音等可以先存成临时文件)以二进制文件的方式来打开它,将其内容全部读入一个byte类型的数组中,本地机代码如下:

  dim myfile () as byte

  dim position as long

  open "filename" for binary as #1

  position=0

  do while not eof(1)

  position=positon+1

  redim preserve myfile (1 to position)

  get #1,,myfile(position)

  loop

  close #1

  再向远程机传送这个字节数组

  sckserver.SendData myfile

  远程机收到这个数组之后,再以二进制文件的方式打开一个新目标文件,将数组内容写入这个新打开的文件,如果是bmp图片就将其放入picture图片框中,如果是wav文件,就播放。这样,局域网中的两个人就可以通过语言、图片、文字来交流了。

  远程机代码如下:

  Private sub sckconnect_DataArrival(byval bytestotal as long)

  dim receivefile(1 to bytestotal)as byte

  sckconnect.GetData receivefile,vbarray+vbbyte

  '告诉Winsock控件收到的是字节数组类型的数据

  open "c:\temp\文件名" for binary as #1

  for I=1 to bytestotal

  put #1,,remotearray(I)

  next I

  clost #1

  end sub
【CTO讲堂】微服务架构在云端的应用 SDCC 2015创业项目路演火爆征集:寻找中国好项目 被遗忘的设计模式——详解Swift语言中的Null Object Pattern Synaptics发布全新触控及生物识别方案,正式进军车联网 无人机、机器人,英特尔RealSense已扩展至新领域 SDCC 2015中国软件开发者大会盛大开幕 《近匠》逸创云客服创始人叶翔:做好客服产品静待SaaS大爆发时代的到来 【SDCC2015现场】数据库实战论坛:分布式数据库的实践与挑战 SDCC 2015 中国软件开发者大会亮点回顾 《近匠》扬智科技GoWarrior:软硬件全面开源的计算平台 【CTO讲堂】独家直播双十一全网动态?前黑客“劳改”带你玩转大数据 《近匠》好雨云刘凡:提供全方位支持的一站式开发服务云平台 体验过HTC Vive,才知道何谓沉浸感 BDTC 2015:大数据技术精英云集 初版日程公布(表) 深度剖析C++对象池自动回收技术实现 React Native与ExMobi技术路线探索 SDCC 2015前端专场札记:Facebook、百度、腾讯、美团、饿了么等互联网公司的前端实战 芯片巨头为何痴恋开源软件?英特尔Imad Sousou来解密 3D Touch:岂止于Multi-Touch Atlassian亚太区业务经理Paul Conroy:敏捷是开发者的痛点 基于DuiEngine的开源DirectUI图形界面库SOUI 【CTO讲堂】工具类、新闻类、视频类等不同类型App的积分体系该如何搭建? 浏览器的改进应来自用户诉求而非商业诉求 《近匠》Moxtra:可内嵌的一站式移动协同解决方案 互联网时代的无栈开发 SDCC 2015参会感——无法计算的价值 英特尔中国研究院开放日 多个研究项目齐亮相 阿里王晶昱谈淘宝双11分布式数据库实战 为什么移动化对企业级应用如此重要? 移动App图标设计的最佳实践 在Node应用中实施Web认证的四大方法 最近我防问了一个黑客网站。一下中啦。桌面没有图标我看完啦。有没有高人帮我一下啊。 现有一个dll转为静态库的问题 请问怎样添加一个从CObject继承而来的新类啊? 如何在VB中用Outlook发电子邮件??? 妈呀,上午54,下午33,有戏吗?我完了。 请教:通过VB+ADO访问SQL Server 7数据不能更新记录? 低分低级问题 简单问题,送分喽!!文件调用问题!!! 如何定义IOCTL代码: 谁能推荐一本有关网络与通信的入门书? 看官们注意HttpURLConnection!!! 如何获得Edit控件中当前输入的是第几个字符? 大家是如何调试WDM程序的 在游标中如何更新数据表的当前行 哪里有内幕新闻看? 怎么突然不能解析了,不只是什么原因,昨天我的asp.net都配好了,今天.aspx怎么又不能解释了? 好奇怪!为何不执行Page_Load()函数? 简单问题:关于一个控件,50个大洋。 广州的科友听过没有?听说是搞网络安全的,挺牛B的。全是C,unix高手。。。 如何使用vbs,javas,修改注册表??? 睡不着觉的快来数绵羊啊——什么?你要数星星呀?那也行啊;-p 我只使用了一个MScomctLib里面的listview,我不想把整个dll包进去,怎么办?。。。 谁知道Microsoft的CAB文件用什么工具可以解开? 我对ADO访问MDB比较菜. 这是我的做的练习请大家帮我看一看 有关针对特定人的邮件用特殊格式显示的可行性探讨 SQL SERVER中的怪问题 几年下来,我们一直用着英文版的VC,不知道VS.NET中有没有中文版的VC? 还没有睡觉的兄弟过来帮我看看这段代码,为什么有错?? ADO最新版哪儿有下载啊? 捆饶很久的问题!!! 急,明天就要交程序了,请问怎么才能知道产生的异常的名称,并拦截? 上午56、下午68,散分先 jsp站点的web服务器需要什么都??怎么设置??那里有说明文档没有啊 怎样在窗口没有显示出来之前将数个小位图“拼成”一个大位图并可以保存,急! win2000的怪问题 快救救我!!!!!!!!!!!!!!! 一个关于c++builder的ado的问题! PACK6是不是有问题? MFC程序的结构问题? 一个酷似chinaasp的社区,需要你的支持。嘿……实在做得很好,送分!!!随便给朋友做做广告 7:30之前一定要交。。。。急。。。。!!!! 文件改名用哪个函数啊? 为什么我的windows2000pro共享文件不能访问????? 在VB.Net中的TabControl有一个OwnerDraw的功能,但不知到如何才能将上面的Item画成有曲线的 一个程序员的路是怎样开始的?我该选择VB还是C语言? 那里有动态加载控件的文章??? 哪位高手告知学习C++/VC++的步骤和各阶段应看的书。 湖北的有查到分数的没有,怎么查,我天天晚上做恶梦,救救我! 能否请高手指教关于开在开机时屏蔽热键的问题(del+alt+ctrl)?高分送上! 请教语音卡高手:并线录音和串线录音有何不同?电压驱动和话音驱动有什么不同? 一个时钟周期是多长时间? 上海世博作文字数不限 “水是万物的本原”属于唯物还是唯心? 电路图的电压源 与电流源的等效转换谁 多给点例子出来啊 要说明 理由啊 与石化柴油相比,生物柴油有哪些优点 三相异步电动机拖动额定恒转矩负载运行,若电源电压下降20%,达到稳态时电动机的电磁转矩如何变化A.Tem=0.2TNB.Tem=0.64TNC.Tem=0.8TND.Tem =TN感觉应该不变啊 ,题中不是说恒转矩吗,求真相 以月亮为话题的作文最好是原创.30分钟以内!好的话我会给分的 洗涤沉淀的方法有哪些? 与石化柴油相比生物柴油有哪些优点 三相异步电动机的电磁转矩与电源电压大小有何关系?若电源电压下降20%,电机的最大转矩和启动转矩将变多大? 几种清洗方法中,错误的是A.用洗涤剂清洗餐具上的油污 B.用酒精洗涤残留碘的试管 C.用肥皂洗涤久置石灰水的试剂瓶 D.用汽油清洗沾在手上的油漆 请把每个选项逐一分析. 细水常流是什么意思? 一台三相异步电动机拖动额定转矩负载运行时,若电源电压下降10%,这时电动机的电磁转矩怎么算?1)Tem=TN;(2) Tem=0.81 TN;(3) Tem=0.9TN; 过程 求过程 我要知道为什么 生物航油的原料是什么?是生物柴油吗?生产工艺及过程都是怎样的? 《细水常流》是什么意思? 花看半开,酒饮微醺 全文是什么?希望带有赏析 钢铁制造工艺流程分多少步骤 上海世博园中国馆现在还开放吗?如果开放的话,门票是多少钱?我准备1月末左右去上海,另外其他国家的展馆还开放吗?如果开放,门票多少钱? 花看半开,酒喝微醺.本以为看字面意思就能理解,可是时间越长才发现自己错的越离谱 低碳生活与低碳世博发表看法和观点,帮个忙, 什么叫做细水常流式的爱情看过“执子之手与子偕老”那篇文章吗?要是没看过上我博客看看吧!有什么感觉?说说:什么叫做细水常流呢?有什么感想否? 电压源和电流源的转换题目如图所示转换电流源的d,e和转换电压源的d,e 关于酒的诗句并归纳一下诗人往往借酒抒发什么情感?请至少举三例, 上海世博园中国馆的设计理念是什么?几个词语的顺序 电压源模型与电流源模型的等效变换问题,电压源模型的电源内阻假设为R0(这个阻值趋于0)电流源模型的内阻假设为R0(这个阻值趋于无穷大)两个R0都不一样,等效变换怎么能把它当成一样 李白写酒的诗表达了诗人怎样的情感快,求你了求求求求求你你你你你您了了了了了了了了了 "细水常流"英文怎样说 物理测试仪器的粘度计有哪几类?各类粘度计哪家公司的比较好? 有关酒的诗句和诗人抒发了什么情感 不伦之恋,不伦之恋,细水常流是什么意思为什么不回答我的问题 电压源与电流源有什么区别?电压源与电流源同是电源,他们有什么不同,我不怎么清楚.还请解答得详细点,谢谢! 有关酒的诗句 诗人借酒抒发了怎样的感情 生活中常用的调味剂、防腐剂是什么? 干密度怎么算 食盐为什么可以做防腐剂 生活中常用的食物调味剂有什么 花要半开,酒要半醉!谁懂什么意思 翻译成英文:“形成美国与其他国家不同关键是在于道德观念的差异和行为方式的差异” 生活中常用的调味剂防腐剂化学式? 怎样提高生物柴油的转化率 我们都知道,美国是个移民国家,翻译为英文 生活中常见的既是调味品又是防腐剂的物质是什么? 酒饮微醉时, 山梨酸钾是不是防腐剂?有没有危害? 生物柴油的成本与售价最近经常看到关于生物柴油的报道,我对此比较感兴趣,想知道一下现在每吨生物柴油的成本及售价,希望不吝赐教! 圆月 作文 山梨酸钾是防腐剂吗?市场上的熟食和罐头都添加了防腐剂吗?它和那些食品添加剂都是对人体有害的吗, 生物柴油价格大概多少?哪里有卖? 关于假如我登上月球的作文 三相异步电动机电压变化时引起的电流、转矩、转速的变化主要对转差率上升导致电流增大不理解,增大的结果为何又导致电磁转矩重新上升,不太理解 #生物柴油#最近几年生物柴油产量?11-13年 月亮的作文只要有月亮就行了!700字 想象.写景.叙事 都可以(^.^) m(__)m( ^∀^) 上海世博 作文450字的 英语翻译在2010年上海世博会期间中国馆给来自不同国家的参观者留下深刻的印象,在中国馆里他们对中国的情况了解的更多.把这句翻译成英语,要有定语从句的 密度怎么算 上海世博瑞士馆作文 2010上海世博会歌曲有哪些? 密度的计算 . 求上海世博作文本小女初中毕业、马上要上高中、暑假打完工跟团去了世博会、现求一篇游览作文、详细描写中要有巴西馆和加拿大馆(加拿大是我以后想去的国家)、去过挪威馆、瑞典馆 感情为什么不可以只唯心? 人类历史上有多少个消失的文明?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn