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

发表于:2007-05-25来源:作者:点击数: 标签:网络小型管理系统winsock基于
基于WinSock的小型网络管理系统及其实现 NiceFeather (黎阳航空发动机公司) 摘 要 :本文主要讨论基于Internet上的小型网络信息管理系统的基本功能,并提供了其基于WinSock控件的构造方法。 关键词:WinSock,小型网络信息系统,登录机制,Internet数据传送

        基于WinSock的小型网络管理系统及其实现
                        NiceFeather
                 (黎阳航空发动机公司)

摘  要:本文主要讨论基于Internet上的小型网络信息管理系统的基本功能,并提供了其基于WinSock控件的构造方法。
关键词:WinSock,小型网络信息系统,登录机制,Internet数据传送

            MNMS Based on WinSock and it's Implement
                            NiceFeather
                (Liyang Air Engine Corporation)
Abstract: This paper describes some functions of a miniature network management system base on internet and offers the method of MNMS's implement with winsock .
Keywords: Winsock, MNMS(Miniature Network Management System), Logon Mechanism, Internet Data Transfer

1 网络管理系统的功能
用户登录认证,电子邮件系统,文件传送,消息通知
2 Winsock控件介绍
Winsock 控件对用户来说是不可见的,它提供了访问 TCP 和 UDP 网络服务的方便途径。Microsoft Aclearcase/" target="_blank" >ccess、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个用户通信。

3.3 小型邮件系统
我们建立了用户数据库和邮件数据库,在前面叙述的用户登录的实现下,进行用户的邮件管理;此时涉及到数据管理。数据库结构如下:
⑴用户数据库结构:
userid    用户编号
name     用户名
chinesename  姓名
code    口令
pp    权限
dscrp    描述
⑵邮件数据库结构:
Msgid   消息编号
Receiver   接收者
Sender   发送者
Style    类型
Word    消息文字
Get    接收否
Sj    消息得到时间
bj    消息附属信息
当用户登录后,服务器从邮件数据库中提取Receiver是该用户并且消息为新(Get字段值为“新”)的记录,把之打包,利用用户Winsock对象发送。
服务器同时提供客户的命令要求,然后对之进行相应的操作:
客户命令格式:
邮件命令 Chr(13)
回车符分隔命令数据 0读新邮件
1读旧邮件
2读所有邮件
3删除邮件 删除邮件时,需提供要删除的邮件编号(在用户登录时已经连同邮件一起发送)
服务器响应命令:发送邮件数据,字段之间用回车符隔开,在邮件内容中对其进行信息处理——对回车符进行编码,比如用%0代替,而%用%%代替。或者发送删除成功消息,删除失败消息,读取失败消息——这些特殊消息可以在消息前端用一个字符区分数据或消息及消息类型。

3.4 聊天室
显然利用上面所述的用户登录机制,我们可以在服务器中建立聊天室,进行实时对话。同样我们可以使用特殊的消息管理方法,进行聊天管理;如下:
Select Case 命令的第一个字节
    Case "0"      '进入会议室
        For i = 1 To cur     '通知其他在线用户有用户上线
        If onl(i, 0) = 0 Then Winsock1(i).SendData "0" + get_un(Index) + Chr(13)
        Next
    Case "1"      '离开会议室
         For i = 1 To cur    '通知其他在线用户有用户离线
            If onl(i, 0) = 0 Then Winsock1(i).SendData "1" + str(onl(Index, 1)) + Chr(13)
         Next
    Case "2"       '发言
         If 第二字节 = "0" Then    '向所有用户说话
            For i = 1 To cur         '把话送往所有用户
                    If onl(i, 0) = 0 Then
  Winsock1(i).SendData "2" +第Index个用户的名字 + "说:" +文字
                    endif
            Next
         Else      '向某用户说悄悄话
        '从命令的下面字节(到回车符结束)得到要传送的用户代号x
            Winsock1(x).SendData "2" +第Index个用户的名字+ "对你悄悄说:" + 文字
         End If
    Case "5"       '邀请加入某在线用户进入会议室
       '从命令的下面字节(到回车符结束)得到要传送的用户代号x
         Winsock1(x).SendData "5" + 第Index个用户的名字+ Chr(13)
   '向第x个用户发送进入会议室的命令,并等待响应
End Select

4  结束语
我们使用VB6.0实现了上述功能,并使用在我们独立开发的工作流软件上,实现了Internet上的小型企业的信息管理。

原文转自:http://www.ltesting.net