嘉兴学院 毕业论文 课题名称: 销售管理系统—内务咨讯 学生姓名:钱晓厉 学号:7 学院:信息工程学院 专业、班级:经济信息管理与计算机应用011 指导老师:孙伟民 完成日期: 摘要 本课题是采用Winsock控件,利用其提供的TCP网络服务功能编写的类似BQQ功能的局域网通信程序。通过设置Winsock的属性并调用其方法连接到一台远程计算机中,并且还可以双向交换数据。 系统主要包括服务器(SERVER)和客户(CLIENT)端两部分。如客户端注册有客户登录后与服务器连接,连接成功后,即可进入聊天环境;服务器则负责维护与每一个客户的连接和数据交换,并且记录下所有的聊天内容。 经过分析,采用Access作为创建数据库平台,MICROSOFT公司的Viual Basic 6.0作为编程语言平台。前者是建立起的数据一致性和完整性强、数据安全性好的库,后者提供的各种面向对象的开发工具,尤其是数据窗口这一能方便而简洁操纵数据库的智能化对象,首先在短时间内建立系统应用原型,然后,对初始原型系统进行需求迭代,不断修正和改进,直到形成满意的可行系统。 关键字:Winsock、CommonDialog、Server/Client、Tcp、Msgbox、ActiveX 目录 目录………………………………………………………………………………………(3) 1.绪论……………………………………………………………………………………(4) 2.内务咨讯系统的总体设计………………………………………………………(5) 2.1总体规划………………………………………………………………………………(5) 2.2系统设计………………………………………………………………………………(5) 3.系统功能具体实现………………………………………………………………………(8) 3.1服务器端功能模块设计………………………………………………………………(8) 3.2客户端功能模块的设计………………………………………………………………(9) 3.4硬件配置………………………………………………………………………………(10) 3.5数据库设计方案……………………………………………………………………(10) 4系统详细设计……………………………………………………………………………(10) 4.1服务器系统详细设计…………………………………………………………(11) 4.2客户端系统详细设计…………………………………………………………(16) 5.结论………………………………………………………………………………………(25) 致谢………………………………………………………………………………(26) 参考文献……………………………………………………………………………………(27) 第1章:绪论 在信息革命的浪潮中,人们普遍使用计算机来提高个人工作效率,但是在需要许多人一起协同工作的现代工作环境中,我们更需要提高我们的整体工作效率。 因此,即时通信软件是必不可少的。即时通信软件有多种多样的,各家公 司可以根据自己的情况来具体使用。比如ICQ和MSN可用于做国际贸易的公司,而对于国内联系频频的公司来说。BQQ是一个很不错的选择!从其功能来看,有即时通信、短讯中心、网络会议、分组讨论及与外网QQ通信功能。 以上提到的即时通信软件都需要上Internet网,适合于每天都有大量业务进出的大规模企业或跨国公司。并且其功能繁多、复杂,这就要求公司的员工都有较高的文化素质,才能懂得如何操作这类软件。 但是对于那些规模小、资金不足、员工不多且文化素质不高,不需要与外网连接的企业、小公司来说,只需要一套成本低廉、通讯效率高、便于管理、安全可靠、操作简单,可以方便的进行数据交换的适用于办公室内部局域网的小型软件即可。 本课题是销售管理系统的其中一个“内务咨讯”模块。通过客户端-普通员工访问服务器端-管理员来实现内务咨询、任务下达及普通员工的免费注册等实用功能。 只要普通员工或业务员登录正确的服务器,就可以通过网络与管理员进行即时的通信。而不必跑来跑去进行沟通,省时又省力。大大提高了企业的工作效率。 第2章:内务咨讯的总体设计 2.1总体规划 本系统是作为销售管理系统的“内务咨讯”平台。 2. 2系统设计 连接数据库 登录个人管理平台 内务咨讯平台 业务员管理平台 管理员操作平台 服务器端 客户端 服务器端启动 客户端启动 连接数据库 是否为新用户 是 注册 不同权限用户登录 内务咨讯 服务器端部分:程序启动时,先设置自己的本地服务器地址和服务器端口,因为有些端口有其 固 定 的 作 用, 如80 是WWW 端 口, 故 尽 可 能 选 择 不 可 能 使 用 的 端 口, 这 里 我 选 择 了55000。 将 连 接 状 态 设 置 为 假, 然 后 开 始 进 行 侦 听。 当 侦 听 到 有 计 算 机 要 求与 服 务 器 进 行 对 话, 就 接 受, 并 记 录 下 客 户 机 的 地 址、 端 口、 客 户 起 的 匿 名, 将 连 接 状 态 设 置 为 真,将 上 述 内 容 存 入 一 个 用 户 自 定 义 的 数 组 中, 进 行 动 态 维 护。 客户端部分:客 户端 程 序 启 动 后,已有的客户登录确认后。设 置 服 务 器 的 地 址 及端 口, 这 里 直 接 使 用 了“127.0. 1、Winsock 本系统主要通过Winsock控件来实现点对点的通讯。Winsock控件是VB5.0的新增功能,它解决了以往应用VB编程时网络中应用程序之间无法实现点对点通信的难题。Winsock使用的TCP协议和UDP协议允许建立并保持一个到远程计算机上的连接,且可以在连接结束之前实时地进行数据交换。用户仅通过设置属性并借助事件处理就能够轻而易举地连接到一个远程的计算机上,而且只用两个命令就可以实现数据交换。 使用TCP协议时,如果需要创建一个客户应用程序,就必须识别服务器的名称或IP地址。应用程序的通信端口随时都将仔细监测对方发出的消息,这是系统进行可靠连接的保证。一旦连接发生,任何一方都可以通过SendData发送和接收数据,并借助GetData把自己的数据分离出来。 传送数据时,需要先设定客户机的LocalPort属性,服务器则只需要把RemoteHost属性设定为客户机以太网的地址,并设定与客户机LocalPort属性相同的端口地址,借助SendData方法开始发送消息。客户机则在GetData事件中通过DataArrival事件分离出发送的信息。 一个Winsock控件可以让本地计算机连接到远程的计算机上,同时使用UDP或TCP协议,两个协议都能创建客户机和服务器应用。 使用Winsock控件时,通信的双方需要选定相同的协议。TCP协议适用于传送大容量、需要安全性保证的数据文件;而UDP协议适用于需要分别与很多下属通信,或者建立的连接比较多且为时变的情况,特别是在数据量很小的时候。设定时可以使用Winsock1.Protocol = sckTCPProtocol方法,首先要找到你的计算机的名称,并把它添入Winsock的LocalHost属性中。 创建一个应用程序时,首先要确定你建立的是客户方应用还是服务器服务,只有建立的服务器应用开始工作,并进入监听状态时,客户应用程序才开始建立连接,进入正常的通信状态。 使用UDP协议建立对等通信和通过TCP建立客户/服务器通信的方法略有不同,它不需要建立客户和服务器,而是建立对等通信。 Windows Sockets是Windows下得到广泛应用的、开放的、支持多种协议的网络编程接口。 2、编程环境的选择 微软公司的Visual Basic 6.0是Windows应用程序开发工具,使目前最为广泛的、易学易用的面向对象的开发工具。Visual Basic提供了大量的控件,这些控件可用于设计界面和实现各种功能,减少了编程人员的工作量,也简化了界面设计过程,从而有效的提高了应用程序的运行效率和可靠性。故而,实现本系统VB是一个相对较好的选择。Visual Basic应用程序基本的构建块是用户所创建的对象,每一个对象都具有一些特性和行为(属性、事件和方法)。开发人员可以最有效利用所创建的每一个对象。使用应用程序具有可通用性可说扩展性和强有力的功能。 关系型数据库的实现 Access2000 就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。Access 的优点在于它能使用数据表示图或自定义窗体收集信息。数据表示图提供了一种类似于 Excel 的电子表格,可以使数据库一目了然。另外,Access 允许创建自定义报表用于打印或输出数据库中的信息。Access也提供了数据存储库,可以使用桌面数据库文件把数据库文件置于网络文件服务器,与其他网络用户共享数据库。Access 是一种关系数据库工具,关系数据库是已开发的最通用的数据库之一。如上所述,Access 作为关系数据库开发具备了许多优点,可以在一个数据包中同时拥有桌面数据库的便利和关系数据库的强大功能。 第3章 系统功能具体实现 3.1服务器端功能模块设计: 1.“断开连接”的功能: 所有在客户端请求过连接的用户都还与服务器处于正常连接的前提下,服务器对第一个请求连接成功到最后一个请求连接成功的用户发出“you can quit” 的信息。状态栏中会相应显示还剩下几个在线的客户端用户。“连接的客户端”列表和服务器信息文本框中会提示“全部下线”及下线时间。 2.“退出”的功能: 所有在客户端请求过连接的用户都还与服务器处于正常连接的前提下,服务器对第一个请求连接成功到最后一个请求连接成功的用户发出“*you can quit”的信息。状态栏中会相应显示还剩下几个在线的客户端用户。“连接的客户端”列表和服务器信息文本框中会提示“全部下线”及下线时间。服务器并提示消息框“要保存文件后再退出吗?”如果选择“是”,则服务器通过CommonDialog(完成选择字体、打开文件之类的操作,只要将此控件放在窗体上,并调用相应方法即可。在运行时他部显示在窗体上,而像定时控件一样,向应用程序提供服务,但未必显示出来。)控件保存当天与客户端交流的数据信息以备日后查询用,然后服务器端退出。否则,服务器端直接退出。 1.“发送消息”的功能: 如选择“消息”主菜单的下一级子菜单的“发送消息”项,即可在txtsend文本框中输入消息,按回车键后,即可在服务器的rtbsave及客户端的rtbin两个richtextbox中看到消息,而txtsend中的消息将清空。 2.“客户列表”的功能: 如选择“消息”主菜单的下一级子菜单“客户列表”项,同时工具栏上的“客户列表”按纽呈按下状态。在服务器端的lstclient列表中显示与服务器连接成功的客户端的登录名。 1.“打开”的功能: 如选择“文件”主菜单的下一级子菜单项“打开”,则会启动CommonDialog控件打开文件对话框的功能,并打开frmInspect(服务器端日志文件窗口),在此窗口中显示CommonDialog选择的以前保存的聊天内容。 2.“保存”功能: 如选择“文件”主菜单的下一级子菜单“保存”,则会启动CommonDialong控件保存文件对话框的功能,把在服务器端rtbsave中的与客户端当天交流的数据消息保存到计算机硬盘中,以背日后查询。 3.2客户端功能模块的设计: 如果是已注册的管理员、业务员、或普通员工,则可直接进入“更改用户登录窗口”输入.用户权限及注册密码进入聊天客户器端准备与服务器端进行连接。如果是新用户,则进入“雇员信息”窗口进行用户相关信息的注册才能进入“更改用户登录窗口”。 对于新用户想使用办公QQ系统,必须先注册,填写有关个人信息,并与数据库sell_manage中的表“雇员”绑定,一旦有新的用户注册,则表“雇员”就新增一条记录。填写的个人信息有“雇员ID”(此项由系统根据数据库的记录个数自动提供个新用户)、姓名、密码、分机、电话、权限等。如放弃注册则回到欢迎界面。 无论新用户或是老用户都必须在该窗口中输入用户权限、密码才能进入聊天客户端。该窗口与数据库sell_manage中表“雇员绑定”。 对当天与服务器端管理员交流的消息觉得重要的,可利用此窗口通过CommonDialog控件进行保存,以备日后查阅。 无论新用户还是老用户在登录更改用户窗口后,都必须在“聊天客户端登录窗口”中输入要登录服务器的地址和端口号,只有输入正确才能进入聊天客户端准备与服务器进行连接。 模块是相对独立的程序单元。在Visual Basical中主要有3中模块,即窗体模块、标准模块和类模块。标准模块也称全局模块,由全局变量声明、模块层声明及通用过程等几个部分组成。一个过程可能用来响应几个不同对象中的事件,应该将这个过程放在标准模块中,而不应在每一个对象的事件过程中重复相同的代码。 客 户端 程 序 启 动 后,已有的客户登录确认后。 首 先 设 置 服 务 器 的 地 址 及 端口, 这 里 我 直 接 使 用 了“127.0. 3.3 硬件配置 1. PC机配置:服务器机子与客户端机子PentiumIV内存 2. 软件:Win98/Win2000/Winxp Ms-Office2000以上 3.4 数据库设计方案 数据库是按一定方式组织、存储、处理相互关联的数据的集合。数据库中的数据的组织形式有多种。其中用表格形式组织数据的方式称为关系数据库。实际上现在普遍使用的手术关系数据库。 在关系数据库中,实际保存数据的数据结构是一个后多个表,每个表定义了某种特定的结构。Visual Basic包含一个完整的数据库系统。 本课题采用的是Acess作为数据库。本课题定义的数据库名为:sell_manage;表为“雇员”表。 表:雇员
(1)“雇员ID”:为字符串型,由系统自动产生编号,每一个新用户都给定一个ID,不能修改。 (2)“姓名”:为字符串型,由用户在注册时填写。 (3)“密码”:为字符串型,由用户在注册时定义。 (4)“权限”:为字符串型,3-管理员 2-业务员 1- 普通员工 (5)“分机”:为字符串型,由用户在注册时填写。 (6)“电话号码”:为字符串型,由用户在注册时填写。 第4章 系统详细设计 4.1、聊天服务器端系统详细设计: ‘定义与服务器建立过连接的客户端机子的个数 dim num as integer dim flag as Boolean ‘boolean:布儿数据类型,存放True或False值。当为True时,表示退出服务器端;当为False时,表示没有退出服务器端。 dim exitserver as Boolean ‘定义在线的客户端机子数 dim numonline as integer dim clientname(1 to 5) dim allquit as Boolean
Tcpserver_ConnectionRequest 过 程 处 理 连 接 请 求, 当客户端 计 算机 要 求 连 接 时, 服 务 器 首 先 检 查 用 户 自 定 义 数 组 中 是 否 有 空 闲 位 置( 因 为 在 谈 话 中 途, 肯 定 会 有 人 退 出, 所 以 会 产 生 空 闲 位 置), 如 果 有 则 选 择 空 闲位 置 给 予 要 求 连 接 的 客 户, 否 则 将 数 组 维 数 加 一, 将 之 给 予 请 求 连 接 的 远 程 节 点。 错 误 处 理 主 要 是 忽 略 两 个 或 两 个 以 上 的客 户 同 时 要 求 连 接 时 产 生 的 地 址 冲 突 现 象。 代码如下: Private Sub tcpServer_ConnectionRequest(Index As Integer, ByVal requestID As Long) If Index = 0 Then Num = Num + 1 NumOnline = NumOnline + 1 Load tcpServer(Num) ‘状态栏上显示在线的客户端机子的数量 StatusBar1.Panels(1).Text = "There are " & NumOnline & "Client connected" tcpServer(Num).LocalPort = 0 ‘服务器获得客户端连接机子的IP地址 tcpServer(Num).Accept requestID End If End Sub (2) 处 理 处 于 连 接 状 态 的 用 户 发 送 来 的 信 息: tcpServer_DataArrival 过 程 处 理 客 户 端 传 来 的 数 据。 代码如下: ‘定义sdata为要从客户端接收的数据 Dim sData As String ‘定义sname为从客户端接收数据的第一个字符 Dim sName As String tcpServer(Index).GetData sData ‘下一个发送过来的数据的显示位置 rtbSave.SelStart = Len(rtbSave.Text) sName = Left(sData, 1) ‘如接收到数据的第一个字符为“/”,则向客户端发送连接成功的信息 If sName = "/" Then lstClient.AddItem sData + CStr(Now()) tcpServer(Index).SendData "recieved successfully" ‘如接收到数据的第一个字符为“^”,则表示客户端请求断开,服务器发送允许断开的信息 ElseIf sName = "^" Then justsend.Text = Index & "you can quit." tcpServer(Index).SendData "you can quit." ‘客户端收到可以断开的信息及时间 lstClient.AddItem sData + CStr(Now()) NumOnline = NumOnline - 1 StatusBar1.Panels(1).Text = "There are " & NumOnline & "Client connected" ‘如接收到数据的第一个字符为“*”,表示客户端请求断开并退出办公QQ聊天系统。服务器发出同意信息 ElseIf sName = "*" Then tcpServer(Index).SendData "*you can quit." lstClient.AddItem sData + CStr(Now()) justsend.Text = Index & "*you can quit." NumOnline = NumOnline - 1 StatusBar1.Panels(1).Text = "There are " & NumOnline & "Client connected" End If ‘下一个发送到服务器端消息的显示位置 rtbSave.SelStart = Len(rtbSave.Text) rtbSave.Text = rtbSave.Text + Chr(13) + Chr(10) + sData txtout.Text = sData rtbSave.SelStart = Len(rtbSave.Text) End Sub (3). 关 闭 客 户 连 接 “断开连接”: Private Sub mnuBreak_Click() For i = 1 To Num If tcpServer(i).State <> sckClosed Then tcpServer(i).SendData "you can quit." justsend.Text = i & "you can quit." NumOnline = NumOnline - 1 StatusBar1.Panels(1).Text = "There are " & NumOnline & "Client connected" End If Next i lstClient.AddItem "全部下线!" + CStr(Now()) rtbSave.SelStart = Len(rtbSave.Text) rtbSave.Text = rtbSave.Text + Chr(10) + "全部下线!" + CStr(Now()) End Sub “退出”: Private Sub mnuExit_Click() For i = 1 To Num If i = Num Then allquit = True If tcpServer(i).State <> sckClosed Then tcpServer(i).SendData "*you can quit." justsend.Text = i & "you can quit." NumOnline = NumOnline - 1 StatusBar1.Panels(1).Text = "There are " & NumOnline & "Client connected" End If Next i response = MsgBox("要保存文件后再退出吗?", vbYesNo, "退出") If response = vbYes Then CommonDialog1.ShowSave rtbSave.SaveFile (CommonDialog1.FileName) End If End Sub (1)服务器运行后 Private Sub Form_Load() ‘状态栏显示没有连接的客户端 StatusBar1.Panels(1).Text = "Now there is nobody connected" Num = 0 NumOnline = 0 ‘服务器端的断口号设置为5000 tcpServer(0).LocalPort = 5000 ‘服务器处于帧听状态 tcpServer(0).Listen ‘两个标签框显示服务器的IP地址和端口号 Label1.Caption = Label1.Caption + CStr(tcpServer(0).LocalIP) Label3.Caption = Label3.Caption + CStr(tcpServer(0).LocalPor) End Sub (2)客户列表 Private Sub mnuList_Click() mnuList.Checked = Not mnuList.Checked If mnuList.Checked Then ‘工具栏上的客户列表按钮成按下状态 Toolbar1.Buttons("List").Value = tbrPressed Me.lstClient.ForeColor = RGB(0, 0, 0) Else Toolbar1.Buttons("List").Value = tbrUnpressed Me.lstClient.ForeColor = Me.lstClient.BackColor End If End Sub (3)文件“打开”功能: Private Sub mnuOpen_Click() CommonDialog1.ShowOpen frmInspect.rtbOpen.LoadFile (CommonDialog1.FileName) frmInspect.Show End Sub (4)文件“保存”功能: Private Sub mnuSave_Click() CommonDialog1.ShowSave rtbSave.SaveFile (CommonDialog1.FileName) End Sub (5)“发送消息”功能: Private Sub mnuSend_Click() mnuSend.Checked = Not mnuSend.Checked TxtSend.Locked = Not TxtSend.Locked End Sub (6)服务器发送数据完毕: Private Sub tcpServer_SendComplete(Index As Integer) If justsend.Text <> "" Then tcpServer(Left(justsend.Text, 1)).Close StatusBar1.Panels(1).Text = "There are " & NumOnline & "Client connected" justsend.Text = "" End If If allquit = True Then tcpServer(0).Close Unload Me allquit = False End If End Sub (7)工具栏上按钮功能实现: Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Select Case Button.Key Case "Open" CommonDialog1.ShowOpen rmInspect.rtbOpen.LoadFile(CommonDialog1.FileName) frmInspect.Show Case "Quit" response = MsgBox("要保存文件后再退出吗?",vbYesNo, "退出") If response = vbYes Then CommonDialog1.ShowSave rtbSave.SaveFile (CommonDialog1.FileName) End If End Case "Save" CommonDialog1.ShowSave rtbSave.SaveFile (CommonDialog1.FileName) Case "List" mnuList_Click End Select End Sub (8)服务器端发送信息缓冲区功能: Private Sub txtOut_Change() For i = 1 To Num If tcpServer(i).State <> sckClosed Then tcpServer(i).SendData txtout.Text End If Next i End Sub (9)发送文本框实现代码: Private Sub TxtSend_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = 13 Then For i = 1 To Num If tcpServer(i).State = sckClosed Then Else tcpServer(i).SendData "server:" & TxtSend.Text End If Next i rtbSave.SelStart = Len(rtbSave.Text) rtbSave.Text = rtbSave.Text + Chr(10) + "server:" + TxtSend.Text TxtSend.Text = "" End If End Sub 4.2、聊天客户端系统详细设计 Private Sub Command3_Click() ‘如果数据库呈打开状态,则关闭数据库 If cn.State = 1 Then cn.Close cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Text2.Text & ";Persist Security Info=False" ‘绑定记录集 reopt.Open "select * from 雇员", cn, 3, 3 MsgBox "数据库连接成功!" End Sub 1、 雇员信息窗口代码: ‘设ree记录集变量 Dim ree As New ADODB.Recordset Private Sub cmdens_Click() welcome.Show frmopt.Hide End Sub Private Sub Command1_Click() ‘如果两次输入的密码一致,则向记录集中添加一条记录 If Val(password(0).Text) = Val(password(1).Text) Then ree.AddNew ree.Fields("雇员ID").Value = id.Text ree.Fields("姓名").Value = 姓名.Text ree.Fields("密码").Value = password(0).Text ree.Fields("权限").Value = "1" ree.Fields("分机").Value = 分机.Text ree.Fields("工作电话").Value = telephone.Text frmopt.Hide Frmlog.Show MsgBox "恭喜你,注册成功!" Else ‘如两次输入的密码不一致,则提示重输密码 MsgBox "密码输入错误,请核对密码!" End If ree.Update End Sub Private Sub Form_Load() If ree.State = 1 Then ree.Close ‘打开记录集 ree.Open "select * from 雇员", cn, 3, 3 id.Enabled = False id.Text = ree.RecordCount + 1 End Sub 2、 更改用户登录窗口代码: Private Sub Combo1_Click() If reopt.State = 1 Then reopt.Close Select Case Combo1.Text ‘如选择普通员工权限,则记录集选择权限为普通员工的记录 Case "普通员工" reopt.Open "select * from 雇员 where 权限='" & 1 & "'", cn, 1, 2 ‘如选择业务员权限,则记录集选择权限为业务员的记录 Case "业务员" reopt.Open "select * from 雇员 where 权限='" & 2 & "'", cn, 1, 2 ‘如选择管理员权限,则记录集选择权限为管理员的记录 Case "管理员" reopt.Open "select * from 雇员 where 权限='" & 3 & "'", cn, 1, 2 End Select ‘控件绑定到记录集的“姓名”字段 Set DataCombo1.DataSource = reopt Set DataCombo1.RowSource = reopt DataCombo1.DataField = "姓名" DataCombo1.ListField = "姓名" End Sub Private Sub Command1_Click() If reopt.State <> 1 Then MsgBox "请确认输入了用户组!" Exit Sub End If ‘如果姓名、密码都与记录集中的记录相符合,则进入客户端登录窗体,否则提示密码出错,请重输 For i = 0 To reopt.RecordCount If reopt.Fields("姓名") = DataCombo1.Text Then If reopt.Fields("密码") = Text1.Text Then frmClientLogIn.txtUserName.Text = DataCombo1.Text MsgBox "欢迎使用" Unload Frmlog frmClientLogIn.Show Exit Sub Else: MsgBox "密码出错!请重输" Exit Sub End If Else: reopt.MoveNext End If Next i If repu.EOF Then MsgBox "这个组里没有这个用户,请注册或联系管理员!" End Sub Private Sub Command2_Click() Welcome.show Unload Me End Sub Private Sub Command3_Click() ‘绑定数据库,记录集 If cn.State = 1 Then cn.Close cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Text2.Text & ";Persist Security Info=False" reopt.Open "select * from 雇员", cn, 3, 3 End Sub 3、 聊天客户端日志窗体代码: Private Sub CmdOpen_Click() ‘通过通用对话框控件打开文件对话框,查阅以前保存的重要的聊天内容 On Error Resume Next Me.CommonDialog1.ShowOpen Me.rtbOpen.LoadFile Me.CommonDialog1.FileName End Sub ‘关闭日志窗体,返回到聊天客户窗体 Private Sub CmdReturn_Click() Unload Me Frmclient.Show End Sub 4、 标准模块代码: Public serverip As String Public flag As Boolean Public serverport As String Public cn As New ADODB.Connection Public recus As New ADODB.Recordset Public reopt As New ADODB.Recordset Public optID As String Public optname As String Public Function save() ‘在聊天客户端登录窗体的txtserver文本框中输入的服务器IP地址赋给字符串变量serverip serverip = frmClientLogIn.txtserver.Text ‘在聊天客户端登录窗体的txtpornum文本框中输入的服务器断口号赋给字符串变量severport serverport = frmClientLogIn.txtPorNum.Text frmClientLogIn.txtserver.Locked = True frmClientLogIn.txtPorNum.Locked = True flag = True End Function Public Function cncsave() frmClientLogIn.txtserver.Locked = False frmClientLogIn.txtPorNum.Locked = False flag = False End Function Public Function frmlgsave() frmClientLogIn.txtserver.Text = serverip frmClientLogIn.txtPorNum.Text = serverport frmClientLogIn.txtserver.Locked = True frmClientLogIn.txtPorNum.Locked = True frmClientLogIn.Chksave.Value = 1 End Function Public Function frmlginit() ‘用户登录后,txtserver文本框清空 frmClientLogIn.txtserver.Text = "" ‘用户登录后,txtpornum文本框清空 frmClientLogIn.txtPorNum.Text = "" frmClientLogIn.txtserver.Locked = False frmClientLogIn.txtPorNum.Locked = False End Function Private Sub Chksave_Click() ‘如该复选框被选中,则保存该登录用户,否则不保存 If Chksave.Value = 1 Then Call save Else Call cncsave End If End Sub Private Sub cmdOK_Click() ‘如服务器IP地址没输,则提示消息框要求输入服务器IP地址 If txtserver.Text = "" Then MsgBox "请输入服务器IP!" Exit Sub End If ‘如服务器端口号没输,则提示消息框要求输入服务器端口号 If txtPorNum.Text = "" Then MsgBox "请输入端口号!" Exit Sub End If If Chksave.Value = True Then ‘服务器IP地址和端口号都被锁住 frmClientLogIn.txtserver.Locked = True frmClientLogIn.txtPorNum.Locked = True End If ‘聊天客户窗体显示 Frmclient.Show ‘在聊天客户窗体的txthost显示服务器的IP地址 Frmclient.txtHost = frmClientLogIn.txtserver.Text ‘在聊天客户窗体的txtpronum显示服务器的端口号 Frmclient.txtPort = frmClientLogIn.txtPorNum.Text ‘lblname标签框显示登录用户名 Frmclient.lblName = frmClientLogIn.txtUserName ‘连接按钮呈可按状态 Frmclient.cmdConnect.Enabled = True ‘断开按钮呈可按状态 Frmclient.cmdQuit.Enabled = True 聊天客户端登录窗体关闭 Unload frmClientLogIn End Sub Private Sub Form_Load() If flag = True Then ‘调用标准模块中的通用过程frmlgsave Call frmlgsave Else ‘调用标准模块中的通用过程frmlginit Call frmlginit End If End Sub 5、 聊天客户窗体代码: ‘定义newclient、cusexit为布尔数据类型 Dim NewClient As Boolean Dim cusexit As Boolean Private Sub cmdConnect_Click() On Error GoTo errhandle: cmdConnect = False cmdQuit.Enabled = True ‘txthost文本框内显示的IP地址赋给准备连接服务器的IP地址 tcpclient.RemoteHost = txtHost.Text ‘txtport文本框内显示的端口号赋给连接服务器的端口号 tcpclient.RemotePort = txtPort.Text tcpclient.Connect NewClient = True Cmdconnect.enabled=false Exit Sub errhandle: ‘连接失败是提示错误信息 MsgBox err.Description End Sub Private Sub cmdExit_Click() On Error GoTo err cusexit = True ‘如果客户端处于连接状态,则向服务器发出退出的请求及时间 If tcpclient.State <> sckClosed Then tcpclient.SendData "^exit:" & lblName.Caption & CStr(Now()) Else ‘如客户端已处于退出状态,再发出退出请求,则提示“你已经退出办公QQ”的信息 MsgBox "你已经退出办公QQ!" End End If Exit Sub err: MsgBox "你已经退出办公QQ!" Unload Me End Sub ‘按登录按钮,则显示聊天客户端登录窗体 Private Sub cmdLogin_Click() Load frmClientLogIn frmClientLogIn.Show End Sub ‘按下“断开”按钮 Private Sub cmdQuit_Click() On Error GoTo errhandle: ‘如果客户端处于连接状态,则向服务器发送断开请求及时间,否则提示“你已经下线了!”的消息 If tcpclient.State <> sckClosed Then tcpclient.SendData "^quit:" & lblName.Caption & CStr(Now()) Else MsgBox "你已经下线了!" cmdQuit.Enabled = False End If Cmdconnect.enabled=true Exit Sub errhandle: MsgBox err.Description End Sub Private Sub Form_Load() Me.cmdConnect.Enabled = False Me.cmdQuit.Enabled = False End Sub ‘卸载“聊天客户端”窗体 Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) End End Sub ‘按下“连接”按钮 Private Sub tcpClient_Connect() txtOut.Locked = False ‘向服务器端发送登录用户名 tcpclient.SendData "/登录:" + lblName.Caption End Sub ‘ 客户端产生服务器端发送的数据 Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long) Dim sData As String ‘如果newclient为真,则收到服务器端发送的已经成功连接的消息 If NewClient Then MsgBox "has connected successfully" NewClient = False End If tcpclient.GetData sData ‘客户端显示消息的位置 rtbIn.Text = rtbIn.Text + Chr(13) + Chr(10) + sData rtbIn.SelStart = Len(sData) ‘如果收到数据的左边13个字符为“you can quit”,则客户端产生关闭,并卸载自己 If Left(sData, 13) = "you can quit." Then tcpclient.Close If cusexit = True Then MsgBox "你已经退出办公QQ!" Unload Me Else MsgBox "你已经下线了!" Cmdconnect.enabled=true cmdQuit.Enabled = False End If End If ‘如果产生数据左边14个字符为“*you can quit”,则客户端产生关闭,提示消息:已经退出办公QQ. If Left(sData, 14) = "*you can quit." Then tcpclient.Close MsgBox "服务器已退出办公QQ!" End If cusexit = False '收到同意退出的指令后作出御载窗体动作。 End Sub ‘客户端工具栏按钮实现代码: Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button) Select Case Button.Key Case Is = "open" CommonDialog1.ShowOpen frmInspect.Show frmInspect.rtbOpen.LoadFile (CommonDialog1.FileName) Case Is = "Login" cmdLogin_Click Case Is = "Quit" cmdQuit_Click Case Is = "Save" CommonDialog1.ShowSave rtbIn.SaveFile (CommonDialog1.FileName) End Select End Sub Private Sub txtOut_KeyUp(KeyCode As Integer, Shift As Integer) On Error GoTo errhandle: ‘当按回车键后,客户端向服务器发送用户名及txtout内的消息,txtout内清空 If KeyCode = 13 Then tcpclient.SendData lblName.Caption + ":" + txtOut.Text txtOut.Text = "" End If Exit Sub errhandle: MsgBox err.Description End Sub 第5章 结论 对于局域网用户中的编程爱好者来说,如果能自己编一个局域网通信程序,那么这一切将是多么美妙!可是,如果要从头开始完全由自己来编写一段用于通信的程序,必须对相关的网络协议及其他的一些较底层的技术有较深入的了解,这可不是一件容易的事。而现在有了Winsock控件,一切就不同了,它已经替你封装了所有烦琐的技术细节,并提供了访问TCP和UDP网络服务的方便途径。你只需通过设置控件的属性并调用其方法就可轻易连接到一台远程计算机中,并且还可以双向交换数据,而这一切都不需你了解TCP的细节或调用低级的Winsock APIs。 经过三个多月的设计和开发,内务咨讯系统基本开发完毕。其功能基本符合用户需求,能够实现数据库的连接,用户的注册、登录。客户端用户可以向服务器端管理人员咨询,服务器端管理人员可以向客户端用户答疑、下达任务。服务器端和客户端都可以保存浏览当天有用信息。 致谢 在本次毕业设计中,我得到了指导老师 参考文献 [1]清汉计算机工作室·Viusal Basic 6.0网络开发实例·机械工业出版社·2000年 [2]谭浩强、薛淑斌、袁玫·Visual Basic程序设计·清华大学出版社·2000年1月 [3]谭浩强、刘炳文·Visual Basic程序设计(第二版)·清华大学出版社·2003年7月 [4]Enangelos Petroutsos·Visual Basic 6从入门到精通·电子工业出版社·1999年1月 [5]罗运模、王珊文.SQL Server数据库系统基础·高等教育出版社·2002年8月 |
销售管理系统—内务咨讯
查看评论
已有0位网友发表了看法