首页 聊天系统软件制作

聊天系统软件制作

举报
开通vip

聊天系统软件制作毕业论文 毕 业 论 文 题 目: 聊天系统软件制作 班 级:08计算机应用(2)班 学 号:2085090252 姓 名:桑真友 指导教师:马汝成 完 成 时 间:2010年11月 30 日 摘 要 随着互联网技术的飞速发展,基于网络的即时通信给人们带来诸多便利,也成为当今网络应用的主流。聊天工具作为当今使用最为广泛的即时通信工具之一,可以方便人们随时随地进行在线交流,比如腾讯公司的QQ聊天软件。本毕业设计就是模拟QQ聊天软件,开发一个包括文字聊天、文件传输、语音及视频交流等功能的聊天软件。 本设计的开发采用so...

聊天系统软件制作
毕业论文 毕 业 论 文 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 目: 聊天系统软件制作 班 级:08计算机应用(2)班 学 号:2085090252 姓 名:桑真友 指导教师:马汝成 完 成 时 间:2010年11月 30 日 摘 要 随着互联网技术的飞速发展,基于网络的即时通信给人们带来诸多便利,也成为当今网络应用的主流。聊天工具作为当今使用最为广泛的即时通信工具之一,可以方便人们随时随地进行在线交流,比如腾讯公司的QQ聊天软件。本毕业设计就是模拟QQ聊天软件,开发一个包括文字聊天、文件传输、语音及视频交流等功能的聊天软件。 本设计的开发采用socket结构,在基于Socket java 开发环境下,使用JAVA语言设计进行本软件的开发。本文首先论述国内外聊天工具的发展情况和现今的发展方向,并对开发环境和开发语言进行了简单介绍;对本设计所要开发的多功能聊天软件作了较为详细的需求分析,并给出了多功能聊天软件的设计 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 ,主要功能包括文字聊天、文件传输、语音聊天及视频聊天等;本毕业设计主要实现的是多功能聊天软件的部分功能,即语音聊天、视频聊天等功能,主要实现用户注册、用户登录、用户之间语音、视频聊天功能;与另一位同学开发实现的文字聊天与文件传输模块集成在一起,构成一个实用的、功能完善的聊天软件,达到预期目标;通过运行、测试与分析 说明 关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书 ,该多功能聊天软件运行稳定、可靠,具有一定的实用价值。本设计课题―用JAVA语言设计即时通讯系统是为了更好的满足人们的网上聊天和彻底的实现两台计算机之间点对点的信息交流的需求提出来的,也是当今网络迅速发展的结果。 关键词:局域网 聊天 socket java ABSTRACT Along with the rapid development of Internet technology, based on the network instant communication people brings many convenient, also become the mainstream of the current network applications. Chatting tools as the most widely used instant communication tools, can one convenient for people to be done anywhere and anytime online exchanges, such as tecent company QQ chat software. The graduation design is simulated QQ chat software, develop a including text chat, voice, and video file transfer and communication function of chat software. This design development using socket structure, based on socket Java development environment, use Java language design for the software development. This paper first discusses the developing situation of domestic and foreign chatting tools and current development direction, and the development environment and develop language is simply introduced, This design to develop multifunctional chat software detail requirement analysis, and gives the multi-function chat software, the design of the main features include text chat, file transfer, voice chat and video chat, etc; The graduation design mainly realizes the multi-function chat software is part of the functions, namely voice chat, video chat, and other functions, mainly realizes user registration, user login, between users video chat function; pronunciation, With another classmate development firm . Keywords: LAN chat socket Java 目 录 TOC \o "1-3" \h \z \u 摘要 I ABSTRACT II 目录 III 第一章、绪论 1 1.1 JAVA 的网络功能与编程 1 1.1.1 JAVA概述 1 1.1.2 JAVA的特点 1 1.1.3 JAVA语言在网络上的应用 2 1.2 JavaBeans技术开发可重用组件 4 1.3可行性分析 5 1.3.1从经济上分析 5 1.3.2从技术上分析 5 第二章、系统分析与设计方案 5 2.1 聊天系统的总体设计要点 6 2.2数据库设计 6 2.3聊天系统的设计步骤及功能模块划分 7 2.3.1聊天系统工作原理图 7 2.3.2聊天系统各功能模块 7 2.4 功能模块结构图 18 第三章、详细设计 18 3.1规划设计 18 3.1.1课题来源 18 3.1.2需求分析 19 3.2主程序设计 19 第四章、系统设计环境与测试 22 4.1 开发环境和工具 22 4.2聊天系统的测试 22 总结与展望 25 参考文献 26 致 谢 27 附 录 28 第一章、绪论 1.1 JAVA 的网络功能与编程 1.1.1 JAVA概述 Java语言其实最早是诞生于1991年,起初被称为OAK语言,是SUN公司为一些消费性电子产品而设计的一个通用环境。他们最初的目的只是为了开发一种独立于平台的软件技术,而且在网络出现之前,OAK可以说是默默无闻,甚至差点夭折。但是,网络的出现改变了OAK的命运。   在Java出现以前,Internet上的信息内容都是一些乏味死板的HTML 文档。这对于那些迷恋于WEB浏览的人们来说简直不可容忍。他们迫切希望能在WEB中看到一些交互式的内容,开发人员也极希望能够在WEB上创建一类无需考虑软硬件平台就可以执行的应用程序,当然这些程序还要有极大的安全保障。对于用户的这种要求,传统的编程语言显得无能为力,而SUN的工程师敏锐地察觉到了这一点,从1994年起,他们开始将OAK技术应用于WEB上,并且开发出了HotJava的第一个版本。当SUN公司1995年正式以Java这个名字推出的时候,几乎所有的WEB开发人员都想到:噢,这正是我想要的。于是Java成了一颗耀眼的明星,丑小鸭一下了变成了白天鹅。 Java的开发环境有不同的版本,如sun公司的Java Development Kit, 简称JDK。后来微软公司推出了支持Java规范的Microsoft Visual J++ Java开发环境,简称 VJ++。 1.1.2 JAVA的特点 1.简单(Simple) 简单易学 不存在指针、单一继承、内存空间自动回收 面向对象(Object oriented) 类和对象数据和方法的封装 封装、继承、多态性 注重于数据和操作数据的方法,而不是流 2.解释性(Interpreted) Java编译器生成字节码,Java解释器执行字节码 链接过程简单,仅仅将新的类装载(load)入运行环境 3.平台独立(Architecture neutral)和可移植(Portable) Java编译器产生的字节码(bytecode)可运行在异种网络环境中(不同的硬件系统和不同的操作系统) Java程序在不同的平台中行为一致,不存在数据类型的不一致等现象 4.鲁棒/健壮(Robust)和安全(Secure) 取消了指针的不安全性,增强了程序的健壮性 内存管理简单,“new”构造对象,对象释放(automatic garbage collection) 可靠的语言: compile-time checking和run-time checking 网络环境的应用不会产生恶意行为,为Java程序构造一个个(Sandbox,具有安全策略的限制),提高了安全性 5.多线程(Multithreaded) 例: 浏览器应用中,播听音乐/拖动页面/后台下载页面 线程类: java.lang.Thread/Runnable/ThreadGroup等 原语支持: synchronized、wait()、notify() 6.分布式(Distributed) 支持网络应用, java.net.* URL类 Socket类、ServerSocket类 DatagramSocket类、DatagramPacket类 7.高性能(High performance) 解释性的语言,没有C语言快 “Just-In-Time” JIT编译器,在运行时将Java字节码转变为机器码 Java HotSpot Compilers 动态(Dynamic) Java语言在执行的链接(link)阶段是动态的 class类仅在需要时被链接 被链接的代码模块可以有不同的来源,从本地或从网络 8.体系结构中立 Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。这些字节码指令对应于Java虚拟 机中的表示,Java解释器得到字节码后,对它进行转换,使之能够在不同的平 台运行。 9.可移植性 与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。 同时,Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java 系统本身也具有可移植性 1.1.3 JAVA语言在网络上的应用  一、Java网络应用模型   和Internet上的许多环境一样,完整的Java应用环境实际上也是一个客户机/服务器环境,更确切地说是浏览器/服务器模型(即Browser/Server模型,简称Web模型)。但与传统的客户机/服务器(C/S) 的二层结构不同,应用Java的Web模型是由三层结构组成的。传统的C/S结构通过消息传递机制,由客户端发出请求给服务器,服务器进行相应处理后经传递机制送回客户端。而在Web模型中,服务器一端被分解成两部分:一部分是应用服务器(Web 服务器),另一部分是数据库服务器。 针对分布式计算环境,Java通过其网络类库提供了良好的支持。对数据分布,Java提供了一个URL(Uniform Resource Locator) 对象, 利用此对象可打开并访问网络上的对象,其访问方式与访问本地文件系统几乎完全相同。对操作分布,Java的客户机/ 服务器模式可以把运算从服务器分散到客户一端(服务器负责提供查询结果,客户机负责组织结果的显示),从而提高整个系统的执行效率,增加动态可扩充性。Java网络类库是Java 语言为适应Internet 环境而进行的扩展。另外,为适应Internet的不断发展,Java还提供了动态扩充 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 ,以不断扩充Java网络类库。 Java的网络类库支持多种Internet协议,包括Telnet, FTP 和HTTP (WWW),与此相对应的Java网络类库的子类库为: Java.net Java.net.ftp Java.net.www.content Java.net.www.html Java.net.www.http  这些子类库各自容纳了可用于处理Internet协议的类和方法。其中,java.net用于处理一些基本的网络功能,包括远程登录(Telnet);java.net.ftp用于处理ftp协议; java.net.www.content用于处理WWW 页面内容;java.net.www.html 和java.net.www.http 则分别提供了对HTML 语言和HTTP 协议的支持。 二、客户机/服务器环境下的Java应用程序 客户机/服务器在分布处理过程中,使用基于连接的网络通信模式。该通信模式首先在客户机和服务器之间定义一套通信协议,并创建一Socket类,利用这个类建立一条可靠的链接;然后,客户机/服务器再在这条链接上可靠地传输数据。客户机发出请求,服务器监听来自客户机的请求,并为客户机提供响应服务。这就是典型的"请求-- 应答" 模式。下面是客户机/服务器的一个典型运作过程: 1、服务器监听相应端口的输入; 2、客户机发出一个请求; 3、服务器接收到此请求; 4、服务器处理这个请求,并把结果返回给客户机; 5、重复上述过程,直至完成一次会话过程。 按照以上过程,我们使用Java语言编写一个分别针对服务器和客户机的应用 (Application)。该程序在服务器上时,程序负责监听客户机请求,为每个客户机请求建立Socket 连接,从而为客户机提供服务。本程序提供的服务为:读取来自客户机的一行文本,反转该文本,并把它发回给客户机。 通过该程序实例我们看到,使用Java语言设计C/S程序时需要注意以下几点: (1)、 服务器应使用ServerSocket 类来处理客户机的连接请求。当客户机连接到服务器所监听的端口时,ServerSocket将分配一新的Socket 对象。这个新的Socket 对象将连接到一些新端口,负责处理与之相对应客户机的通信。然后,服务器继续监听ServerSocket,处理新的客户机连接。 Socket 和ServerSocket 是Java网络类库提供的两个类。 (2)、服务器使用了多线程机制。Server对象本身就是一个线程,它的run()方法是一个无限循环,用以监听来自客户机的连接。每当有一个新的客户机连接时,ServerSocket就会创建一个新的Socket类实例,同时服务器也将创建一新线程,即一个Connection 对象,以处理基于Socket 的通信。与客户机的所有通信均由这个Connection 对象处理。Connection的构造函数将初始化基于Socket 对象的通信流,并启动线程的运行。与客户机 的通信以及服务的提供,均由Connection对象处理。 (3)、客户机首先创建一Socket对象,用以与服务器通信。之后需创建两个对象:DataInputStream 和PrintStream,前者用以从Socket 的InputStream 输入流中读取数据,后者则用于往Socket的OutputStream 中写数据。最后,客户机程序从标准输入(如:控制台)中读取数据,并把这些数据写到服务器,在从服务器读取应答消息,然后把这些应答消息写到准输出。以下分别为服务器和客户机端的源程序清单。本程序在NT 4.0 网络环境(TCP/IP)下使用JDK1.1 调试通过。 1.2 JavaBeans技术开发可重用组件 类是Java语言用来封装对象的基本单位。当类的构建沿用了JavaBeans的各种约定时,它就被称作JavaBean,可以被加到组件库中以更好地重用。  造个打招呼的词    开发一个简单的HelloBean,学习如何在NetBeans中完成JavaBean的开发。    操作步骤如下。   1.打开"文件"菜单→"新建项目"。弹出"新建项目"对话框,在项目栏中选择"Java类库"。点击"下一步"。在"名称和位置"栏中,输入项目名"100201_HelloBean",点击"完成"。   2.选中项目"100201_HelloBean"下的"SoucePackage",在右键菜单中选中"新建"→"Java类…"。在"新建Java类"对话框中,输入类名"HelloBean",包"course"。点击"完成"。   3. 在NetBeans IDE中,编辑文件HelloBean.java。其代码如下:   package course;   public class HelloBean String name;public Stringhello()return"Hello!" + name;   它包含一个属性(问候人的名称)和一个方法(生成问候的句子)。   4. 重构。 上面的代码并不符合JavaBean的约定,还要进一步重构。在源代码编辑器中,单击右键,选择"重构"→"封装字段(T)…"。在"封装字段"的对话框中,如图2-1所示,选择创建setter和getter方法,并设字段的可视性为"private"。点击"重构"按钮。 图2-1 NetBeans中封装字段的对话框重构后的代码如下:   package course;   public class HelloBean private String name;publicStringhello()return "Hello!" + getName();   public String getName() return name;   public void setName(String name) this.name = name;   JavaBeans规范建议对属性的读写通过get/set方法进行,并不鼓励直接访问属性。这一规定使得属性中的数据更加安全,并可以通过重写get/set方法定制读写的方式。   5. 查看成员。 选择"HelloBean.java",在右键弹出的菜单中选择"文件成员"。可以看到HelloBean的成员,如图2-2所示。这个图所示的信息是通过JavaBean的内省功能得到的。 图2-2 NetBeans中显示类中成员的对话框   6. 加入组件面板。   选择"HelloBean.java",在右击弹出的菜单中选择"工具"→"添加到组件面板中"。   至此,所造的新词"HelloBean"已经放在了组件库中,可以被别人使用了。   通过开发和使用可重用组件,可以做到以较小的改动来应对不断变化的需求,避免重复开发和测试。 1.3可行性分析 1.3.1 从经济上分析 该聊天程序作为本人的毕业设计,硬件设备只需要一台连接到互联网的计算机,以便我在开发中所遇到的问题可以上网查询资料,还有就需要阅读一些关于java方面的书籍来参考。 1.3.2 从技术上分析 该聊天程序是一个可视化界面操作的,主要是文件系统对数据进行存储、更新与维护。使用MyEclipse6.5为开发平台,它的Swing编程可以可以实现系统的可视化同时它为我们提供了许多接口技术。 第二章、系统分析与设计方案 2.1 聊天系统的总体设计要点      聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点: 1、实现思想 在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。 2、服务器端 工作流程 财务工作流程表财务工作流程怎么写财务工作流程图财务工作流程及制度公司财务工作流程 服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。 3、客户端工作流程 客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。 2.2数据库设计 系统可以采用任何一种流行的,Java支持的数据库,本系统采用了Microsoft公司的SQL Server2000作为后台数据库。通过对现在流行的一些Icq的参考,建立数据库,名为javaicq,数据库共建立两个表,一个是用户的基本信息,包括呢称,Jicq号码等。一个是用户的好友表,包括用户自己的号码和好友的号码。 表2.2.1用户的基本信息表 序号 字段名 含义 数据类型 NULL 1 Icqno 用户的号码 Int No 2 Nickname 用户的呢称 Char No 3 Password 用户的密码 Char No 4 Status 用户在线否 Bit No 5 Ip 用户的IP地址 Char Yes 6 Info 用户的资料 Varchar Yes 7 Pic 用户的头像号 Int Yes 8 Sex 用户性别 Char Yes 9 Email 用户的email Char Yes 10 Place 用户的籍贯 Char yes 其中Icqno字段为自动增加。(其他还可以添加诸如电话号码等字段作为更多选择) 表2.2.2用户的好友表 序号 字段名 含义 数据类型 NULL 1 Icqno 用户的号码 Int No 2 Friend 好友的号码 Int No 2.3聊天系统设计步骤功能模块划分 2.3.1聊天系统工作原理图 图2-3客户与服务器的关系 2.3.2聊天系统各功能模块 (1)服务器程序模块 服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为9527,然后无限循环调用accept()方法接受客户程序的连接。 服务器线程源码: package qq.server; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.*; import qq.dao.hibernate.IServiceDao; import qq.entity.*; public class ServerController { private User user; private Socket s; private IServiceDao dao; private ObjectInputStream ois; private ObjectOutputStream oos; private OnlineUser onlineUser; public ServerController(Socket s) { super(); dao=ServerMainClass.userDao; this.s = s; } public void handle() throws Exception { ois=new ObjectInputStream(s.getInputStream()); oos=new ObjectOutputStream(s.getOutputStream()); onlineUser=new OnlineUser(ois,oos); while(true){ Request req=(Request)ois.readObject(); ois.read(); RequestType type=req.getType(); if(type.equals(RequestType.exit)){ exitHandle(); break; }else if(type.equals(RequestType.login)){ loginHandle(req); }else if(type.equals(RequestType.register)){ registerHandle(); }else if(type.equals(RequestType.offline)){ offlineHandle(); break; }else if(type.equals(RequestType.changeInformation)){ changeInformationHandle(); }else if(type.equals(RequestType.modifypasswd)){ modifypasswdHandle(req); }else if(type.equals(RequestType.sendMessage)){ sendMessageHandle(req); }else if(type.equals(RequestType.receiveFile)){ receiveFileHandle(req); }else if(type.equals(RequestType.sendFile)){ sendFileHandle(req); } } } private void modifypasswdHandle(Request req) { Long id=Long.parseLong(req.getData("id")); String oldpwd=req.getData("oldpwd"); String newpwd=req.getData("newpwd"); Response res=new Response(RequestType.modifypasswd); try { dao.updatePwd(id, oldpwd, newpwd); res.setData(1); try { oos.writeObject(res); } catch (IOException e) { e.printStackTrace(); } } catch (RuntimeException e) { try { oos.writeObject(res); } catch (IOException e1) { e1.printStackTrace(); } } } private void changeInformationHandle() { try { User user=(User)ois.readObject(); Response res=new Response(RequestType.changeInformation); try { dao.updateUser(user); res.setData(1);//修改成功返回值带一个整形值 oos.writeObject(res); oos.flush(); } catch (RuntimeException e) { oos.writeObject(res);//失败则返回值不带参数 oos.flush(); e.printStackTrace(); } } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } private void exitHandle() { try { s.close(); } catch (IOException e) { e.printStackTrace(); } } //发送文件 private void sendFileHandle(Request req) { // try { // User u=(User)ois.readObject(); // // } catch (Exception e) { // e.printStackTrace(); // } } //接受文件 private void receiveFileHandle(Request req) { } //发送消息 private void sendMessageHandle(Request req) { Response res=new Response(RequestType.receiveMessage); Message message=null; try { message=(Message)ois.readObject(); res.setData(message); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } User to=message.getTo(); if(to==null){ sendToAllUser(res);//如果收信人为null,则发送信息给所有人 }else{ //发送信息给to和他自己 Response res1=new Response(RequestType.individualTalk); res1.setData(message); ObjectOutputStream o=null; Setset=ServerMainClass.userMap.keySet(); Iterator it=set.iterator(); while(it.hasNext()){ User u=(User)it.next(); if(u.equals(to)){ o=ServerMainClass.userMap.get(u).getOos(); break; } } try { o.writeObject(res1); o.flush(); } catch (IOException e) { e.printStackTrace(); } } } //下线 private void offlineHandle() { try { ServerMainClass.userMap.remove(user); Response res=new Response(RequestType.offline); res.setData(user);//把下线用户发送给所有客户端 sendToAllUser(res); s.close(); } catch (IOException e) { e.printStackTrace(); } } private void registerHandle() { User user=dao.addUser(); try { oos.writeObject(user); System.out.println(user.getId()+":"+user.getName()); oos.flush(); } catch (IOException e) { e.printStackTrace(); } } //登录 private void loginHandle(Request req) { Long id=Long.parseLong((String)req.getData("id")); String pwd=(String)req.getData("pwd"); user=dao.getUser(id,pwd); Response res; try { Setusers=ServerMainClass.userMap.keySet(); Iterator iter=users.iterator(); while(iter.hasNext()){ User u=(User)iter.next(); if(u.equals(user)){ res=new Response(RequestType.haveOnline); oos.writeObject(res); oos.flush(); return;//该用户已经在线 } } res=new Response(RequestType.online); res.setData(user); oos.writeObject(res); oos.flush(); // 给刚上线用户发送在线用户列表 if(user!=null){ Setset=ServerMainClass.userMap.keySet(); oos.write(set.size()); Iterator it=set.iterator(); while(it.hasNext()){ oos.writeObject(it.next()); } oos.flush(); sendToAllUser(res);//通知在线用户有新用户上线 ServerMainClass.userMap.put(user, onlineUser);//保存用户信息 } } catch (IOException e) { e.printStackTrace(); } } private void sendToAllUser(Response res){ try { Collection c= ServerMainClass.userMap.values(); Iterator it=c.iterator(); while(it.hasNext()){ ObjectOutputStream o=((OnlineUser)it.next()).getOos(); o.writeObject(res); o.flush(); } } catch (IOException e) { e.printStackTrace(); } } } (2)客户程序模块 客户通过Socket(InetAddress,port)建立与服务器的连接。服务器与客户都通过构造ObjectInputStream,ObjectOutputStream来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,比如文件传输等,服务器收到来自客户的请求后,针对不同的消息处理请求。具体的源码如下: package qq.client; import java.awt.Color; import java.io.EOFException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import javax.swing.JOptionPane; import javax.swing.JTextPane; import javax.swing.text.BadLocationException; import javax.swing.text.SimpleAttributeSet; import javax.swing.text.StyleConstants; import java.net.*; import java.util.Calendar; import qq.client.panel.UserListPanel; import qq.client.windows.IndividualTalkWindow; import qq.entity.*; public class ClientThread extends Thread{ private ObjectInputStream ois; private ObjectOutputStream oos; private Socket s; private JTextPane receive; private JTextPane record; private JTextPane publicInfo; private UserListPanel userList; private SimpleAttributeSet set; public ClientThread(JTextPane receive, JTextPane record, JTextPane publicInfo, UserListPanel userList) { this.receive = receive; this.record = record; this.publicInfo = publicInfo; this.userList = userList; s=ClientMainClass.socket; ois=ClientMainClass.ois; oos=ClientMainClass.oos; set=new SimpleAttributeSet(); StyleConstants.setFontSize(set, 16); StyleConstants.setFontFamily(set,"宋体"); StyleConstants.setForeground(set, new Color(0,139,139)); } @Override public void run() { while(s.isConnected()){ try { Response res=(Response)ois.readObject(); if(res!=null){ RequestType type=res.getType(); if(type.equals(RequestType.online)){ onlineHandle(res); }else if(type.equals(RequestType.offline)){ offlineHandle(res); }else if(type.equals(RequestType.changeInformation)){ changeInformationHandle(res); }else if(type.equals(RequestType.modifypasswd)){ modifypasswdHandle(res); }else if(type.equals(RequestType.receiveMessage)){ receiveMessageHandle(res); }else if(type.equals(RequestType.individualTalk)){ individualTalkHandle(res); }else if(type.equals(RequestType.receiveFile)){ receiveFileHandle(res); }else if(type.equals(RequestType.publicInfo)){ publicInfoHandle(res); } } } catch (EOFException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } } private void modifypasswdHandle(Response res) { if(res.getData()!=null){ JOptionPane.showMessageDialog(null, "密码修改成功"); }else{ JOptionPane.showMessageDialog(null, "密码修改失败\n服务器忙,请稍后再试!"); } } private void changeInformationHandle(Response res) { if(res.getData()!=null){ JOptionPane.showMessageDialog(null, "修改成功"); }else{ JOptionPane.showMessageDialog(null, "服务器忙,请稍后再试!"); } } private void publicInfoHandle(Response res) { String str=(String)res.getData(); publicInfo.setText(str); } private void receiveFileHandle(Response res) { } private void individualTalkHandle(Response res) { Message message=(Message)res.getData(); User user=message.getFrom(); if(!ClientMainClass.individual.containsKey(user.getId())){ int flag=JOptionPane.showConfirmDialog(null,user.getName()+"请求与你私聊,是否接受?","",JOptionPane.YES_NO_OPTION); if(flag==JOptionPane.NO_OPTION){ return; } IndividualTalkWindow indi=new IndividualTalkWindow(user); ClientMainClass.individual.put(user.getId(), indi.getReceivedmessageArea().getTextPane()); indi.showMe(); } JTextPane jtp=ClientMainClass.individual.get(user.getId()); try {//输出信息发送人,时间 jtp.getDocument().insertString(jtp.getDocument().getLength(), user.getName()+" "+message.getTime()+"\n",set); } catch (BadLocationException e) { e.printStackTrace(); } //输出信息 message.analysisMessage(jtp); } private void receiveMessageHandle(Response res) { Message message=(Message)res.getData(); if(ClientMainClass.shield.contains(message.getFrom().getId())){ return; } try {//输出信息发送人,时间 receive.getDocument().insertString(receive.getDocument().getLength(), message.getFrom().getName()+""+message.getTime()+"\n", set); } catch (BadLocationException e) { e.printStackTrace(); } //输出信息 message.analysisMessage(receive); } private void offlineHandle(Response res) { User user=(User)res.getData(); ClientMainClass.onlineUsers.remove(user); userList.freash(ClientMainClass.onlineUsers); Calendar c = Calendar.getInstance(); String time=c.get(Calendar.YEAR)+"-"+c.get(Calendar.MONTH)+"-"+c.get(Calendar.DAY_OF_MONTH)+" "+ (c.get(Calendar.HOUR_OF_DAY)+8)+":"+c.get(Calendar.MINUTE)+":"+c.get(Calendar.SECOND); try { receive.getDocument().insertString(receive.getDocument().getLength(), user.getName()+" "+time+" 下线\n",set); } catch (BadLocationException e) { e.printStackTrace(); } } private void onlineHandle(Response res) { User user=(User)res.getData(); ClientMainClass.onlineUsers.add(user); userList.freash(ClientMainClass.onlineUsers); Calendar c = Calendar.getInstance(); String time=c.get(Calendar.YEAR)+"-"+c.get(Calendar.MONTH)+"-"+ c.get(Calendar.DAY_OF_MONTH)+" "+(c.get(Calendar.HOUR_OF_DAY)+8)+":"+ c.get(Calendar.MINUTE)+":"+c.get(Calendar.SECOND); try { receive.getDocument().insertString(receive.getDocument().getLength(), user.getName()+" "+time+" 上线\n", set); } catch (BadLocationException e) { e.printStackTrace(); } } } 2.4 功能模块结构图 图2-4功能模块结构图1 2-5功能模块结构图2 第三章、详细设计 3.1规划设计 3.1.1 课题来源 根据当前网络的需求,网络聊天越来越受各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过JAVA语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,本人就决定以《基于JAVA聊天设计与实现》为毕业设计,希望通过这一次的能进一步提高本人的网络开发编程的能力。 3.1.2需求分析 聊天系统不外乎两个方面,服务器端和客户端。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器端的任务:   1.服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接(包括判断没有响应的连接超时)。   2.服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。   以上就是服务器端最主要的两个任务。不难看出,服务器端的任务并不复杂。   客户端应该完成的工作包括:   1.与服务器端建立通信通道,向服务器端发送信息。   2.接收来自服务器的信息。 相对服务器而言,客户端的任务更加简单,有了以上的简单分析,可以知道,解决上述四个问题,即完成了该聊天系统的核心。 3.2主程序设计 import java.io.*;
本文档为【聊天系统软件制作】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_470611
暂无简介~
格式:doc
大小:554KB
软件:Word
页数:36
分类:工学
上传时间:2011-01-03
浏览量:54