企业内部即时通讯系统的设计与实现毕业设计说明书.doc
毕业设计说明书企业内部即时通讯系统的设计与实现电子与计算机科学技术学院0906064109海南社区学生姓名: 学号: 学 院: 网络工程专 业: 指导教师: 2013年6月企业内部即时通讯系统的设计与实现摘 要随着计算机网络应用的逐渐普及,网络已经成为人们掌握信息、交流信息以及管理信息必不可少的重要工具。实时通信的出现给人们带来了极大的便捷,同时也带来了时间和经济上的节省。如今,网络即时通信已经逐步发展成为应用于各行各业的信息交流工具。通过设计和实现一款集即时通信与人事管理于一体的网络应用程序,讨论并分析在TCP/IP协议的基础上设计并实现一个C/S结构的即时通信系统的详细过程。首先,介绍网络即时通信开发的必备技术知识,包括常用的即时通信系统的客户端和服务器端的通讯协议,以及即时通信系统的功能设计、系统结构模式设计、数据信息设计等。其次,分析和设计客户端与服务器端之间的通信协议,以规范系统中端与端的数据传输过程。然后,对系统中最重要的部分即网络传输控制模块,进行详细的设计说明以及简单的实现方案的阐述。最后,描述即时通信系统整体的逻辑处理流程,以及该系统在人事管理方面的功能实现,以及其他部分已通过测试服务器程序测试的客户端程序代码。即时通信系统的设计与实现在企业建立自己特色的集信息管理和即时通信为一体的内部应用软件方面具有一定的应用前景。关键词:即时通信,网络应用程序,TCP/IP,通信与办公系统Design and Implementation of Enterprise Instant Messaging SystemAbstractAs the widespread of web application, internet has become the indispensable tool for information acquisition,communication and management.The advent of real-time communication has brought people great convenience as well as saving time and money. Nowadays, web-based real-time communication has been developed to a communication tool for many fields.Analyzes and discuss the process of designing and implementing a real-time communication system of C/S structure based on TIP/IP protocol, through designing and implementing a network application combined the functions of instant communication tool and also a personnel management tool. First, to introduce some necessary technical knowledge and the functional designing、system structure module designing and data information designing of development of the IM system. Second, analyze and design the communication protocol between Client and Server of the system to regular the data transportation process between ports. Third, describe the designing and implementation of the most important part of the system which is the web transportation controlling module. Finally, introduce the logic processing of the whole IM system and some client programs or code which have passed the testing of server program.Designing and implementing of IM system has a definite applying prospect in the aspect of building an interior and own application which gather instant messaging and information managing.Key words:Instant Messaging,Network Application,TCP/IP,IM in Office目 录1 引言11.1 课题的背景与意义11.2 相关技术知识简介21.2.1 基于SOCKET的网络编程21.2.2 UDP协议与TCP协议的简单介绍21.2.3 WINSOCK套接字API调用的简单流程32 系统的相关分析与总体设计42.1 设计目标42.2 需求分析42.2.1 功能性需求分析42.2.2 系统用例分析42.3 概要设计原则52.4 系统安全与分析设计62.5 数据库结构设计72.6 系统开发环境和运行环境92.6.1 系统的开发环境92.6.2 系统的运行环境93 系统详细设计与实现103.1 系统登录界面103.2 系统主界面133.3 系统聊天通讯界面153.4 查找好友界面183.5 个人设置界面213.6 密保安全界面234 系统测试264.1 软件测试介绍264.2 软件测试过程264.3 本系统所进行的测试26总 结27参考文献28致 谢301 引言1.1 课题的背景与意义随着计算机网络的发展,人类的通信方式也发生了翻天覆地的变化。网络通信早已取代传统的纸质信件,电话网络的地位也在这个年代受到了来自计算机网络的挑战。总之,网络通信在我们的生活和企业中可以说已经必不可少,企业内部即时通讯就是其中的重要组成部分1。目前,中国市场上的企业级即时通信工具主要包括:易睦网络的imo云办公室、叮当旺业通、Anychat、网络飞鸽、汇讯WiseUC、大蚂蚁Bigant、上海盈硕的蚁傲、腾讯RTX、FastMsg、263EM、IBM的Lotus Sametime、点击科技的GKE、中国移动的企业飞信、华夏易联的e-Link、网络飞鸽QuickDove等2。相对于个人即时通信工具而言,企业级即时通讯工具更加强调安全性、实用性、稳定性和扩展性,同时更可根据应用的实际能按需定制,随着企业信息化进程的不断演进,企业即时通讯在企业中的应用将越来越广泛。企业内部即时通讯系统是企业员工在工作时经常要与其他同事进行协同工作和跨部门合作,全方位地利用有限资源协同完成更多工作,因此各部门同事间需要进行即时的沟通。采用JMS (Java Message Service)技术实现企业内部的即时通讯系统。使该系统为使用者提供即时消息、网络会议、文件传输、系统公告等功能,可实现使用者与各部门同事间协同办公的要求,满足企业内部进行更加高效沟通的需求,为企业提供一种公共的、可靠的内部沟通方式。企业内部即时通讯系统的好处: (1)提高工作效率:在与公司客户与同事沟通时能够达到提高工作效率。 (2)快速解决沟通问题。 (3)可以迅速知道对方是否在线。 (4)与邮件、移动短信结合更是威力无穷。当适合公司的即时通讯系统广泛应用于工作后,交流渠道便于扁平化管理,业务上的平等交流;因为是书面交流,有利于理清头绪,明晰表达;而且,办公室人与人之间的关系变得更加真诚和紧密。 所以纵上所述,如果企业要用即时通信,最好用专用的企业即时通讯系统,而最好不要用个人即时通讯3-5。1.2 相关技术知识简介1.2.1 基于SOCKET的网络编程SOCKET在英文中的意思是插座,在网络编程中,其实际意义可以理解为网络通信连接的插座,通常称之为套接字。如果将网络连接的各终端类比为电话,则SOCKET即相当于电话线插座,为各终端提供或创建与其他终端通信连接的桥梁或通道。所有的终端都必须接通此“插座”来完成与其他终端的连接或通信,否则,它将独立于网络之外6。由此可以知道知道,SOCKET是终端间建立连接的核心对象。那么,对于一个SOCKET对象,它到底具备什么样的功能呢?通常,用WINSOCK库来创建和使用SOCKET,运用WINSOCK库的基本API,就可以实现简单的数据输入和输出(即发送数据和接受数据)。在创建一个SOCKET对象后,通过指定IP地址来确定该SOCKET与哪台机器发生交流,通过指定机器端口号(一般为1024以上)确定与该机器上哪个应用程序进行交流。在确定了交流对象后,便可以使用SOCKET与对象机器上的应用程序进行数据的传输和信息的交流。在面向连接的网络通信中,还必须使用SOCKET进行连接的监听和创建,只有创建了稳定的连接后,才开始进行数据的传输7。由于交互方式的不同,SOCKET也分为两种,一种是无连接的数据报形式的,一种则是面向连接的流式套接字,这也是接下来两小节要阐述的内容8。1.2.2 UDP协议与TCP协议的简单介绍UDP协议是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数据报可能没有什么联系9。UDP不提供可靠性:它把应用程序传给IP层的数据发送出去,但是并不保证它们能到达目的地,其过程可以比做投递信件,它只关心信件确实投放到信箱,至于对方是否正确、按时收到信件,UDP并不关心10。尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务。TCP提供一种面向连接的、可靠的字节流服务11。面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。这一过程与打电话很相似,先拨号振铃,等待对方摘机说“喂”,然后才说明是谁并与之开始对话12。1.2.3 WINSOCK套接字API调用的简单流程本论文所要讨论的即时通信系统则是通过WINSOCK库的应用来设计和实现基于TCP的C/S结构的网络即时通信程序。这里,用图的方式简单的表示出对WINSOCK库提供的API函数调用过程13。2 系统的相关分析与总体设计2.1 设计目标本系统主要是为中小型企业内部使用的带有简单人事管理功能的局域网即时通信系统,由于要存储并管理用户相关信息的数据,同时要限制普通用户对数据信息的管理权限,比较合适的设计是采用C/S模式的系统架构,数据由数据库进行存储,由服务器对数据库进行直接操作,而客户端则通过对服务器发出请求得到相应的数据或者告知服务器对数据库进行何种操作14。2.2 需求分析2.2.1 功能性需求分析本系统这实现了企业内部网络聊天工具所具备的基本功能,即注册、登录、查找好友,添加好友、更改个人资料、查看好友资料、添加删除分组、各分组之间转移好友、发送消息、接收消息、接收系统消息等,还添加了一些特色功能,如隐身,头像的变化,系统管理员可以向每个客户端发送系统消息,上线下线在好友客户端都有提示,密码丢失可以通过密码找回功能通过设置的密保问题找回密码,并可以判断密码的安全等级等。本系统实现了一个与Tencent QQ相似的友好操作界面,简单,易用,适合用户的操作习惯15。谢谢海南社区支持:该系统具备了网络聊天工具所具备的基本功能,系统或许存在一些未知的Bug,还需要进一步的改进和测试。在以后的研究中,我们还会研究安全通信协议,保障通信的安全,提高系统的实用性等16。2.2.2 系统用例分析 (1)系统普通用户用例分析登录界面查看好友信息更改个人信息添加删除分组发送信息密保设置接受信息分组转移好友背景更改 普通用户图2.1 系统普通用户用例图查找好友 (2)系统管理员用例分析操作数据库查看操作日志发布系统公告系统管理员图2.2 系统管理员用例图2.3 概要设计原则 企业内部即时通讯系统总体设计目的是加强对需求分析阶段的功能性需求和非功能性需求的综合考虑和理解,系统建设中我们将采用基于C/S模式构建。这些技术的应用实现系统应用的安全、稳定及扩展要求以及开放的跨平台能力和兼容性17。实现了操作界面、应用逻辑、业务数据相对独立,使本系统的实施更加方便、灵活、易于扩展18。为了进一步的规划详细的系统解决方案做准备,本系统在设计过程中注重考虑了以下几个特性: (1)实用性本系统的现实需求就是针对企业内部工作交流不便,浪费时间,数据传送效率低等特点,希望提出一个实用的能满足系统的功能要求和实际应用的需要的企业内部即时通讯系统。所以尽量选择成熟实用的技术,使得整个系统有一个安全、稳定的运行环境19。 (2)可扩展性为使系统能有良好的兼容性和可扩展性,系统在设计时充分考虑了数据库设计容量与处理能力等方面的扩充与升级的可能,不仅充分保护了原有投资,还保证了以后系统功能升级的方便20。 (3)安全性系统对数据的完整性和安全性具有很高的要求。为了保障系统平稳正常的运行,整个系统必须具有很高的安全可靠性,因此,在企业内部即时通讯系统应充分利用数据库的维护工具,便于数据备份、恢复,从而提高系统的安全性21。 (4)可维护性企业内部即时通讯系统的设计要本着“简单易用”的原则,方便用户的使用。对于用户来说,只要掌握基本的计算机操作,便可完成整个操作对于管理员来说,设计时以可维护性为主,做到故障易于排除,日常管理操作简便22。 (5)完整性系统的完整性,涉及到友好的用户界面,高效的信息处理,安全可靠的数据管理,以及优化的网络设计23。2.4 系统安全与分析设计 由于本系统的的安全界面中,分为:“安全概述”,“常见欺诈”,“修改密码”,“修改密保”; (1)安全概述分析设计:主要是描述飞狐2013系统当前帐号的安全状况 if (设置密保并且密码等级为良好以上) 安全状况良好请继续保持良好的习惯 可立即完成设置密码 else if (设置密保并且密码等级为中等以下) 安全状况存在隐患请定期修改密码 立即完成设置密码 else 安全状况危险请立刻设置密保问题 立即完成设置密保 (2)常见欺诈 常见的集中欺诈方式:钓鱼网址,视频欺诈,中奖欺诈,冒充好友欺诈; (3)修改密码 修改密码之前请确保设置密保;如果没有设置密保问题,请先设置密保问题,以确保该账户的安全性。如果设置了密保问题,请先输入原密保问题,核对用户身份。密保正确才可以修改,如果错误,则不能修改密码。 (4)修改密保 如果没有设置密保问题,设置密保问题。如果设置了密保问题,请先输入原密保问题,核对用户身份。密保正确才可以修改,如果错误,则不能修改密保。2.5 数据库结构设计本系统数据库采用 mysql5.6,系统主要需要维护3张数据表:名称登录信息描述用户登录时的账号密码检测来源用户去处服务器用户表组成ID+密码 表2.1 登录信息表表2.2 好友信息表名称取值类型长度昵称Char8IDInt6到8位密码Char6-16问题NOInt1-2问题答案Char20登录状态Int1 年龄Smallint0-99 地区Char20性别Char2签名Char100说明Char255问题详细Char20好友IDInt6-8好友类型Int1好友分组Int1备注char10好友类型详细Char6好友分组详细Char10日期Date内容Char255表2.3 注册信息名称注册信息描述注册新账号来源用户去处服务器用户表组成密码+个人资料表2.4 机位信息表名称聊天信息描述用户聊天时发送信息来源用户去处聊天记录表组成发送方IP+接收方IP+消息内容2.6 系统开发环境和运行环境2.6.1 系统的开发环境本系统开发平台选择考虑到以下几个方面的因素:硬件环境、数据的安全性以及技术支持等等。因此选择操作系统:Windows 7、Windows XP;开发工具:Eclipse;数据库:MySQL6.0;开发语言:Java。2.6.2 系统的运行环境本系统由两部分组成:置于个用户PC机上的飞狐2013客户端,以及置于实验室高性能服务器上的数据库服务器。根据调研得知客户端的计算机配置Pentum4级别以上,服务器PC应配备更高的配置,在Windows xp环境下运行。3 系统详细设计与实现3.1 系统登录界面系统用户登录时,先打开登录页面,然后填写用户和密码信息,并选择状态,点确定后连接数据库,检验用户名密码是否正确,正确则进入到系统主界面。不正确则提示输入的密码有误,请重新输入。输入密码选择状态输入的密码是否正确登录成功跳转到主页面其它操作图3.1 用户登录流程图YN输入用户名图3.2 软件登录界面核心代码:private void jb_loginactionPerformed(ActionEvent e) throws UnknownHostException, IOException, InterruptedExceptionif (jt_user.getText().equals("")JOptionPane.showMessageDialog(null, "请输入账号后再登陆", "提示", JOptionPane.INFORMATION_MESSAGE);else if(jt_user.getText().length() < 6 | jt_user.getText().length() > 20)JOptionPane.showMessageDialog(null, "请输入正确的账号,账号可以位数字或Email地址。", "提示", JOptionPane.INFORMATION_MESSAGE);else if (jp_password.getText().equals("")JOptionPane.showMessageDialog(null, "请输入密码后再登陆", "提示", JOptionPane.INFORMATION_MESSAGE);elselogin_message lmessage = new login_message(jt_user.getText(), jp_password.getText(), 0, 0, 0, 0, jco_status.getSelectedIndex() + 1);MainInterface main = new MainInterface(lmessage);this.dispose();private void jb_loginactionPerformed(KeyEvent e) throws UnknownHostException, IOException, InterruptedExceptionif (jt_user.getText().equals("")JOptionPane.showMessageDialog(null, "请输入账号后再登陆", "提示", JOptionPane.INFORMATION_MESSAGE);else if (jt_user.getText().length() < 6 | jt_user.getText().length() > 20)JOptionPane.showMessageDialog(null, "请输入正确的账号,账号可以位数字或Email地址。", "提示", JOptionPane.INFORMATION_MESSAGE);else if (jp_password.getText().equals("")JOptionPane.showMessageDialog(null, "请输入密码后再登陆", "提示", JOptionPane.INFORMATION_MESSAGE);elselogin_message lmessage = new login_message(jt_user.getText(), jp_password.getText(), 0, 0, 0, 0, jco_status.getSelectedIndex() + 1);MainInterface main = new MainInterface(lmessage);this.dispose(); 冯武宝 海南社区 3.2 系统主界面图3.3 系统主界面核心代码:class loginFounction extends Threadpublic void run()trylogin_message lm = new login_message(lmessage.qq, lmessage.password, sys_port, main_port, alive_port, transmit_port, lmessage.status);loginClientThread loginThread = new loginClientThread(lm);loginThread.join(30000);if (loginThread.changed = 1)sendHeartbeatThread_main_temp.start();load();changed = 1;else if (loginThread.changed = 2)/ 当账号和密码不匹配时JOptionPane.showMessageDialog(null, "您的账号和密码不匹配!", "提示", JOptionPane.INFORMATION_MESSAGE);System.exit(0);else/ 当登录超时的情况JOptionPane.showMessageDialog(null, "系统繁忙,请稍后再试!", "提示", JOptionPane.INFORMATION_MESSAGE);System.exit(0);catch (Exception e)class receiveMainInfoThread extends ThreadServerSocketserver;Socketclient;public receiveMainInfoThread()server = getAvailableServerSocketFunction.getServerSocket(main_port);main_port = server.getLocalPort();3.3 系统聊天通讯界面图3.4 聊天通讯界面核心代码:public void actionPerformed(ActionEvent e)if (e.getActionCommand() = "表情")Point p = MouseInfo.getPointerInfo().getLocation();final expression ex = new expression(p.x, p.y);ex.addWindowListener(new WindowAdapter() public void windowActivated(WindowEvent e)/ 当窗口不活跃的时候,自动关闭该窗口public void windowDeactivated(WindowEvent e)ex.dispose(););ex.setVisible(true);else if (e.getActionCommand() = "粗体")if (countBold+) % 2 = 0)jt_recive.setUnBold();elsejt_recive.setBold();else if (e.getActionCommand() = "斜体")if (countItaic+) % 2 = 0)jt_recive.setUnItalic();elsejt_recive.setItalic();else if (e.getActionCommand() = "颜色")color = JColorChooser.showDialog(null, "选择颜色", Color.black);/ 显示调色板color1 = color.getRed();color2 = color.getGreen();color3 = color.getBlue();jt_recive.setColor(new Color(color1, color2, color3);jt_send.requestFocus();else if (e.getActionCommand() = "关闭")MainInterface.map_portLocal.remove(anotherQQ);MainInterface.map_chatWindows.remove(anotherQQ);dispose();else if (e.getActionCommand() = "发送")if (!jt_send.getText().equals("")text = jt_send.getText();jt_recive.insert_text2(myname + " " + time.gettime();transformToReceive(addSize(addColor(text);jt_send.setText("");jt_recive.selectAll();jt_recive.setCaretPosition(jt_recive.getSelectedText().length();jt_recive.requestFocus();jt_send.requestFocus();3.4 查找好友界面 图3.5 查找好友界面核心代码:void action()int mark = 1;if (tabNum = 0) / tabNum = 0查找联系人if (jr_1.isSelected() / 查找联系人 - 精确查找sign = 1; if (jt_user.getText().equals("") && jt_nickname.getText().equals("")JOptionPane.showMessageDialog(null, "请至少填一个查询条件", "警告", JOptionPane.WARNING_MESSAGE);mark = 0;if (!jt_user.getText().equals("")user = jt_user.getText();elseuser = null;if (!jt_nickname.getText().equals("")nickname = jt_nickname.getText();elsenickname = null;else if (jr_2.isSelected() / 查找联系人 - 条件查找sign = 2; country = item_countryjc_country.getSelectedIndex();if (country.equals("中国") province = item_provincejc_province.getSelectedIndex();if (province.equals("山东")if (!item_cityjc_city.getSelectedIndex().equals("-")city = item_cityjc_city.getSelectedIndex();elsecity = null;else if (province.equals("北京")if (!item_cityjc_city.getSelectedIndex().equals("-")city = item_city1jc_city.getSelectedIndex();elsecity = null;else if (province.equals("-")province = null;city = null;else if (country.equals("美国")if (!province.equals("-")province = item_province1jc_province.getSelectedIndex();else if (province.equals("-")province = null;city = null;city = null;3.5 个人设置界面图3.6 个人设置界面核心代码:public information(personalInfo pinfo, Container c_temp1, MainInterface mainFrame)this.pinfo = pinfo;c_temp_mainInterface = c_temp1;this.main_frame = mainFrame; Image image = Toolkit.getDefaultToolkit().getImage("pic/face/b.jpg");setIconImage(image);screenSize = Toolkit.getDefaultToolkit().getScreenSize();frameSize = this.getPreferredSize();/