随着windows 95中文版和windows nt server 4.0中文版的流行, microsoft公司推出了相应平台上的开发软件: visual basic 5.0 中文企业 版。它为windows环境下的网络开发提供了强大的工具,winsock控件就是其中之一。
winsock控件建立在tcp、udp协议的基础上,完成与远程计算机的通信。即使对tcp/ip不太熟悉的用户,使用该控件也可以在十几分钟内创建一个简单的客户机/服务器程序。下面我们对winsock控件的事件、方法、属性按其在程序中出现的顺序分别作详细的介绍,以便更好地理解程序源代码。
服务器程序的实现过程是:
(1)服务器程序必须设置好localport属性,作为侦听端口,该值为一个整数(只要是一个其它tcp/ip应用程序没有使用过的值即可)。
(2)使用listen方法进入侦听状态,等待客户机程序的连接请求。
(3)客户机程序发出连接请求,使服务器程序产生connectionrequest事件,该事件得到一个参数requestid。
(4)服务器程序用accept方法接受客户机程序的requestid请求。这样,服务器程序就可以用senddata方法发送数据了。accept方法必须用上一步得到的requestid作为其参数。
(5)当服务器程序接收到数据时,产生dataarrival事件,参数bytestotal包含接收到的数据字节数。在该事件中,可以用getdata方法接收数据。
(6)如果接受到close事件,则用close方法关闭tcp/ip连接。
客户机程序的实现过程是:
(1) 客户程序设置remotehost属性,以便指定运行服务器程序的主机 名,该字符串可在“控制面板网络标识计算机名”中查到。
(2) 设置remoteport属性,以便指定服务器程序的侦听端口。
(3)使用connect方法,向服务器提出连接请求。
(4)服务器接受客户机程序的请求,客户机程序产生connect事件,就可以用senddata方法发送数据了。
(5)当客户机程序接收到数据时,产生dataarrival事件,参数bytestotal包含接收到的数据字节数。在该事件中,可以用getdata方法接收数据。
(6)如果接受到close事件,则用close方法关闭连接。
winsock控件还有两个重要的属性,即protocol和state。protocol设定使用的协议是tcp还是udp:取值scktcpprotocol表示tcp, 取值sckudpprotocol则表示udp。因为winsock控件的缺省设置是sck protocol,所以程序中并没有使用protocol属性。state属性反映的是当前tcp/ip的连接状态,取值如表1所示。
表1 winsock控件的state属性及其描述
| 常数 | 值 | 描述 | |
| sckclosed | 0 | 缺省值,关闭。 | |
| sckopen | 1 | 打开。 | |
| scklistening | 2 | 侦听 | |
| sckconnectionpending | 3 | 连接挂起 | |
| sckresolvinghost | 4 | 识别主机。 | |
| sckhostresolved | 5 | 已识别主机 | |
| sckconnecting | 6 | 正在连接。 | |
| sckconnected | 7 | 已连接。 | |
| sckclosing | 8 | 同级人员正在关闭连接。 | |
| sckerror | 9 | 错误。 |
先在一台计算机上运行服务器程序,此时窗口上只有一个“退出”按钮。 再在另一台计算机上运行客户机程序,在“连接”按钮右边的文本框中输入服务器 的主机名后单击“连接”按钮。如果连接成功,则服务器和客户机程序窗口都会出现两个文本框。这时,两端都可以在上面的文本框中输入文字,这些文字会立即在下面的文本框中出现。
服务器程序使用的控件如下:
(1)command1:退出按钮;
(2)textsend:发送数据文本框;
(3)winsockserver: 服务器winsock;
(4)textget :接收数据文本框。
服务器程序的界面如图所示。
服务器程序的源代码如下:
private sub command1_click()
end
end sub
private sub form_load()
textsend.visible = false
textget.visible = false
winsockserver.localport = 1001
winsockserver.listen
end sub
private sub textsend_change()
winsockserver.senddata textsend.text
end sub
private sub winsockserver_close()
winsockserver.close
end
end sub
private sub winsockserver_connectionrequest(byval requestid as long)
textsend.visible = true
textget.visible = true
if winsockserver.state <> sckclosed then winsockserver.close
winsockserver.accept requestid
end sub
private sub winsockserver_dataarrival(byval bytestotal as long)
dim tmpstr as string
winsockserver.getdata tmpstr
textget.text = tmpstr
end sub
客户机程序使用的控件如下:
(1)command1:退出按钮;
(2)command2:连接按钮;
(3)winsockclient:客户winsock;
(4)text1:主机名文本框;
(5)textsend:发送数据文本框;
(6)textget:接收数据文本框; 客户机程序的界面如图所示。
客户机程序的源代码如下:
private sub command1_click()
end
end sub
private sub command2_click()
winsockclient.connect
end sub
private sub form_load()
textsend.visible = false
textget.visible = false
winsockclient.remoteport = 1001
winsockclient.remotehost = "sccdsz"
end sub
private sub text1_change()
winsockclient.remotehost = text1.text
end sub
private sub textsend_change()
winsockclient.senddata textsend.text
end sub
private sub winsockclient_close()
winsockclient.close
end
end sub
private sub winsockclient_connect()
textsend.visible = true
textget.visible = true
command2.visible = false
end sub
private sub winsockclient_dataarrival(byval bytestotal as long)
dim tmpstr as string
winsockclient.getdata tmpstr
textget.text = tmpstr
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 注册表 操作系统 服务器 应用服务器