毕业设计(论文)-基于Socket的网络聊天系统开发与设计.doc_第1页
毕业设计(论文)-基于Socket的网络聊天系统开发与设计.doc_第2页
毕业设计(论文)-基于Socket的网络聊天系统开发与设计.doc_第3页
毕业设计(论文)-基于Socket的网络聊天系统开发与设计.doc_第4页
毕业设计(论文)-基于Socket的网络聊天系统开发与设计.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

SHANDONG 毕业论文基于Socket的网络聊天系统开发与设计学 院: 理学院 专 业: 信息与计算科学学生姓名: 学 号: 指导教师: 2012年 05 月全套设计加153893706摘 要Socket提供了一套容易理解和操作的接口实现网络操作,对用户隐藏协议层的复杂细节。Socket接口已成为基于TCP/IP协议通信的最通用API。WinSocket增加了异步操作函数和满足消息驱动特性的网络事件异步选择机制。网络聊天已成为网络信息交流的重要方式。本课题使用Java语言利用Socket建立服务器与客户端,实现信息交流。基于Socket的网络聊天系统分为服务器程序和客户端程序。服务器主要实现监听客户端、接收客户端消息传递请求、与客户端建立连接以及操作数据库等。客户端设计主要包括用户的登录、注册、好友列表和聊天界面。客户端主要实现向服务器发送信息请求,通过服务器的中转来与其他客户端进行信息的传递。通过模块测试,组装测试,确认测试,确定了用户的可登录、可注册及用户间的正常信息交流。尽管该系统功能有限,但随着以后知识的增加,会逐步完善各项功能,扩展其应用领域。关键字:Socket,服务器 ,客户端,信息传递V全套设计加153893706 AbstractProvides a set of easy to understand interface for network operation and operation, protocol layers of complex details hidden from the user. Socket interface has become the most universal API based on TCP/IP protocol communication. WinSocket increased function and satisfy the message-driven nature of the asynchronous operation mechanism of asynchronous network event selection. Internet chatting has become an important network information exchange. This topic uses the Java language server and client using Socket, information exchange. Web chat system based on Socket into the server and client programs. Main listening client, the server receiving the client message delivery request, and the client has established a connection, and the operational database. Client design including login, user registration, your buddy list and chat interface. Client sends information to the server main request, transit through the server to pass information with other clients. Through the module test, Assembly test, validation testing, determine the users login, registration and the normal Exchange of information between users. Even though the system is a bit simple, but with the increase of their knowledge in the future, he will make him a more perfect, make it similar to the real QQ more, more and more on rich 目 录 摘要英文摘要一.绪论11.1 课题背景11.2 课题研究内容及意义11.3 系统相关技术介绍21.3.1 Java语言概述21.3.2 TCP/IP协议31.3.3 Socket编程51.3.4 Swing简介71.3.5 多线程技术介绍8二.系统需求分析102.1 需求分析122.2 可行性分析122.2.1 社会可行性132.2.2 用户可行性132.2.3 技术可行性132.2.4 经济可行性142.3 系统开发环境14三.系统总体设计143.1 客户端与服务器的通信143.2 客户端与客户端的通信153.3 系统的架构模式16四. 系统功能模块设计174.1 服务器端的设计174.1.1 服务器等待连接线程设计174.1.2 服务器处理客户端信息线程设计184.2 客户端设计204.2.1 登录模块设计204.2.2 用户注册模块设计214.2.3 用户聊天界面模块设计224.2.4 点对点通信模块设计22五. 系统测试23六.结束语24七.参考文献25八.致谢2628全套设计加153893706一绪论1.1 课题背景随着社会的发展,互联网已在人们的日常生活中开始普及。如网上购物、网上在线看电视剧和电影、网上订票等等,这些无不给人们的生活带来了很多的便利,更是对人们传统生活的一次彻底改变。人们生活水平的提高,社会的发展使得人与人之间的交流方式也应之改变,由过去的书信、留言、传讯兵奔跑千里传话等这种信息传递慢、不准确的交流方式变为现在的电话、邮件等较为快捷、准确的交流方式。尽管如此,但以上交流方式还是有很大不足,如邮件的无法即时通讯、电话异地高额费用等一定程度上限制了人们之间的交流。故即时聊天系统已成为现在人们最受欢迎和主要的交流方式。1.2 课题研究内容及意义现在网络聊天系统已经很多,如腾讯的QQ、多玩的YY语音、新浪的UC等等。这些聊天系统已广泛为人们接受和应用,成为了现在人们网上交流的最主要工具。但由于他们的应用人群广,信息传递过于庞杂,所以信息安全性能低,一些大型公司内部交流应用这些聊天系统可能会造成信息的泄漏。故本系统旨在提供公司内部交流。所有注册人员均是公司人员,易于管理。再加上该系统的服务对象仅是一公司的人员,所以不会造成信息传递的拥堵。该系统主要有服务器和客户端两部分组成,其中公司组建一小的服务器,而公司员工的电脑上安装客户端,这样就可以实现公司内部人员的简单信息交流。由于公司内部应该是局域网,这样本系统即使在没有网络的情况下还可以继续员工之间的信息交流。本课题是基于Socket的网络聊天系统,该系统主要分为服务器程序和客户端程序。本课题的目标是用户在客户端通过服务器端的中转来实现与其他客户端的信息交流。本课题主要意义是:熟悉系统开发平台,利用Socket编程技术、多线程开发技术、TCP/IP协议、java的Swing等进行聊天软件的实际开发。主要实现的功能:(1) 实现用户的注册、登陆等功能 (2) 实现点对点的通信 。1.3 系统相关技术介绍1.3.1 Java语言概述java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的java程序设计语言和java平台(即javaSE,javaEE,javaME)的总称。Java技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球与计算和移动互联网的产业环境下,java更具备了显著优势和广阔前景。(1)Java语言的起源Java最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,以“java”的名称正式发布。(2)Java语言的主要特性1,Java语言是简单 的Java语言和C语言的语法和C + +语言非常接近,大多数程序员很容易学习和使用Java。 另一方面,在Java丢弃了C + +很少使用这些特点是很难理解,扑朔迷离,如操作符重载,多重继承和自动演员。特别是,Java语言不使用指针,并提供自动垃圾收集,所以,程序员不必担心内存管理。 2,Java语言是一种面向对象的 Java语言提供的类,接口和继承的原语,为了简单起见,只支持单继承类之间,但将支持多重继承之间的接口,类和接口之间的支持机制(关键字实现)。 支持动态绑定的Java语言中,C + +语言只对虚函数使用动态绑定。总之,Java语言是一种纯粹的面向对象编程语言。 3,Java语言是分布式的。Java 语言支持互联网应用的发展,在基本的Java应用编程接口(Java的净额)的网络应用程序编程接口,它提供了网络应用程序编程类库,包括URL,URLConnection的,套接字,ServerSocket的。Java 的RMI(远程方法激活)机制是开发分布式应用程序的一个重要手段。 4,Java语言是强大的 Java的强大打字,异常处理,废料自动收集1 Java程序的鲁棒性的重要保证。 废弃指针的Java的明智选择。Java的安全检查机制的Java更鲁棒性。 5,Java语言是安全的。 往往是在网络环境中使用的Java,Java提供了一个安全机制,以防止恶意代码。除了Java语言具有许多安全功能,通过网络下载的Java类,有一个安全机制(类的ClassLoader),如分配不同的名称,以防止替代同名的类,作为本地字节码检查和安全管理机制(类SecurityManager的)允许Java应用程序设置安全哨兵。 6,Java语言是体系结构中立的Java平台的体系结构中立的字节码格式(后缀为class文件)编译Java程序(Java文件后缀),然后你可以运行任何Java平台的系统。这种做法是合适的异构网络环境和软件分发。 7,Java语言是便携式的。 这从架构中立的可移植性,Java的严格规则的基本数据类型的长度。Java系统本身也具有较强的可移植性,Java编译器是用Java实现的,Java运行环境中实现ANSI C。 8,Java语言的解释, 正如上文所说,在Java平台上的Java程序被编译成字节码格式,然后你可以运行任何Java平台的系统。 这些在运行时字节码,Java平台在Java解释器解释执行过程中在连接阶段的类加载到运行时环境。 9Java是高性能。 与那些谁解释的脚本语言相比,Java的的确是一个高性能。 事实上,Java的速度发展了JIT的Just-In-时间编译器技术,越来越接近了C + + 10,Java语言是多线程的 线程在Java语言中,是一个特殊的对象,它必须创建Thread类或类的儿子(星期日) 通常有两种方法来创建线程: 首先 ,使用线程(运行)的构造实现了Runnable接口的对象包装成一个线程,第二,从Thread类,子类创建的对象是线程的子类中重写run方法使用的结构类型。 值得注意的是, Thread类已经实现了Runnable接口,所以任何一个线程有它的run方法,而run方法中包含的线程来运行代码。由一组方法来控制线程执行Java语言支持多个线程在同一时间,并提供多线程之间的同步机制(关键字syn 11,Java语言是动态的 Java语言的设计目标是适应动态变化的环境。 的Java程序类是动态加载到运行环境通过网络加载所需的类,。它还有助于软件升级此外,Java类的运行时表示,运行时类型 检查。1.3.2 TCP/IP协议Transmission Control Protocol/Internet Protocol的简写,中译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的网络来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台电脑规定一个地址。(1) TCP/IP层次概述从协议分层模型方面来讲,TCP/IP由四个层次组成:网络接口层、网络层、传输层、应用层。网络接口层物理层是定义物理介质的各种特性: 1、机械特性。 2、电子特性。 3、功能特性。 4、规程特性。网络层负责相邻计算机之间的通信。其功能包括三方面。 一、处理来自传输层的分组发送请求,收到请求后,将分组装入IP数据报,填充报头,选择去往信宿机的路径,然后将数据报发往适当的网络接口。 二、处理输入数据报:首先检查其合法性,然后进行寻径-假如该数据报已到达信宿机,则去掉报头,将剩下部分交给适当的传输协议;假如该数据报尚未到达信宿,则转发该数据报。 三、处理路径、流控、拥塞等问题。 传输层提供应用程序间的通信。其功能包括:一、格式化信息流;二、提供可靠传输。为实现后者,传输层协议规定接收端必须发回确认,并且假如分组丢失,必须重新发送。 传输层协议主要是:传输控制协议TCP(Transmission Control Protocol)和用户数据报协议UDP(User Datagram protocol)。应用层向用户提供一组常用的应用程序,比如电子邮件、文件传输访问、远程登录等。远程登录TELNET使用TELNET协议提供在网络其它主机上注册的接口。TELNET会话提供了基于字符的虚拟终端。文件传输访问FTP使用FTP协议来提供网络内机器间的文件拷贝功能。 应用层一般是面向用户的服务。如FTP、TELNET、DNS、SMTP、POP3。 (2) TCP/IP运行机制 1. IPIP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层-TCP或UDP层;相反,IP层也把从TCP 或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是按顺序发送的或者没有被破坏。IP数据包 中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)。 高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的。也可以这样说,IP地址形成了许多服务的认证基础,这些服务相信数据包是从一个有效的主机发送来的。IP确认包含一个选项,叫作IP source routing,可以用来指定一条源地址和目的地址之间的直接路径。对于一些TCP和UDP的服务来说,使用了该选项的IP包好像是从路径上的最后一个系统传递过来的,而不是来自于它的真实地点。这个选项是为了测试而存在的,说明了它可以被用来欺骗系统来进行平常是被禁止的连接。那么,许多依靠IP源地址做确认的服务将产生问题并且会被非法入侵。2.TCPTCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于点对点的通讯。 TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。TCP还采用一种称为“滑动窗口”的方式进行流量控制,所谓窗口实际表示接收能力,用以限制发送方的发送速度。 如果IP数据包中有已经封好的TCP数据包,那么IP将把它们向上传送到TCP层。TCP将包排序并进行错误检查,同时实现虚电路间的连接。TCP数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 TCP将它的信息送到更高层的应用程序,例如Telnet的服务程序和客户程序。应用程序轮流将信息送回TCP层,TCP层便将它们向下传送到IP层,设备驱动程序和物理介质,最后到接收方。 面向连接的服务(例如Telnet、FTP、rlogin、X Windows和SMTP)需要高度的可靠性,所以它们使用了TCP。DNS在某些情况下使用TCP(发送和接收域名数据库),但使用UDP传送有关单个主机的信息。 3.UDPUDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。 UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出丢包现象,实际应用中要求在程序员编程验证。 UDP与TCP位于同一层,但它不管数据包的顺序、错误或重发。因此,UDP不被应用于那些使用虚电路的面向连接的服务,UDP主要用于那些面向查询-应答的服务,例如NFS。相对于FTP或Telnet,这些服务需要交换的信息量较小。使用UDP的服务包括NTP(网络时间协议)和DNS(DNS也使用TCP)。 欺骗UDP包比欺骗TCP包更容易,因为UDP没有建立初始化连接(也可以称为握手)(因为在两个系统间没有虚电路),也就是说,与UDP相关的服务面临着更大的危险。 4.ICMPICMP与IP位于同一层,它被用来传送IP的的控制信息。它主要是用来提供有关通向目的地址的路径信息。ICMP的Redirect信息通知主机通向其他系统的更准确的路径,而Unreachable信息则指出路径有问题。另外,如果路径不可用了,ICMP可以使TCP连接体面地终止。PING是最常用的基于ICMP的服务。计算机的通信协议精确地定义了计算机在彼此通信过程的所有细节。例如,每台计算机发送的信息格式和含义,在什么情况下应发送规定的特殊信息,以及接收方的计算机应做出哪些应答等等。 网际协议IP协议提供了能适应各种各样网络硬件的灵活性,对底层网络硬件几乎没有任何要求,任何一个网络只要可以从一个地点向另一个地点传送二进制数据,就可以使用IP协议加入 Internet 了。 如果希望能在 Internet 上进行交流和通信,则每台连上 Internet 的计算机都必须遵守IP协议。为此使用 Internet 的每台计算机都必须运行IP软件,以便时刻准备发送或接收信息。 IP协议对于网络通信有着重要的意义:网络中的计算机通过安装IP软件,使许许多多的局域网络构成了一个庞大而又严密的通信系统。从而使 Internet 看起来好象是真实存在的,但实际上它是一种幷不存在的虚拟网络,只不过是利用IP协议把全世界上所有愿意接入 Internet 的计算机局域网络连接起来,使得它们彼此之间都能够通信。 1.3.3 Socket编程所谓socket通常也称作套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。以J2SDK-1.3为例,Socket和ServerSocket类库位于java .net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。Socket连接过程:根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。 服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。1.3.4 Swing简介Swing是一个用于开发Java应用程序用户界面的开发工具包。它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。 工具包中所有的包都是以swing作为名称,例如javax.swing,javax.swing.event.创建图形界面步骤:(1)导入Swing包 (2)选择界面风格 (3)设置顶层容器 (4)设置按钮和标签 (5)将组件放到容器上 (6)为组件增加边框 (7)处理事件 (8)辅助技术支持1.3.5 多线程技术介绍多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,只需要设想各个线程是同时执行即可。多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来的线程调度,同步等问题。(1)在Java中实现多线程。为了创建一个新的线程,首先必须指明这个线程所要执行的代码,而这就是在Java中实现多线程所需要做的一切!可以利用java通过其中的类!作为一个完全面向对象的语言,Java提供了类java.lang.Thread来方便多线程编程,这个类提供了大量的方法来方便控制自己的各个线程。可以通过 Thread 类来提供给java所需要的执行代码。Thread 类最重要的方法是run(),它为Thread类的方法start()所调用,提供的线程所要执行的代码。为了指定代码,只需要覆盖它!方法一:继承 Thread 类,覆盖方法 run(),在创建的 Thread 类的子类中重写 run() ,加入线程所要执行的代码即可。下面是一个例子:public class MyThread extends Thread int count= 1, number; public MyThread(int num) number = num; System.out.println (创建线程 + number); public void run() while(true) System.out.println(线程 + number + :计数 + count); if(+count= 6) return; public static void main(String args) for(int i = 0; i 5; i+) new MyThread(i+1).start(); 这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类。这时可以利用另一种新的方法:不创建Thread类的子类,而是直接使用它,那么只能将方法作为参数传递给 Thread 类的实例,有点类似回调函数。但是 Java 没有指针,只能传递一个包含这个方法的类的实例。 使用接口限制这个类必须包含这一方法(虽然抽象类也可满足,但是需要继承,而之所以要采用这种新方法,就是为了避免继承带来的限制。) Java 提供了接口 java.lang.Runnable 来支持这种方法。 方法二:实现 Runnable 接口 Runnable接口只有一个方法run(),我们声明自己的类实现Runnable接口并提供这一方法,将我线程代码写入其中,就完成了这一部分的任务。但是Runnable接口并没有任何对线程的支持,还必须创建Thread类的实例,这一点通过Thread类的构造函数public Thread(Runnable target);来实现。下面是一个例子: public class MyThread implements Runnable int count= 1, number; public MyThread(int num) number = num; System.out.println(创建线程 + number); public void run() while(true) System.out.println (线程 + number + :计数 + count); if(+count= 6) return; public static void main(String args) for(int i = 0; i 5;i+) new Thread(new MyThread(i+1).start(); 严格地说,创建Thread子类的实例也是可行的,但是必须注意的是,该子类必须没有覆盖 Thread 类的 run 方法,否则该线程执行的将是子类的 run 方法,而不是用以实现Runnable 接口的类的 run 方法。 使用 Runnable 接口来实现多线程能够在一个类中包容所有的代码,有利于封装,它的缺点在于,只能使用一套代码,若想创建多个线程并使各个线程执行不同的代码,则仍必须额外创建类(2)线程的四种状态1. 新状态:线程已被创建但尚未执行(start() 尚未被调用)。 2. 可执行状态:线程可以执行,虽然不一定正在执行。CPU 时间随时可能被分配给该线程,从而使得它执行。 3. 死亡状态:正常情况下 run() 返回使得线程死亡。调用 stop()或 destroy() 亦有同样效果,但是不被推荐,前者会产生异常,后者是强制终止,不会释放锁。 4. 阻塞状态:线程不会被分配 CPU 时间,无法执行。(3)线程的优先级线程的优先级代表该线程的重要程度,当有多个线程同时处于可执行状态并等待获得 CPU 时间时,线程调度系统根据各个线程的优先级来决定给谁分配 CPU 时间,优先级高的线程有更大的机会获得 CPU 时间,优先级低的线程也不是没有机会,只是机会要小一些罢了。 你可以调用 Thread 类的方法 getPriority() 和 setPriority()来存取线程的优先级,线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。(4)线程的同步由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题。Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问。 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。系统需求分析二.系统需求分析2.1 需求分析为了使自己开发出的网络聊天系统符合要求,首先必须知道用户的需求。对需求的详细理解是开发工作获得成功的前提条件,它对目标项目提供了完整、准确、清晰、具体的要求,更是我们在进行项目时方向更加的明确。下面对本网络聊天系统进行需求分析。首先,服务器需要满足同时连接很多个用户,并都能准确迅速的提供给这些连接用户所需要的任务处理请求,所以这就要求服务器能同时处理多个Socket连接。因此我们将采用java的多线程方式的并发服务器来创建服务器端,这样就可以从很大程度上提高服务器的运行效率。其次,因为客户端只需要将消息请求发送到服务器通过服务器的中转便可以进行任务的处理工作,因此客户端的主要性能要求为图形界面运行的稳定性以及方便用户的可视化,使用户更加容易操作。对此在该系统中客户端包括了用户登录、用户注册、好友列表及聊天界面。为了更加的方便用户的使用,该系统模仿腾讯QQ,用户登录、注册、好友列表等与腾讯QQ类似。客户端实现了发送信息请求给服务器、用户的登录、用户的注册、及客户端通过服务器的中转与其他客户端的消息传递。2.2 可行性分析可行性分析(Feasibility Analysis)也称为可行性研究,是在系统调查的基础上,针对新系统的开发是否具备必要性和可能性,对新系统的开发从技术、经济、社会的方面进行分析和研究,以避免投资失误,保证新系统的开发成功。可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决。2.2.1 社会可行性随着计算机的发展与普及,以及互联网技术的扩展,很多的公司和企业都提供了局域网信息服务。而网络聊天系统只要公司的电脑连入局域网就能够访问,无须任何的其他昂贵设备,大大的节省了公司的资金。2.2.2 用户可行性本系统服务的对象是各公司的工作人员,使用人员主要是掌握计算机基本操作。加之,当前类似的系统操作简单,使用者能够很快上手。因此,在系统的使用方面不会存在问题。2.2.3 技术可行性本次项目所使用的开发语言是Java,Java 语言以其跨平台的特性一致都被业界认为是编程的最佳选择,经过多年的发展Java虚拟机已经升值1.7版本,在性能上有了很大提高,在API函数方面有了很多扩充和冗余的精简。同时,基于Java语言的设计模式的发展为软件的设计提供了大量的可供选择的解决方案,保证了系统软件的实现效率和运行过程中的逻辑健壮性。图2.1 C/S架构示意图本次项目系统架构是C/S架构。如图2.1,因为C/S以它的灵活性,通用性,易操作性等特点在用户呈现方面一致是比较好的选择。目前,由于这种架构在系统构架方面的广泛采用,已经在系统构架上积累了大量的经验。所以本系统在技术上是可行的。2.2.4 经济可行性从经济可行性的角度出发,系统在开发的过程中,主要应该考虑如何节约开发成本,缩短开发周期,以最小的投入获得最大的回报。为了保证软件产品的质量,系统的开发周期应该控制在1个月左右,并且要保证充足的调研时间和测试周期。整个网络聊天系统在开发过程中仅仅需要1到2名具有一定开发经验的程序员。所用的软件主要是Eclipse,该软件目前是开源和免费的。在硬件方面只需要一台交换机和专门用于编程和数据库服务的1到2台电脑,这些在目前市场上价格是可以接受的。因此在经济方面是可行的。2.3 系统开发环境软件环境方面,本系统编写采用的语言主要是Java,图形界面技术上采用的是Swing,并通过Socket和多线程技术来实现。系统开发是采用的Eclipse集成开发环境。在硬件环境方面,本系统的实现需要一台数据库服务器和一台服务器以及若干的终端电脑。以保证在系统完成之后有一个模拟环境,进行必要的测试。系统总体设计三.系统总体设计3.1 客户端与服务器的通信客户端和服务器是基于TCP/IP协议建立连接,并完成数据传输的,其流程图如下图所示。 服务器创建过程 客户端创建过程创建ServerSocket套接字和本机IP地址绑定创建Socket套连接字监听指定端口并阻塞向指定IP地址的服务器和端口发送请求响应客户请求和服务器端建立连接,并互传信息与客户端建立连接并传递信息关闭Socket连接关闭Socket连接关闭ServerSocket 图3.1 客户端和服务器创建流程图在Java的基于TCP/IP协议的Socket编程中,服务端使用ServerSocket类开创建,而客户端使用的Socket类。3.2 客户端与客户端的通信客户端与客户端的通信是通过服务器转发来实现的,其示意图如下图所示。图3.2 通信示意图从上图中可以看出,客户端同客户端之间并没有直接的联系,而是以服务器作为中转站通过服务器的转发的形式来完成数据传输的。3.3 系统的架构模式本聊天系统采用的是目前最流行的服务器/客户端架构来设置的,并采用了三层架构。这三层分别是指数据库服务器、应用程序服务器以及应用程序客户端。这样可以合理的将各个任务要求分配至客户端和服务器端,从而使系统通信更加的方便快捷而且更有效率。图3.3 架构示意图3.4 系统的功能模块设计根据前需求分析和系统总体分析,最终设计系统的功能模块图如下图所示。查找用户信息建立连接添加用户信息操作数据库服务器端更新用户信息监听客户端网络聊天软件删除用户信息发送注册请求注册用户用户登录获得注册号码发送登录请求打开主界面查看好友发送聊天信息通知其他好友通知服务器退出聊天软件进入聊天室客户端 图3.4 系统的功能模块图系统功能模块设计四. 系统功能模块设计4.1 服务器端的设计建立一个服务器,其主要功能是监听客户端、接收客户端消息传递请求、与客户端建立连接以及操作数据库等。Java语言有一特点是多线程机制。考虑到会有多个用户同时访问服务器,为了让服务器运行顺畅,本聊天系统服务器端程序采用的就是Java语言的多线程机制来完成,这样服务器就可以并发访问了。4.1.1 服务器等待连接线程设计具体的实现为在服务器成功创建后,会启动一个循环等待连接线程,该线程专门用来负责接收客户端请求,其实现代码如下:public class MyServerFrame extends JFrame implements ActionListenerJPanel jp1;JButton jb1,jb2;public static void main(String args) / TODO Auto-generated method stubMyServerFrame mysf=new MyServerFrame(); public MyServerFrame()jp1=new JPanel();jb1=new JButton(启动服务器);jb1.addActionListener(this);jb2=new JButton(关闭服务器);jp1.add(jb1);jp1.add(jb2);this.add(jp1);this.setSize(500, 400);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);Overridepublic void actionPerformed(ActionEvent arg0) / TODO Auto-generated method stubif (arg0.getSource()=jb1)new MyQqServer();4.1.2 服务器处理客户端信息线程设计当服务器等待连接线程接收到一个新的套接字连接(Socket)后,就会启动一个新的线程来负责本服务器和该客户端之间的连接,同时该在线程中的run方法中处理客户端的请求。等待连接线程将继续等待下一个客户端连接请求。前一个请求在完成所有的交互操作后自动退出,同时连接也将关闭,其实现代码如下。public class SerConClientThread extends Thread Socket s; public SerConClientThread(Socket s) /把服务器和该客户端的连接赋给s this.s=s; /让该线程去通知其他用户 public void notifyOther(String iam) /得到所有在线人的线程 HashMap hm=ManageClientThread.hm; Iterator it=hm.keySet().iterator(); while (it.hasNext() Message m=new Message(); m.setCon(iam); m.setMesType(MessageType.message_ret_onLineFriend); /取出在线人的ID String onLIneUserId=it.next().toString(); try ObjectOutputStream oos=new ObjectOutputStream(ManageClientThread.getClientThread(onLIneUserId).s.getOutputStream(); m.setGetter(onLIneUserId); oos.writeObject(m); catch(Exception e) e.printStackTrace(); public void run()while(true)/这里该线程就可以接收客户端的信息.try ObjectInputStream ois=new ObjectInputStream(s.getInputStream();Message m=(Message)ois.readObject();/System.out.println(m.getSender()+ 给 +m.getGetter()+ 说:+m.getCon();/对从客户端取得的消息进行类型判断,然后做相应的处理if(m.getMesType().equals(MessageType.message_comm_mes)/一会完成转发./取得接收人的通信线程SerConClientThread sc=ManageClientThread.getClientThread(m.getGetter();ObjectOutputStream oos=new ObjectOutputStream(sc.s.getOutputStream();oos.writeObject(m);else if(m.getMesType().equals(MessageType.message_get_onLineFriend)System.out.println(m.getSender()+ 要他的好友);/把在服务器的好友给该客户端返回.String res=ManageClientThread.getAllOnLineUserid();Message m2=new Message();m2.setMesType(MessageType.message_ret_onLineFriend);m2.setCon(res);m2.setGetter(m.getSender();ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream();oos.writeObject(m2); catch (Exception e) e.printStackTrace();/ TODO: handle exception4.2 客户端设计4.2.1 客户端登录模块设计客户端登录模块用来判断用户是否为合法用户,如果是则可以登录到客户端主界面,否则将无法进入。系统登录窗口的运行效果如图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论