对于局域网用户中的编程爱好者来说,如果能自己编一个局域网通信程序,那么这一切将是多么美妙!可是,如果要从头开始完全由自己来编写一段用于通信的程序,必须对相关的网络协议及其他的一些较底层的技术有较深入的了解,这可不是一件容易的事。 而现在有了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 |
| private sub sckserver_dataarrival(index as integer,byval bytestotal as long) dim sdata as string sckserver(1).getdata sdata,vbstring end sub |
| 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 |
| for i=1 to sckserver.count if sckserver(i).state<>sckclosed then sckserver(i).senddata sdata end if next i |
| 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 |
| 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 |
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器