您现在的位置: 中国男护士网 >> 考试频道 >> 计算机等级 >> 二级辅导 >> 正文    
  基于Winsock的小型网络管理系统及其实现 【注册男护士专用博客】          

基于Winsock的小型网络管理系统及其实现

www.nanhushi.com     佚名   不详 

  1 网络管理系统的功能

  用户登录认证,电子邮件系统,文件传送,消息通知

  2 Winsock控件介绍

  Winsock 控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Access、Visual Basic、Visual C++ 或 Visual FoxPro 的开发人员都可使用它。为编写客户或服务器应用程序,不必了解 TCP 的细节或调用低级的 Winsock APIs。通过设置控件的属性并调用其方法就可轻易连接到一台远程机器上去,并且还可双向交换数据。

  如果创建客户应用程序,就必须知道服务器计算机名或者 IP 地址(RemoteHost 属性),还要知道进行“侦听”的端口(RemotePort 属性),然后调用 Connect 方法。如果创建服务器应用程序,就应设置一个收听端口(LocalPort 属性)并调用 Listen 方法。当客户计算机需要连接时就会发生 ConnectionRequest 事件。为了完成连接,可调用 ConnectionRequest 事件内的 Accept 方法。
建立连接后,任何一方计算机都可以收发数据。为了发送数据,可调用 SendData 方法。当接收数据时会发生 DataArrival 事件。调用 DataArrival 事件内的 GetData 方法就可获取数据。

  为实现Internet上两个远程计算机之间的数据传送,Winsock编程是一个十分便捷、快速的选择。显然,Winsock通信是基于Client/Server模式的,即服务器的Winsock在某端口进行“侦听”服务,等待客户机的申请;那么如何实现两台计算机之间对等数据交换?实现中,可以把生成两个Winsock对象,其中一个作为服务器对象在端口1“侦听”,另外一个作为客户机对象在端口2连接另一台计算机——即每台计算机可以作为服务器,也可以是客户端。

  VB6.0中,Winsock有两种数据传送格式:字符串型和字节流型;平时的信息交互可以使用字符串型,但由于文件的传送要顾及各种格式的文件,因此文件不能以字符串进行传送,此时以字节流型数据传送可以保证数据完整。

  方法如下:
  ⑴如果是传送字符串型,发送:Winsock1.SendData strData;接收:Winsock1.GetData strData(strData是字符串String型变量)。
  ⑵如果是传送字节流型,发送:Winsock1.SendData strData();接收:Winsock1.GetData strData()(strData()是字节数组Dim strData() As BYTE)。

  3 小型网络管理系统的Winsock实现方法
  3.1 Internet上的文件传送实现方法

  当计算机A向计算机B之间要求文件(包括上传和下载)传送时,首先向计算机B发送文件传送请求——第一“握手”,之后才进行真正的文件数据传送。Winsock的SendData 方法发送的数据默认数据文件数据传送中,第一次握手:文件传送(上传,下载)请求数据格式:

  操作类型 文件名 文件块大小 文件块数目 最后一块大小(字节)
  0:上传 当地文件名 1kb(默认) 文件长度/块大小
  1:申请下载 远程计算机中的文件名 
  第二次握手:文件传送(上传,下载)请求响应操作及回复信息
  上传响应:发送OK,告诉对方可以开始传送数据
  下载响应:传送文件块数目+块大小+最后一块字节大小
  之后,计算机之间进入真正的文件数据传送中,如图(假定从A→B):
  如此反复,直至文件的数据块传送完毕,在传送中间可以根据传送块的剩余数目显示进度条。

  3.2 用户登录管理

  ⑴用户登录机制

  为保证安全性,用户登录采用加密传送用户名及密码,用户登录机制如下:
  当客户机向服务器发出登录请求时,服务器生成相应的Winsock对象接收(Accept)客户机Winsock,从而建立服务器与不同的用户之间的消息通道。

  ⑵Winsock服务器建立多客户连接的方法:
  首先在服务器中建立Winsock数组Winsock1(),其中Winsock(0)进行“侦听”,当客户机发出连接请求(clintWinsock.Connect 服务器IP地址,服务器侦听端口)时Winsock(0)产生如下消息:
  Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
  If Index = 0  Then                  ´主Winsock——Winsock(0)发生消息
  i = 1
  While i <= cur And onl(i, 0) = 0     ´在以前的Winsock中找到空闲的Winsock
        i = i + 1
    Wend
    If i <= cur Then                  ´在当前装载的Socket中发现有用户已经离开
        Winsock1(i).LocalPort = 0      ´使用现成的Socket
        Winsock1(i).Accept requestID   ´接收
        onl(i, 0) = 0      ´Winsock(i)被占用
    Else                             ´在当前装载的Socket中没发现有用户离开
   cur = cur + 1                 ´当前接收端口增加
        Load Winsock1(cur)            ´生成新的´ Winsock
        Winsock1(cur).LocalPort = 0
        Winsock1(cur).Accept requestID  ´接收
        onl(cur, 0) = 0      ´Winsock(cur)被占用
  End If
  End Sub
  之后,服务器利用生成的Winsock(i)与第i个用户通信。

 

文章录入:杜斌    责任编辑:杜斌 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
     

    联 系 信 息
    QQ:88236621
    电话:15853773350
    E-Mail:malenurse@163.com
    免费发布招聘信息
    做中国最专业男护士门户网站
    最 新 热 门
    最 新 推 荐
    相 关 文 章
    2011年护士资格考试:考…
    2009年初级护士资格考试…
    2009年主管护师考试于12…
    2009年初级护士考试于12…
    2009年初级护师考试于12…
    石家庄市关于2009年度护…
    2009年护士专业技术资格…
    医护技能考试周末举行 4…
    护士“托福”今年7月开考
    护士“托福”考试开始报…
    专 题 栏 目