基于JAVA的UAW聊天室系统——Server端的设计与实现-毕业论文_第1页
基于JAVA的UAW聊天室系统——Server端的设计与实现-毕业论文_第2页
基于JAVA的UAW聊天室系统——Server端的设计与实现-毕业论文_第3页
基于JAVA的UAW聊天室系统——Server端的设计与实现-毕业论文_第4页
基于JAVA的UAW聊天室系统——Server端的设计与实现-毕业论文_第5页
免费预览已结束,剩余33页可下载查看

下载本文档

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

文档简介

本科毕业论文本科毕业论文 (科研训练、毕业设计) 题题 目:基于目:基于 JAVAJAVA 的的 UAWUAW 聊天室系统聊天室系统 ServerServer 端的设计与实现端的设计与实现 姓 名: 学 院:软件学院 系: 专 业:软件工程 年 级: 学 号: 指导教师(校内): 职称: 指导教师(校外): 职称: 年 月 日 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 基于 JAVA 的 UAW 聊天室系统 Server 端的设计与实现 摘要 随着 Internet 的发展,在 Email、WWW 等应用日益成熟的同时,广大网络用户对在 线实时通讯系统的需求不断扩大。用 JAVA 开发的聊天室系统弥补了纯文本非实时通讯的不 足,既增加了形象性,又加强了交互性。 UAW (Up Against the Wind),基于 JAVA 实现,是一个 C/S 模式的聊天室系统,包括服 务端和若干客户端,客户端之间通过向服务端发送消息,进而由服务器端进行信息的分类并 发送到客户端,从而实现聊天。本文主要解决 UAW 服务器模块的设计与实现,从它的扩展性 入手,设计出聊天室系统的程序框架。在通讯技术中,选用 Socket 通讯机制实现客户端与 服务器端的信息交换,并采用多线程机制,每个线程对应一个客户端,从而简化了网络中的 技术细节,方便可行。此外,在服务端,聊天室服务器实现的功能有:登录、公聊、私聊、 屏蔽用户、得到在线列表、统计在线人数、更换房间、退出等。 关键词 聊天室 JAVA Socket 多线程 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 ABSTRACT With the development of Internet, while Email. WWW, etc. used maturely day by day, more and more network users are expanding the demand for the on-line real-time communication system. The chat room system based on JAVA, supplies a gap to the communication system with the properties of pure-text and non-real-time, not only increasing the image feel but also strengthening the interaction. UAW (Up Against the Wind), based on Java, is a chat room system of C/S mode, including a server end and several client ends. Between the client ends, they deliver messages through the server, which carry on classification of information and then send relevant messages to correct receivers. It is a simple process of services provided by chat room. This study mainly solves the problem to the design and implementation of server module of UAW, and proceeding with its expansion, designs the procedure frame of the chat room system. Among communication technologies, select Socket communication mechanism to implement information exchange between server end and client end and adopt multi-thread mechanism, each thread corresponding to each customer end, which simplify technological details inside the network. In addition, as server, the functions that the chat room system should possess is necessary, such as log-in , private chatting , common chatting, shielding user , tabulating online users , counting online users , changing room , withdraw ,etc. Key Words Char Room JAVA Socket Multi-Thread 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 目录 第一章 绪论6 1.1 项目说明 .6 1.1.1 聊天室发展概况6 1.1.2 选用 Java 语言的原因.6 1.2 项目计划 .6 1.2.1 项目名称 .7 1.2.2 项目目标 .7 1.2.3 项目范围 .7 1.2.4 开发方法 .7 1.2.5 开发周期 .7 1.2.6 所需技术 .8 1.2.7 开发工具 .8 第二章 UAW 服务器端概要设计 9 2.1 功能描述 .9 2.2 程序设计步骤 .9 2.3 图示解答(针对程序设计步骤) 10 2.4 程序实现步骤 13 2.5 程序验证 13 第三章 UAW 服务器端详细设计(关键技术从原理到实现) .13 3.1 SOCKET 应用 14 3.1.1 Socket 原理 .14 3.1.2 Java Socket .15 3.1.3 UAW Server Socket 实现过程及部分源代码分析.16 Server Socket 实现流程 16 所需的类和方法 16 3.2 THREAD应用.17 3.2.1 Thread 原理17 3.2.3 UAW Thread 实现过程及部分源代码分析19 3.3 信息标签 21 3.3.1 定义 21 3.3.2 功能及程序设计思路 21 HELO 初始化向服务器端的连接 21 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 QUIT 退出聊天室 22 KICK 踢出违规用户 23 CHRO 更换房间 23 MESS 发送公共信息 24 PRIV 悄悄话 24 ROCO 统计在线用户数 25 3.4 JAVA 中文显示 26 3.4.1 Java 中文问题的来源26 3.4.2 UAW 中文显示实现过程及部分源代码分析 27 3.5 JAVA.UTIL.PROPERTIES公共类 .28 3.5.1 优点 28 3.5.2 UAW 属性文件的操作过程及部分源代码分析 28 第四章 系统测试.30 4.1 登陆界面 30 4.1.1 测试用例 30 4.1.2 界面显示 30 4.2 聊天室主界面 31 4.2.1 测试用例 31 4.2.2 界面显示 31 4.3 公聊界面 31 4.3.1 测试用例 32 4.3.2 界面显示 32 4.4 私聊界面 32 4.4.1 测试用例 33 4.4.2 界面显示 33 4.5 服务器端界面 34 4.5.1 测试用例 34 4.5.2 界面显示 34 第五章 结束语.35 致谢语36 参考文献37 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 第一章 绪论 1.1 项目说明 1.1.1 聊天室发展概况 网络化是计算机应用和现代生活发展的新方向,它使计算机的功能得以充分发挥和应用。 截至 2004 年底,我国互联网用户数已突破 9000 万人次,并且发展速度越来越快。网络时代 的到来,无疑对人们的传统生活带来了重大的变革和深远的影响,也给我们的生活引入了全 新的概念。网络以其高速性、自由性、时尚性、虚拟性、广泛性吸引了各个年龄层的关注, 加之网络互动也是人际交往的一种,也是人们彼此交流各种思想、观点、态度、意见,彼此 沟通感情的过程。基于网络特有的性质和人们自身的需要,各种聊天工具应运而生,聊天室 便是其中的产物之一。聊天室是社群齐聚的场所,其轻松的环境、活跃的气氛有助于疏缓人 际压力、排解精神抑郁,具有不可忽视的社会功能;同时,聊天室也是蕴藏商机的地方,吸 引网友长时间驻留能增加网站的使用率、有效增加网络广告收入等优点显而易见,而且是否 能有效利用所聚集的聊天人潮,引导其使用网站的各项服务,也将成为网站未来经营发展的 晴雨表。 1.1.2 选用 Java 语言的原因 现在大部分网站提供的聊天室服务都是借助 Web 服务器,利用 JSP、ASP 动态网页技 术来实现,这种方法的优点是技术难度低,容易实现,缺点是支持在线人数很有限,一旦上 线的人多了,速度就会变慢,并且严重占用内存,最后还可能导致服务器死机,严重影响提 供的聊天服务的质量。在相同的服务器硬件配置下,为了解决能支持更多的人同时在线,可 以单独设计一个聊天室服务器,把它从 Web 服务器中分离出来,从而大大地提高服务对象 的人数。结合聊天室服务器及 Java 语言的简单易用性、平台独立性、强大的网络功能、多 线程机制等特点,利用 Java 开发聊天室可以适应更多的操作系统平台,因此,我们认为 Java 是最好的选择。 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 1.2 项目计划 1.2.1 项目名称 聊天室名称:UAW(取意 Up Against the Wind) 1.2.2 项目目标 允许新用户经过系统检测登陆聊天室 得到在线列表 允许用户进行在线公聊 允许用户进行在线私聊 允许用户屏蔽指定用户 用户可发送图片信息 允许用户更换房间 管理员可增加、删除、修改房间信息 管理员可更改服务器端口号 管理员可查看在线用户数 友好、舒适、操作简便的聊天界面 1.2.3 项目范围 本聊天室适用于一般大众,满足实时通讯的要求。 1.2.4 开发方法 使用套接字和多线程机制进行客户端与服务器端的通讯 通过增量开发的方法进行此项目的设计与开发 1.2.5 开发周期 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 时间任务 第 12 周需求分析及初步设计阶段(决定每个功能所需的类及数据类型) 第 35 周根据相应功能设计出各类所用到的方法及数据类型 第 68 周具体实现各个类中的各个方法 第 912 周对各个界面和服务器进行调整及测试完善工作 第 1314 周整理撰写毕业论文并准备答辩 表 1-1 开发周期 1.2.6 所需技术 服务器端与客户端的连接:熟悉网络编程中的协议、数据流及多线程编程 程序界面设计:JAVA AWT 代码实现:JAVA 面向对象程序设计语言 1.2.7 开发工具 开发工具:Sun Java (JDK 1.5.0) + Jcreator Pro 开发环境:Windows XP (Professional) + PC 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 第二章 UAW 服务器端概要设计 2.1 功能描述 允许后台管理员开启服务器 接受用户登陆信息并检验是否重名 允许不重名的新用户登陆聊天室界面 向同房间的已登陆用户发送新用户登陆信息 得到在线列表 允许用户发送公共信息并且同房间的用户可见 允许用户向指定对象发送私聊信息 允许用户在公聊和私聊过程中屏蔽指定对象 允许用户更换房间,向原房间其他用户发送离开信息并向新房间其他用户发送登入信息 统计同房间在线用户数 允许后台管理员增加、删除、修改房间信息 允许后台管理员修改服务器端口号 允许后台管理员关闭服务器 2.2 程序设计步骤 选择创建网络服务器应用程序所需引用的主要的类和方法 确定主要的自定义类,及其说明和方法 确定主要的自定义类中的数据类型和变量 确定服务器的 IP 地址和端口号 确定要处理的例外 确定例外的出错信息 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 2.3 图示解答(针对程序设计步骤) 选择创建网络服务器应用程序所需引用的主要的类和方法 目标结果 类方法 Serversocketaccept() SocketgetInputStream() getOutputstream() Threadstart() run() DataOutputStreamwriteBytes() DataInputStreamreadLine() ArrayListsize() get() add() remove() trimToSize() clear() 选择 创建 网络 服务 应用 程序 所需 引用 的主 要的 类和 方法 部分 AWT 组件 表 2-1 主要的类和方法 确定主要的自定义类,及其说明和方法 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 目标结果 类 说 明 方法 ChatServer 主 程 序 类 run() ChangeRoom() RemoverUser() AddUser() GetRemoteUserAddress() SendRemoteUserAddress() GetUserCount() SendGeneralMessage() SendPrivateMessage() SendMessageToClient() GetClientObject() GetDBProperties() GetIndexOf() IsUserExists() EixtServer() ChatCommunication 聊 天 协 议 类 Run() ChatCommunication() QuitConnection() ClientObject 用 户 对 象 类 getRoomName() getSocketName() getUserName() setRoomName() setSocketName() setUserName() 确定 主要 的自 定义 类及 其目 的和 方法 CommonSettings 公 共 接 口 THREAD_SLEEP_TIME KICK_USER REMOVE_USER MAX_MESSAGE ROOM_NAME 表 2-2 主要的自定义类 确定主要的自定义类中的数据类型和变量 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 目标结果 类数据类型变量 ChatServerServerSocket Socket Thread ArrayList ArrayList Properties String int DataOutputStream ChatCommunication ClientObject serversocket socket thread userarraylist messgearraylist DBProperties RoomList G_ILoop dataoutputstream chatcommunication clientobject ChatCommunicationSocket Thread DataInputStream String ChatServer socket thread inputstream RFC Parent ClientObjectSocket String String ClientSocket ClinetUserName ClientRoomName 确定主 要的自 定义类 中的数 据类型 和变量 CommonSettingsint int int int String THREAD_SLEEP_TIME KICK_USER REMOVE_USER MAX_MESSAGE ROOM_NAME 表 2-3 数据类型和变量 确定服务器的 IP 地址和端口号 目标结果 确定服务器的 IP 地址和端口号 IP 地址:LocalHost 端 口:1436 表 2-4 IP 和端口 确定要处理的例外 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 目标结果 例外发生场合 IOException 读取外部 properties 文件中的参数值 调用 close()方法 调用 getOutputStream()方法 调用 getInputStream()方法 调用 readLine()方法 调用 dataoutputstream.writeBytes()方法 创建 Thread 对象 UnsupportedEncoding Exception 转换编码格式 确定 要处 理的 例外 InterruptedException 调用 thread.sleep()方法 表 2-5 需要处理的例外 确定例外的出错信息 目标结果 例外出错信息 IOException“ChatServer run() IOException“ “perties 文件读取错误!“ UnsupportedEncoding Exception _UEExc.printStackTrace(); 确定 例外 出错 信息 InterruptedException“ChatServer run() InterruptedException“ 表 2-6 出错信息 2.4 程序实现步骤 编写服务器程序 保存程序 编译程序 运行程序 2.5 程序验证 在客户端程序创建好后,进行统一测试。 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 第三章 UAW 服务器端详细设计(关键技术从原理到实现) 3.1 Socket 应用 3.1.1 Socket 原理 计算机之间用一种非常简单的方式来进行操作和通信。通过设置一组包协议,称作“栈” ,来完成工作。这将使人们能够处理应用程序级的工作而不需要担心底层网络技术的细节。 TCP/IP 是最常见的协议栈。OSIRM(Open Systems Interconnect Reference Model)把计 算机网络定义为七个逻辑层从产生电子信号到给应用程序提供数据。 所谓 socket 通常被称作“套接字“,用于描述 IP 地址和端口。Socket 大致位于 OSI 模 型的会话层,会话层夹在面向应用的高层和实时数据通信低层之间,如图 3-1 所示。会话层 在两台计算机之间为管理和控制数据流提供服务。作为这一层的一部分,socket 允许让应 用程序发出发送 bytes 的请问并隐藏了完成该工作的具体细节。 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 Sockets TCP IP 图 3-1 Socket 在 OSI 七层模型中的位置 应用程序通过“套接字”向网络发出请求或者应答网络请求,利用它可以较为方便的编 写网络上数据的传递。Socket 有两种主要的操作方式面向连接的和无连接的。面向连 接的操作使用 TCP 协议。一个这个模式下的 socket 必须在发送数据之前与目的地的 socket 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 取得一个连接。一旦连接建立了,socket 就可以使用一个流接口:打开-读-写-关闭。所有 发送的信息都会在另一端以同样的顺序被接收。面向无连接的操作使用的是 UDP 协议,即数 据报协议。一个数据报是一个独立的单元,它包含了所有这次投递的信息,包括目的地址和 要发送的内容。无连接的操作是快速和高效的,但它降低了数据的安全性,因为这个模式下 的 socket 只是简单地投出数据报,不需要连接一个目的地的 socket。由此可见,面向连接 的操作比无连接的操作效率低,但是数据的安全性更高。 3.1.2 Java Socket Socket 的底层机制相当复杂。幸运的是,Java 平台提供了虽然简单但是相当强大的高 层抽象使开发人员更简单有效的创建和使用 socket 而无需了解操作系统的底层机制。Java 的这种力量来源于其拥有的一套强大的用于网络的 API,这些 API 是一系列的类和接口。 Network API 依靠 socket 进行通讯,简单的过程如图 3-2 所示,在两个程序进行网络通讯 的连接中,一个程序将一段信息写入 socket 中,该 socket 将这段信息发送到另外一个 socket 中,使这段信息能传送到其他程序中。 不 不 A不 不 B 不 不 A不 不 B socketsocket 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 TCP/IP不 不 不 不 不 图 3-2 Java Socket 的通讯过程 套接字又可细分为流套接字和自寻址数据套接字,由于后者不涉及本系统的设计与实现, 在此将不作介绍。无论何时,在两个网络应用程序之间发送和接收信息时都需要建立一个可 靠的连接,流套接字依靠 TCP 协议来保证信息正确到达目的地。流套接字在 C/S 模式中扮演 一个必需的角色,客户端程序(需要访问某些服务的网络应用程序)创建一个扮演服务器端 程序的主机的 IP 地址和服务端程序(为客户端应用程序提供服务的网络应用程序)端口号 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 的流套接字对象。客户端流套接字的初始化代码将 IP 地址和端口号传递给客户端主机的网 络管理软件,最终传递给服务器端主机,接下来是读取数据,查看服务器程序是否处于监听 状态,当然这种监听依然是通过套接字和端口来进行的;如果服务器程序处于监听状态,那 么服务器端会发出一个积极的响应信号,客户端流套接字初始化代码就给客户程序建立一个 端口号,并将这个端口号传递给服务器程序的套接字,同时完成流套接字的初始化;如果服 务器程序没有处于监听状态,那么服务器端会传递一个消极信号,客户程序的流套接字初始 化代码将抛出一个异常对象并且不建立通讯连接,也不创建流套接字对象。这部分的工作包 括了相关联的三个类:InetAddress, Socket 和 ServerSocket。 InetAddress 对象描绘了 32 位或 128 位 IP 地址,Socket 对象代表了客户程序流套接字,ServerSocket 代表了服务 程序流套接字,所有这三个类均位于包 中。 3.1.3 UAW Server Socket 实现过程及部分源代码分析 ServerServer SocketSocket 实现流程实现流程 服务器: 使用 ServerSocket 监听指定的端口,端口指定为 1436(由于 1024 以下的端口通常属 于保留端口,在一些操作系统中不可以随意使用,所以一般使用大于 1024 的端口),等待 客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。服务器端接口程序基本 处理流程如 图 3-3 所示: 不 不 server socket 不 不 不 不 不 不 不 accept()不 不 不 不 不 不 不 不 不 不 不 不 不不 不 不 不不 不 不 不 不 socket 不 不 server socket 不 不 不 不 不 不 图 3-3 服务器端处理流程 所需的类和方法所需的类和方法 根据以上的设计,需要使用的类和方法是: InetAddress 类: 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 调用 getHostAddress()获得 IP 地址 SendMessageToClient(clientobject.getSocket(),“REQU“ + GetClientObject(FromUserName).getSocket().getInetAddress().getHostAddress() + “ + FromUserName); Socket 类: 在 Java 中,Socket 可以理解为客户端或服务器端的一个特殊的对象,它可以通过调用 Socket 的 getInputStream()方法从服务程序获得输入流,客户端的 Socket 对象上的 getInputStream 方法得到的输入流其实就是从服务器端发回的数据流; new DataInputStream(new BufferedInputStream(socket.getInputStream(); 也可以通过调用 Socket 的 getOutputStream()方法获得输出流,客户端 Socket 对象上 的 getOutputStream 方法返回的输出流就是将要发送到服务器端的数据流;其中 getInputStream 和 getOutputStream 方法均会产生一个 IOException,它必须被捕获,因为 它们返回的流对象,通常都会被另一个流对象使用。 dataoutputstream newDataOutputStream(clientsocket.getOutputStream(); 在读写活动完成之后,客户程序调用 close() 方法关闭流和流套接字。 socket.close(); ServerSocket 类: 专门用来建立 socket 服务器,服务器并不是主动地建立连接。而是被动地监听一个客 户端的连接请求然后提供服务。 可以用服务器需要使用的端口号作为参数来创建服务器对象; serversocket = new ServerSocket(m_portNo); 调用 accept()方法用于产生“阻塞“,它使程序运行暂时“停留“在这个地方,直到一个 会话产生,并且返回一个客户端的 Socket 对象实例然后程序继续。 当一个客户端程序建立一个 socket 连接,所连接的端口号为 1436 时,服务器对象 serversocket 便响应这个连接,并且 serversocket.accept()方法会创建一个 socket 对象。 服务器端便可以利用这个 socket 对象与客户进行通讯。而服务器 socket 依旧打开,监听并 排列新的连接请求。 socket = serversocket.accept(); 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 3.2 Thread 应用 3.2.1 Thread 原理 多线程是与单线程比较而言的,其工作原理是:主程序有一个消息循环,不断从消息队 列中读入消息来决定下一步所要完成的任务,一般是针对一个函数,只有等这个函数执行完 之后,主程序才能接收另外的消息来执行。 往往,CUP 在运行过程中有很多时间处于等待状态,如读取网络数据和等待用户输入等, 多线程正是利用这个特点将任务分成多个并发任务,使一个程序或进程能够包含多个线程, 这些线程可以根据程序的代码执行相应的指令。和进程不同的是,线程共享地址空间。也就 是说,多个线程能够读写相同的变量或数据结构。在多线程程序中,线程可以从准备就绪队 列中得到,并在可获得的系统 CPU 上运行。操作系统可以将线程从处理器移到准备就绪队 列或阻塞队列中,这种情况可以认为是处理器“挂起”了该线程。 两种基本的线程操作模型是:协作式线程模型和抢占式线程模型中,前者允许线程自行 决定什么时候放弃处理器来等待其他的线程。程序员可以精确地决定某个线程何时会被其他 线程挂起,允许它们与对方有效地合作。其缺点在于某些恶意或是写得不好的线程会消耗所 有可获得的 CPU 时间,导致其他线程“饥饿”。后者允许操作系统可以在任何时候打断当 前线程。通常会在其运行了一段时间(就是所谓的一个时间片)后才打断它。这样的结果自 然是没有线程能够不公平地长时间占用处理器。然而,随时可能打断线程就会给程序员带来 其他可知或未知的麻烦。抢占式线程模型要求线程正确共享资源,协作式模型却要求线程共 享执行时间。 3.2.2 Java Thread 使用 Java 语言创建线程,有两种方式分别为:扩展 java.lang.Thread 类,用它覆盖 Thread 类的 run 方法;生成实现 java.lang.Runnable 接口的类并将其它的实例与 java.lang.Thread 实例相关联。随后实例化线程类并启动线程,可以生成一个 Thread 类 (或其子类)的对象,并给这个对象发送 start() 消息,事实上程序可以向任何一个派生 自 Runnable 接口的类对象发送 start() 消息。线程类的执行主体包含在该线程对象的 run() 方法中,run 方法就相当于传统程序中的 main() 方法。线程的生命周期可以简单地 描述成一个 new threadrunnablenot runnabledead 的过程。 第一次创建线程时,都位于 new 状态,不能运行,只能等待。这时,线程要么调用 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 start 方法开始运行,要么送往 done 状态结束。位于 done 中的线程已经结束执行,这是线 程的最后一个状态。一旦线程位于这个状态,就不能再次出现,而且当 Java 虚拟机中的所 有线程都位于 done 状态时,程序就强行中止。当前正在执行的所有线程都位于 running 状 态,在程序之间用某种方法把处理器的执行时间分成时间片。位于 running 状态的每个线程 都是能运行的,但在一个给定的时间内,每个系统处理器只能运行一个线程。如果线程的执 行被中断,就位于 waiting 状态。这时,线程可能被挂起,在系统资源上等候,或者被告知 进入休眠状态 Sleep。 Thread 类提供了 Sleep()、Stop()、Yield()、Suspend()和 Resume()等 方法来管理线程。 3.2.3 UAW Thread 实现过程及部分源代码分析 检测是否有用户连接到服务器上,如果有,则创建一个线程来服务这个用户。 ChatCommunication(ChatServer chatserver,Socket clientsocket) Parent = chatserver; socket = clientsocket; try inputstream = new DataInputStream( new BufferedInputStream(socket.getInputStream(); catch(IOException _IOExc) thread = new Thread(this); thread.start(); 执行线程。 public void run() while(thread != null) try 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 /服务器端响应连接并创建一个 socket 连接 socket = serversocket.accept(); /为每个用户创建一个独立的线程 chatcommunication = new ChatCommunication(this,socket); thread.sleep(THREAD_SLEEP_TIME);/监听间隔 catch(InterruptedException _INExc) System.out.println(“ChatServer run() InterruptedException“); _INExc.printStackTrace(); ExitServer(); catch(IOException _IOExc) System.out.println(“ChatServer run() IOException“); _IOExc.printStackTrace(); ExitServer(); 本系统采用协作式模型,为了能保证线程正常放弃处理器,不掠夺其他线程的执行时间, 调用 sleep() 方法,使线程放弃处理器,并且在 sleep 方法中指定的时间间隔。 thread.sleep(THREAD_SLEEP_TIME); THREAD_SLEEP_TIME 常量在 CommonSetting 接口中定义 public int THREAD_SLEEP_TIME = 1500; 服务器端的 socket 在一个循环不停地监听(serversocket.accept()内,每监听一次休整 1500 毫秒。 结束线程 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 if(thread != null) thread.stop(); thread = null; 3.3 信息标签 3.3.1 定义 聊天室系统,涉及到在服务器端和客户端之间大量信息的交互,并根据不同的指令信息 执行相应不同的操作,使用不当极易产生混淆。因此,为了提高系统运行的性能和日后的维 护,在服务器端,自定义信息标签 RFC(request for comments)以便于信息的分类和执行。 以下是在本系统程序中定义的各个信息标签(为了程序的统一和简化,采用 4 字符英文缩写 并全部为大写): 名称含义 HELO 初始化向服务器端的连接 QUIT 退出聊天室 KICK 聊天室踢人 CHRO 更换房间 MESS 发送公共信息 PRIV 发送私聊信息 ROCO 统计具体房间中的用户数 表 3-1 信息标签 3.3.2 功能及程序设计思路 HELOHELO 初始化向服务器端的连接初始化向服务器端的连接 调用 AddUser() if(RFC.startsWith(“HELO“) 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 Parent.AddUser(socket,RFC.substring(5); AddUser()操作流程图如图 3-4 所示: AddUser() 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 新名 不 不 不 图 3-4 AddUser()操作流程图 QUITQUIT 退出聊天室退出聊天室 调用 RemoveUser() if(RFC.startsWith(“QUIT“) Parent.RemoveUser(RFC.substring(5,RFC.indexOf(“), RFC.substring(RFC.indexOf(“)+1),REMOVE_USER); QuitConnection(); RemoveUser()操作流程图如图 3-5 所示: 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 RemoveUser() 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 退出 不 不 不 不 图 3-5 RemoveUser()操作流程图 KICKKICK 踢出违规用户踢出违规用户 调用 RemoveUser() if(RFC.startsWith(“KICK“) Parent.RemoveUser(RFC.substring(5,RFC.indexOf(“), RFC.substring(RFC.indexOf(“)+1),KICK_USER); QuitConnection(); RemoveUser()操作流程图同图 3-5 所示。 CHROCHRO 更换房间更换房间 调用 ChangeRoom() if(RFC.startsWith(“CHRO“) Parent.ChangeRoom(socket,RFC.substring(5,RFC.indexOf(“), RFC.substring(RFC.indexOf(“)+1); ChangeRoom()操作流程图如图 3-6 所示: 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 ChangeRoom() 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 图 3-6 ChangeRoom()操作流程图 MESSMESS 发送公共信息发送公共信息 调用 SendGeneralMessage() if(RFC.startsWith(“MESS“) Parent.SendGeneralMessage(socket, RFC.substring(RFC.indexOf(“:“)+1), RFC.substring(RFC.indexOf(“)+1,RFC.indexOf(“:“), RFC.substring(5,RFC.indexOf(“); SendGeneralMessage()操作流程图如图 3-7 所示: SendGeneralMessage() 不 不 不 不 不 30 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 30 不 不 不 图 3-7 SendGeneralMessage()操作流程图 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 PRIVPRIV 悄悄话悄悄话 调用 SendPrivateMessage() if(RFC.startsWith(“PRIV“) Parent.SendPrivateMessage( RFC.substring(RFC.indexOf(“)+1), RFC.substring(5,RFC.indexOf(“); SendPrivateMessage()操作流程图如图 3-8 所示: SendPrivateMessage() 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 图 3-8 SendPrivateMessage()操作流程图 ROCOROCO 统计在线用户数统计在线用户数 调用 GetUserCount() if(RFC.startsWith(“ROCO“) Parent.GetUserCount(socket,RFC.substring(5); GetUserCount()操作流程图如图 3-9 所示: 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 GetUserCount() 不 不 不 不 不 不 不 不 不 不 当前房间 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 不 当前房间 不 不 不 不 不 不 不 不 不 不 不 不 不 图 3-9 GetUserCount()操作流程图 3.4 Java 中文显示 3.4.1 Java 中文问题的来源 字符编码集按长度分为 SBCS(单字节字符集) ,DBCS(双字节字符集)两大类。计算机 最初的操作系统支持的编码是单字节的字符编码,于是,在计算机中一切处理程序最初都是 以单字节编码的英文为准进行处理。随着计算机的发展, 每个国家(或区域)都规定了计算机信息交换用的字符编码集,作为该国家/区域内信 息处理的基础,有着统一编码的重要作用。但是由于各个本地字符集代码范围重叠,相互间 信息交换困难;软件各个本地化版本独立维护成本较高。因此有必要将本地化工作中的共性 抽取出来,作一致处理,将特别的本地化处理内容降低到最少。这也就是所谓的国际化。为 此,人们提出了 UNICODE 编码,它采用双字节编码,兼容英文字符和其它民族的双字节字符 编码,所以目前,现在大部分具有国际化特征的软件核心字符处理都是以 Unicode 为基础 的,在处理过程中需要实现 Unicode 和本地字符集的相互转换,或以 Unicode 为中介的两 个不同本地字符集的相互转换。这种方式在网络环境下被进一步延伸,任何网络两端的字符 信息也需要根据字符集的设置转换成可接受的内容。 由于 Java 语言内部采用 UNICODE 编码,遵守 Unicode V2.0。所以在 JAVA 程序运行时, 无论是从/往文件系统以字符流读/写文件,还是往 URL 连接写 HTML 信息,或从 URL 连接 读取参数值,都会有字符编码的转换。这样做虽然增加了编程的复杂度,容易引起混淆,但 基于 JAVA 的 UAW 聊天室系统Server 端的设计与实现 却是符合国际化的思想的。但是,这一转换过程有着一系列的步骤,如果其中任何一步出错, 则显示出来的汉字就会出是乱码,这就是我们常见的 JAVA 中文问题。 同时,Java 是一个跨平台的编程语言,也即编写的程序不仅能在

温馨提示

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

评论

0/150

提交评论