JAVA聊天室

合集下载

一种基于Java技术的聊天室系统的设计与实现

一种基于Java技术的聊天室系统的设计与实现
维普资讯

种基于 Jv 技术的聊天室系统的设计与实现 aa
胡少 峰 , 赵 克 , 春 霞 耿
707 ) 1 0 1 ( 安 电子 科 技 大 学 研 究 生 院 , 安 西 西
摘 要 : 章 简 要 介 绍 了 J P ( a a S r e a e 文 S J v e v r P g )以 及 J C ( a a aa a e DB J v D tb s
J E E B等 。J v 2 E、 J a a技 术 从 推 出 至 今 仅 几 年
的时 问 , 以其 完 全 的 面 向对 象 风 格 , 作 平 就 操
台 的无 关 性 、 全性 、 安 健壮 性 、 移 植 性 、 可 中性 等 优 点 , 受 国 内外 软 件 开 发 人 员 的 欢 迎 。 深
We b应 用 的 一 般 过 程 为 : 置 好 We 设 b服 务
0 引 言
Jv a a技 术 是 由 美 国 S n公 司 倡 导 和 推 u 出 的 。 a a技 术 包括 J v Jv a a语 言 和 J v da a aMe i
A PI 、J v Ap lt a a s aa p e 、J v Ap l a i n、J v p i to c aa
RM I J v a s J P、 a a S r l t J 、 a a Be n 、 S J v e ve 、 DBC、
器 ; 发 J v pe 开 a a Ap lt或 C in piain l t Ap l t e c o 作为 客户 端程 序, 轻 服 务器 的负担 ; 减 用 J P、a aB a s J v e ve 、 J 等 构 建 在 S J v e n 、a aS r lt E B 服 务 器 端 运 行 的 服 务 程 序 ; 最 底 层 设 计 良 在 好 的 数 据 库 系 统 ; 户 以 HTTP 或 者 RM I 客

本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】

本科毕业论文-基于JAVA的聊天系统的设计与实现【范本模板】

摘要随着互联网的快速发展,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐.目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN-Messager等等。

该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。

前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。

后者通过与服务器建立连接,来进行客户端与客户端的信息交流。

其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。

开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。

在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。

经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java 语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统关键词:局域网聊天 socket javaAbstractAlong with the fast development of Internet,the network chating tool has already become one kind of important communication tools and received more and more web cams favor. At present, many extremely good chating tools have appeared . for example,Netmeeting, QQ,MSN—Messager and so on. This system development mainly includes two aspects of the server procedure of the network chat and the customer procedure of the network chat。

Java聊天室的设计与实现毕业设计开题报告精选全文

Java聊天室的设计与实现毕业设计开题报告精选全文

精选全文完整版(可编辑修改)毕业设计开题报告2017年3月1日毕业设计开题报告1.结合毕业设计情况,根据所查阅的文献资料,撰写2000字左右的文献综述:文献综述研究背景及意义随着计算机网络日新月异的发展,人们的交流方式越来越多,传统的交流方式已经难以满足人们的交流的需求了,网络聊天已经慢慢成为人们生活的一部分,呈现出良好的势头和广阔的发展前景。

在互联网上即时的和好友取得联系,已经成为当今社会人们主流的联系方式。

作为通讯的一种运用的聊天软件,它继承了通讯软件的优点,它具有文字聊天、语音聊天、传送文件、拨打电话、远程协助、视频聊天、邮件辅助、发送短信、浏览咨询等等功能。

开发基于桌面的,面向个人的大众化聊天软件,可以满足网民在网络交流的需要,和电话、手机有着异曲同工之妙,但较之电话和手机,聊天软件具有方便快捷,功能强大,交流成本低等优点,因此受到广大个人用户的喜爱,网络聊天已经成为网络生活中不可或缺的一部分。

网上聊天软件是为人们相互进行交流和联系提供的一个平台,通过提供完善的网上聊天服务,可以达到增进彼此之间的了解,增加人与人之间的感情交流的目的。

同时,即时通信系统对现代企业也有着重大意义,由于聊天程序可以加装到台式机、笔记本电脑、手机等终端上,并且具有通讯、文件传输、视频音频会议等诸多强大的能力,能够有效地降低企业内部的通讯费用,提高工作效率。

越来越多的企业已开始认识到即时通信工具能够带来极高的生产力,并借助它的应用,来提高业务协同性及反馈的敏感度和快捷度。

随着不断地发展现如今聊天软件的开发技术已经比较成熟,各项功能也已日渐完善,聊天程序已不仅仅只是为了聊天,现阶段已获成功的聊天软件都早已将发展中心往建设平台方面发展,以后聊天软件更多承担的角色是一款能够产生价值的巨型航母。

本题目为基于socket的网络编程,具体需要实现C/S模式的聊天程序,使用了java 语言,java语言有下面一些特点:简单、面向对象、分布式、解释执行、安全、体系结构中立、可移植、高性能、多线程以及动态性。

java聊天室部分主要代码

java聊天室部分主要代码

ChatClient.javaimport java.awt.*;import java.io.*;import .*;import java.applet.*;import java.util.Hashtable;public class ChatClient extends Applet implements Runnable{ Socket socket=null;DataInputStream in=null;//读取服务器端发来的消息DataOutputStream out=null;//向服务器端发送的消息InputInfo 用户名提交界面=null;UserChat 聊天界面=null;Hashtable listTable;//用于存放在线用户的用户名的散列表Label 提示条;Panel north,center;Thread thread;public void init(){setSize(1000,800);int width=getSize().width;int height=getSize().height;listTable=new Hashtable();setLayout(new BorderLayout());用户名提交界面=new InputInfo(listTable);int h=用户名提交界面.getSize().height;聊天界面=new UserChat("",listTable,width,height-(h+5));聊天界面.setVisible(false);提示条=new Label("正在连接到服务器...",Label.CENTER);提示条.setForeground(Color.red);north=new Panel(new FlowLayout(FlowLayout.LEFT));center=new Panel();north.add(用户名提交界面);north.add(提示条);center.add(聊天界面);add(north,BorderLayout.NORTH);add(center,BorderLayout.CENTER);validate();}public void start(){if(socket!=null&&in!=null&&out!=null){try{socket.close();in.close();out.close();聊天界面.setVisible(false);}catch(Exception ee){}}try{socket=new Socket(this.getCodeBase().getHost(),6666);in=new DataInputStream(socket.getInputStream());out=new DataOutputStream(socket.getOutputStream());}catch(IOException ee){提示条.setText("连接失败");}//客户端成功连接服务器端if(socket!=null){InetAddress address=socket.getInetAddress();提示条.setText("连接:"+address+"成功");用户名提交界面.setSocketConnection(socket,in,out);north.validate();}if(thread==null){thread=new Thread(this);thread.start();}}public void stop(){try{socket.close();thread=null;}catch(IOException e){this.showStatus(e.toString());}}public void run(){while(thread!=null){if(用户名提交界面.getchatornot()==true){聊天界面.setVisible(true);聊天界面.setName(用户名提交界面.getName());聊天界面.setSocketConnection(socket,in,out);提示条.setText("祝聊天快乐!");center.validate();break;}try{Thread.sleep(100);}catch(Exception e){}}}}ChatMain.javaimport .*;import java.util.*;public class ChatMain {public static void main(String args[]) {ServerSocket server=null;Socket you=null;Hashtable peopleList;peopleList=new Hashtable();while(true){try{//服务器端在端口6666处监听来自客户端的信息server=new ServerSocket(6666);}catch(IOException e1){System.out.println("正在监听");}try{//当服务器端接收到客户端的消息后,取得客户端的IP地址。

用Java Socket实现网络聊天室

用Java Socket实现网络聊天室

务的端 口为8 端 口. e n t 2 端 口, 0 t le 为 3 f p为 2 端 口。通常.从 0 1 2 t 1 — 0 3的端
程序使用 。
L号为系统保 留.大于 1 2 『 0 3提供给应 用 F i t t e m( e rnSra nw
B f e e o tu S r a u f r d u p t t em
t ryi
首先 分析一下聊天室的基 本功能 需

操 作系统的通 用网络编程标准 。在 网络 编程中最常用的方案便是客户 / 务器模 服 型。奉文提 出了在客户机 /服务器 模型 下用 j v o k t a a sc e 实现 I t r e n en t巾常见 的聊天 室软件 的解 决方案 。 Sc e o k t简介
e :
户 当用 户差 闭客 户 端退 出时 . 结束
与用户的 会话 .在服务器端注 销此用 户 2.客户 端 :提 供 良好 的用户 界 面 . 便 于用 户 进 行 连接 、交 谈 当与
个 具有 S c e 接 口的计算机通信 。『 okt 盏用 程序在 网络上传输 ,接收 的信 息都通过 这个 S c e 接 口来 实现 。在应 用开发中 okt
S s e u . r a l (E r r y tm o t p it n r o : e: )
端 有无 数据 发 出, 如有 则接 收数 据 , 更新显示 。 四 、聊 天室应 用程 序类音 规 划 9
经过分析 笔者主 要确定 了如下类 :
服务器端 :

如睹络上最通用 的 t 1 e 、f p等 .就 en t t 如主机 接收 到此请求 .则通信 建 是基于 s c e o k t的服 务程序 ,同一 台主机 立 .服务端产 生一个 S c e o k t实例 .同 可 以提供 多种 服 务,但他 们 并不冲 突 . 此 客 户端 进 行 通 信 ,如 上 。 只因为他们的通信端 口不同,如 h t t p服 然后客户端和服务端分别打 开相 应 的输入输 出流 进行数据 传送 。

Java网络聊天室系统

Java网络聊天室系统
panel.add(lb2);
lb2.setPreferredSize(new Dimension(50,30));
lb2.setBounds(100, 150, 100, 30);
panel.add(txtName);
txtName.setBounds(200, 150, 150, 30);
}catch(Exception e){e.printStackTrace();}
public RegisterFrame(LoginFrame loginFrame)
{
this.f = loginFrame;
try
{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); //设置外观为系统本地外观
this.setPreferredSize(new Dimension(500,500));
this.setBounds(screenSize.width/2-250, screenSize.height/2-250, 500, 500);
this.setVisible(true);
getContentPane().add(lb1);
lb1.setFont(new Font("",Font.BOLD,30));
lb1.setBounds(200, 100, 400, 50);
getContentPane().add(panel);
panel.setLayout(null);
panel.setVisible(true);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

基于Java多线程的聊天室程序

基于Java多线程的聊天室程序
的 网络 通信 链 接 实 现 数据 交 换 。即 服 务 器 和客 户 端 的应 用 程 序 各 有 一 个 S c e ,这 两个 S c e 把 服 务 器 和客 户 端 的程 序 连 接 okt okt 起 来 并 交换 数 据 。 ( )多线 程 :因 为 一 个 服 务 器 要 连 人 多 个 客 户 端 ,要 让 服 2 务 器 程 序 同时 为 多 个 客 户 服 务 , 就 需 要 为 每 个 客 户 端 开 辟 一
Bu f r dR a e b = n w Bu f r - fe e e d r r e fe e
d e d rn w n u S r a R a e (e Ip t te mRe d r e lp t te mO) a e ( g tn u S r a ) s ;
中 ,首 先 定 义 一 个 S reS c e, 并 指 明 端 口号 ,这 样 服 务 器 ev ro k t


t i. l n s = c in s h sc i t e l t; e
3 程序 实现
31 服 务 器 端 。
建 一个 类 ,名 称 为 C atev r h r re ,代 表 服 务 器 程 序 。 在 该 类 S
p bi v i u ) u l od rn({ c ty{ r
建立 好 之 后 .每 个 客 户端 的发 言 都 发 送 给 服 务 器 ,服 务 器 接 收 后 再 转 发 给所 有 连 入 的 客户 端 ,这 样 每 个 客 户 端就 都 能 收 到 其 他 客户 发 出 的信 息 了 。这 就 是 C S结 构 聊 天 室 的工 作 原 理 ,其 / 实现 主 要使 用 如 下 两 种技 术 :
p bi S re T ra S c e s Se l n s{ u l e v r he d(o k tsHa h tci t) c e

基于websocket和java的多人聊天室

基于websocket和java的多人聊天室

最新基于websocket与java的多人聊天室实现架构html5+websocket+javaEE7+tomcat8JavaEE7 最新的websocket1.0 APITomcat8开始支持websocket1.0 API【Tomcat implements the Java WebSocket 1.0 API defined by JSR-356】在编写代码之前你要导入javaEE7的jar包以便使用websocket API,将此项目部署到tomcat8里面。

具体代码如下:Java端:ChatAnnotation类;使用的是注解的方式。

package websocket.chat;import java.io.IOException;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;import java.util.concurrent.atomic.AtomicInteger;import javax.websocket.OnClose;import javax.websocket.OnError;import javax.websocket.OnMessage;import javax.websocket.OnOpen;import javax.websocket.Session;import javax.websocket.server.ServerEndpoint;import org.apache.juli.logging.Log;import org.apache.juli.logging.LogFactory;import util.HTMLFilter;@ServerEndpoint(value = "/websocket/chat")public class ChatAnnotation {private static final Log log =LogFactory.getLog(ChatAnnotation.class);private static final String GUEST_PREFIX = "Guest";private static final AtomicInteger connectionIds = new AtomicInteger(0);private static final Set<ChatAnnotation> connections =new CopyOnWriteArraySet<>();private final String nickname;private Session session;public ChatAnnotation() {nickname = GUEST_PREFIX + connectionIds.getAndIncrement(); }@OnOpenpublic void start(Session session) {this.session = session;connections.add(this);String message = String.format("* %s %s", nickname, "has joined.");broadcast(message);}@OnClosepublic void end() {connections.remove(this);String message = String.format("* %s %s",nickname, "has disconnected.");broadcast(message);}@OnMessagepublic void incoming(String message) {// Never trust the clientString filteredMessage = String.format("%s: %s",nickname, HTMLFilter.filter(message.toString()));broadcast(filteredMessage);}@OnErrorpublic void onError(Throwable t) throws Throwable {log.error("Chat Error: " + t.toString(), t);}private static void broadcast(String msg) {for (ChatAnnotation client : connections) {try {synchronized (client) {client.session.getBasicRemote().sendText(msg);}} catch (IOException e) {log.debug("Chat Error: Failed to send message to client", e);connections.remove(client);try {client.session.close();} catch (IOException e1) {// Ignore}String message = String.format("* %s %s",client.nickname, "has been disconnected."); broadcast(message);}}}}里面的juli.jar包可以百度一下自行下载。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于JAVA的聊天室设计与实现一、设计目的:信息技术的高速发展给人类生产,生活带来了广泛而深远的影响。

“上网冲浪”、“数码相机”“PDA”、“彩屏手机”、“蓝牙技术”等新产品,新概念层出不穷,不断冲击着人们的视听。

这些高科技成果为人们带来便捷、快乐的同时,也促进了人机交互技术的发展。

人机交互是关于设计、评价和实现供人们使用的交互式计算机系统,并围绕相关的主要现象进行研究的科学。

它主要研究人与计算机之间的信息交换,涉及计算机科学,心理学,认知科学等诸多学科,是信息技术的一个重要组成部分,并将继续对信息技术的发展产生巨大影响。

聊天室是一项应用广泛,并且实用性强的一个非常典型的人机交互系统。

在信息世界里,聊天工具的使用是非常频繁的,如MSN、QQ、校内通,之类的聊天工具许多人都正在使用。

此次设计的聊天室系统虽然其功能简单,但是在开发技术和过程中,能够充分学习和使用JAVA的技术,进一步培养学生面向对象程序设计的思想,加深对面向对象程序设计四大特性的理解。

二、需求分析人们日常生活中越来越多地使用聊天室这项应用来为自己的工作和学习服务。

一个操作简单,界面友好、运行稳定的聊天室对于小型局域网的用户可以起到很好的交流作用。

所谓聊天室就是一个可以让许多用户同时互相通信的网上园地,个人用户可以通过聊天室将自己融入整个主流社会中。

根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:(1)、聊天功能:可以实时接收和发送信息,并能支持公聊和私聊的的方式,能够查看聊天记录,聊天过程中能对字体、表情等进行设定等。

(2)、用户功能:可以随时注册和登录及注销,并能选择性加好友和删除好友以及查看对方的开放信息,还能看到对方的登录状态。

(3)、文件传输功能:用户可以共享资源,能发送及接收文件。

(4)、保密功能:用户可以设定自己的保密状态,使某些信息对于其他用户是不可见的。

(5)、系统稳定:客户端与服务端的连接稳定,不出现或者少出现连接不上的情况。

该简易聊天室是为许多喜爱聊天的用户开发设计的,和许多大型的网络聊天室相比该小聊天室功能比较简单,但能实现基本的聊天功能,点对多、点对点聊天和基本的用户功能,登录、注销、查看在线用户等。

三、软件功能描述(1)、用户设置:功能描述:用户自定义自己的登录名,成功设置后,服务端能接收到新设置的用户名;(2)、登录功能:功能描述:在服务端开启的情况下,用户可以以自己自定义或者默认的登录名和登录地址端口登录到客户端,并能在服务器端显示登录状态;(3)、公聊:功能描述:用户在聊天室中可以选择与“所有人”聊天,聊天室中的其他在线用户可以正常接收并正确显示公聊消息。

(4)、私聊:功能描述:用户可以选择与聊天室的在线用户列表中的其他用户聊天。

双方的聊天记录对于聊天室的其他用户是不可见的。

(5)、聊天心情:功能描述:用户在聊天的过程中可以选择相应的心情来表达自己的情感。

(6)、系统消息:功能描述:服务端正常运行的过程中,在聊天室的每一个用户都能接收服务器端发送的信息提示信息。

(7)、用户的状态.功能描述:每一个客户端用户都可以实时看到目前其他在线用户的状态。

(8)、用户注销:功能描述:用户可以注销自己的账号,并重新登记登录名和地址。

(9)、用户退出:功能描述:用户可以在正常情况下退出聊天室。

(10)、服务端控制:功能描述:只有在服务端开启的情况下,用户才能登陆成功和聊天;用户设置的地址端口也必须与服务端的侦听端口一致,否则不能登录。

四:主要模块描述及流程图1、模块描述本聊天室分为聊天室服务端和聊天室客户端,服务端与客户端之间通过套接口Socket(TCP)连接。

在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类.Socket.,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,通过JDBC与后台数据库连接,并通过创建一个ServerSocket 对象来监听来自客户的连接请求,默认IP地址为:127.0.0.1默认端口为8888。

(1)聊天室服务端模块图:端口服务:输入要侦听的端口,默认为8888;启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并开始聊天;停止服务:关闭服务器,侦听结束。

客户端用户不能再聊天;发送系统消息:服务器端给所有人或者个别用户发送消息。

消息显示:可以显示所有用户的聊天记录,和上线、下线信息。

退出服务器:退出程序,并停止服务;(2)聊天室客户端模块图:用户设置:用户可以设置自己的用户名进行聊天;连接设置:用户可以设置自己的服务器的IP地址和端口号,默认的连接地址为:127.0.0.1:8888;用户登录:只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置;用户注销:退出聊天,可以继续修改用户设置和连接设置;发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息;退出:关闭所有聊天并退出客户端。

2、流程图五.主要类UML关系图:聊天室服务端主要包括7个文件,它们的功能如下:(1)ChatServer.java:包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。

调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。

(2)ServerListen.java:该类实现服务端用户上线与下线的侦听。

该类对用户上线下线的侦听是通过调用用户链表类(UserLinkList)来实现的,当用户上线与下线情况发生变化时,该类会对主类的界面进行相应的修改。

(3)ServerReceive.java:该类是实现服务器端的消息的收发的类。

该类分别定义了向某用户及所有人发送消息的方法,发送的消息会显示在主界面类的界面上。

(4)PortConf.java:该类继承自JDialog,是用户对服务器端侦听端口进行修改配置的类。

(5)Node.java:用户链表的节点类,定义了链表中的用户。

该类与前面所讲的链表节点Node类的功能相当。

(6)UserLinkList.java:用户链表节点的具体实现类。

该类通过构造函数构造用户链表,定义了添加用户,删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这5个方法。

(7)Help.java:服务端程序的帮助类。

聊天室客户端主要包括5个文件,它们的功能如下:(1)ChatClient.java:包含名为ChatClient的public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。

该类定义了Connect()与DisConnect()方法实现与服务器的连接与断开连接。

当登录到指定的服务器时,调用ClientReceive类实现消息收发,同时该类还定义了SendMessage()方法来向其他用户发送带有表情的消息或者悄悄话。

(2)ClientReceive.java:该类是实现服务器端与客户端消息收发的类。

(3)ConnectConf.java:该类继承自JDialog,是用户对所要连接的服务器IP及侦听端口进行修改配置的类。

(4)UserConf.java:该类继承自JDialog,是用户对连接到服务器所显示的用户名进行修改配置的类。

(5)Help.java:客户端程序的帮助类。

六.主要程序代码清单和注释说明:******************ChatServer.java****************************************public void actionPerformed(ActionEvent e) {Object obj = e.getSource();if (obj == startServer || obj == startItem) { //启动服务端startService();}else if (obj == stopServer || obj == stopItem) { //停止服务端int j=JOptionPane.showConfirmDialog(this,"真的停止服务吗?","停止服务",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j == JOptionPane.YES_OPTION){stopService();}}else if (obj == portSet || obj == portItem) { //端口设置//调出端口设置的对话框PortConf portConf = new PortConf(this);portConf.show();}else if (obj == exitButton || obj == exitItem) { //退出程序int j=JOptionPane.showConfirmDialog(this,"真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);if (j == JOptionPane.YES_OPTION){stopService();System.exit(0);}}else if (obj == helpItem) { //菜单栏中的帮助//调出帮助对话框Help helpDialog = new Help(this);helpDialog.show();}else if (obj == sysMessage || obj == sysMessageButton) { //发送系统消息sendSystemMessage();}}/*** 启动服务端*/public void startService(){try{serverSocket = new ServerSocket(port,10);messageShow.append("服务端已经启动,在"+port+"端口侦听...\n");startServer.setEnabled(false);startItem.setEnabled(false);portSet.setEnabled(false);portItem.setEnabled(false);stopServer .setEnabled(true);stopItem .setEnabled(true);sysMessage.setEnabled(true);}catch (Exception e){//System.out.println(e);}userLinkList = new UserLinkList();listenThread = new ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);listenThread.start();}/*** 关闭服务端*/public void stopService(){try{//向所有人发送服务器关闭的消息sendStopToAll();listenThread.isStop = true;serverSocket.close();int count = userLinkList.getCount();int i =0;while( i < count){Node node = userLinkList.findUser(i);node.input .close();node.output.close();node.socket.close();i ++;}stopServer .setEnabled(false);stopItem .setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);sysMessage.setEnabled(false);messageShow.append("服务端已经关闭\n");combobox.removeAllItems();combobox.addItem("所有人");}catch(Exception e){//System.out.println(e);}}/*** 向所有人发送服务器关闭的消息*/public void sendStopToAll(){int count = userLinkList.getCount();int i = 0;while(i < count){Node node = userLinkList.findUser(i);if(node == null) {i ++;continue;}try{node.output.writeObject("服务关闭");node.output.flush();}catch (Exception e){//System.out.println("$$$"+e);}i++;}}/*** 向所有人发送消息*/public void sendMsgToAll(String msg){int count = userLinkList.getCount();//用户总数int i = 0;while(i < count){Node node = userLinkList.findUser(i);if(node == null) {i ++;continue;}try{node.output.writeObject("系统信息");node.output.flush();node.output.writeObject(msg);node.output.flush();}catch (Exception e){//System.out.println("@@@"+e);}i++;}sysMessage.setText("");}/*** 向客户端用户发送消息*/public void sendSystemMessage(){String toSomebody = combobox.getSelectedItem().toString();String message = sysMessage.getText() + "\n";messageShow.append(message);//向所有人发送消息if(toSomebody.equalsIgnoreCase("所有人")){sendMsgToAll(message);}else{//向某个用户发送消息Node node = userLinkList.findUser(toSomebody);try{node.output.writeObject("系统信息");node.output.flush();node.output.writeObject(message);node.output.flush();}catch(Exception e){//System.out.println("!!!"+e);}sysMessage.setText("");//将发送消息栏的消息清空}}public static void main(String[] args) {ChatServer app = new ChatServer();}}************************ServerListen.java: *************************** public class ServerListen extends Thread {ServerSocket server;JComboBox combobox;JTextArea textarea;JTextField textfield;UserLinkList userLinkList;//用户链表Node client;ServerReceive recvThread;public boolean isStop;/** 聊天服务端的用户上线于下线侦听类*/public ServerListen(ServerSocket server,JComboBox combobox,JTextArea textarea,JTextField textfield,UserLinkList userLinkList){this.server = server;bobox = combobox;this.textarea = textarea;this.textfield = textfield;erLinkList = userLinkList;isStop = false;}public void run(){while(!isStop && !server.isClosed()){try{client = new Node();client.socket = server.accept();client.output = new ObjectOutputStream(client.socket.getOutputStream());client.output.flush();client.input = new ObjectInputStream(client.socket.getInputStream());ername = (String)client.input.readObject();//显示提示信息combobox.addItem(ername);userLinkList.addUser(client);textarea.append("用户 " + ername + " 上线" + "\n");textfield.setText("在线用户" + userLinkList.getCount() + "人\n");recvThread = new ServerReceive(textarea,textfield,combobox,client,userLinkList);recvThread.start();}catch(Exception e){}}}}********************************ServerReceive.java***********************/** 服务器收发消息的类*/public class ServerReceive extends Thread {JTextArea textarea;JTextField textfield;JComboBox combobox;Node client;UserLinkList userLinkList;//用户链表public boolean isStop;public ServerReceive(JTextArea textarea,JTextField textfield,JComboBox combobox,Node client,UserLinkList userLinkList){this.textarea = textarea;this.textfield = textfield;this.client = client;erLinkList = userLinkList;bobox = combobox;isStop = false;}public void run(){//向所有人发送用户的列表sendUserList();while(!isStop && !client.socket.isClosed()){try{String type = (String)client.input.readObject();if(type.equalsIgnoreCase("聊天信息")){String toSomebody = (String)client.input.readObject();String status = (String)client.input.readObject();String action = (String)client.input.readObject();String message = (String)client.input.readObject();String msg = ername+" "+ action+ "对 "+ toSomebody+ " 说 : "+ message+ "\n";if(status.equalsIgnoreCase("悄悄话")){msg = " [悄悄话] " + msg;}textarea.append(msg);if(toSomebody.equalsIgnoreCase("所有人")){sendToAll(msg);//向所有人发送消息}else{try{client.output.writeObject("聊天信息");client.output.flush();client.output.writeObject(msg);client.output.flush();}catch (Exception e){//System.out.println("###"+e);}Node node = userLinkList.findUser(toSomebody);if(node != null){node.output.writeObject("聊天信息");node.output.flush();node.output.writeObject(msg);node.output.flush();}}}else if(type.equalsIgnoreCase("用户下线")){Node node = userLinkList.findUser(ername);userLinkList.delUser(node);String msg = "用户 " + ername + " 下线\n";int count = userLinkList.getCount();combobox.removeAllItems();combobox.addItem("所有人");int i = 0;while(i < count){node = userLinkList.findUser(i);if(node == null) {i ++;continue;}combobox.addItem(ername);i++;}combobox.setSelectedIndex(0);textarea.append(msg);textfield.setText("在线用户" + userLinkList.getCount() + "人\n");sendToAll(msg);//向所有人发送消息sendUserList();//重新发送用户列表,刷新break;}}catch (Exception e){//System.out.println(e);}}}/** 向所有人发送消息*/public void sendToAll(String msg){int count = userLinkList.getCount();int i = 0;while(i < count){Node node = userLinkList.findUser(i);if(node == null) {i ++;continue;}try{node.output.writeObject("聊天信息");node.output.flush();node.output.writeObject(msg);node.output.flush();}catch (Exception e){//System.out.println(e);}i++;}}/** 向所有人发送用户的列表*/public void sendUserList(){String userlist = "";int count = userLinkList.getCount();int i = 0;while(i < count){Node node = userLinkList.findUser(i);if(node == null) {i ++;continue;}userlist += ername;userlist += '\n';i++;}i = 0;while(i < count){Node node = userLinkList.findUser(i);if(node == null) {i ++;continue;}try{node.output.writeObject("用户列表");node.output.flush();node.output.writeObject(userlist);node.output.flush();}catch (Exception e){//System.out.println(e);}i++;}}}*************************PortConf.java*********************************** /*** 生成端口设置对话框的类*/public class PortConf extends JDialog {JPanel panelPort = new JPanel();JButton save = new JButton();JButton cancel = new JButton();public static JLabel DLGINFO=new JLabel(" 默认端口号为:8888");JPanel panelSave = new JPanel();JLabel message = new JLabel();public static JTextField portNumber ;public PortConf(JFrame frame) {super(frame, true);try {jbInit();}catch (Exception e) {e.printStackTrace();}//设置运行位置,使对话框居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation( (int) (screenSize.width - 400) / 2 + 50,(int) (screenSize.height - 600) / 2 + 150);this.setResizable(false);}private void jbInit() throws Exception {this.setSize(new Dimension(300, 120));this.setTitle("端口设置");message.setText("请输入侦听的端口号:");portNumber = new JTextField(10);portNumber.setText(""+ChatServer.port);save.setText("保存");cancel.setText("取消");panelPort.setLayout(new FlowLayout());panelPort.add(message);panelPort.add(portNumber);panelSave.add(new Label(" "));panelSave.add(save);panelSave.add(cancel);panelSave.add(new Label(" "));Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout());contentPane.add(panelPort, BorderLayout.NORTH);contentPane.add(DLGINFO, BorderLayout.CENTER);contentPane.add(panelSave, BorderLayout.SOUTH);//保存按钮的事件处理save.addActionListener(new ActionListener() {public void actionPerformed (ActionEvent a) {int savePort;try{savePort=Integer.parseInt(PortConf.portNumber.getText());if(savePort<1 || savePort>65535){PortConf.DLGINFO.setText(" 侦听端口必须是0-65535之间的整数!");PortConf.portNumber.setText("");return;}ChatServer.port = savePort;dispose();}catch(NumberFormatException e){PortConf.DLGINFO.setText(" 错误的端口号,端口号请填写整数!");PortConf.portNumber.setText("");return;}}});//关闭对话框时的操作this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent e){DLGINFO.setText(" 默认端口号为:8888");}});//取消按钮的事件处理cancel.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){DLGINFO.setText(" 默认端口号为:8888");dispose();}});}}**********************Node.java***************************************** /*** 用户链表的结点类*/public class Node {String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;Node next = null;}**************************UserLinkList.java***************************** /*** 用户链表*/public class UserLinkList {Node root;Node pointer;int count;/*** 构造用户链表*/public UserLinkList(){root = new Node();root.next = null;pointer = null;count = 0;}/*** 添加用户*/public void addUser(Node n){pointer = root;while(pointer.next != null){pointer = pointer.next;}pointer.next = n;n.next = null;count++;}/*** 删除用户*/public void delUser(Node n){pointer = root;while(pointer.next != null){if(pointer.next == n){pointer.next = n.next;count --;break;}pointer = pointer.next;}}/*** 返回用户数*/public int getCount(){return count;}/*** 根据用户名查找用户*/public Node findUser(String username){if(count == 0) return null;pointer = root;while(pointer.next != null){pointer = pointer.next;if(ername.equalsIgnoreCase(username)){ return pointer;}}return null;}/*** 根据索引查找用户*/public Node findUser(int index){if(count == 0) {return null;}if(index < 0) {return null;}pointer = root;int i = 0;while(i < index + 1){if(pointer.next != null){pointer = pointer.next;}else{return null;}i++;}return pointer;}}**************************Help.java************************************* /*** 生成设置对话框的类*/public class Help extends JDialog {JPanel titlePanel = new JPanel();JPanel contentPanel = new JPanel();JPanel closePanel = new JPanel();JButton close = new JButton();JLabel title = new JLabel("聊天室服务端帮助");JTextArea help = new JTextArea();Color bg = new Color(255,255,255);public Help(JFrame frame) {super(frame, true);try {jbInit();}catch (Exception e) {e.printStackTrace();}//设置运行位置,使对话框居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();this.setLocation( (int) (screenSize.width - 400) / 2,(int) (screenSize.height - 320) / 2);this.setResizable(false);}private void jbInit() throws Exception {this.setSize(new Dimension(400, 200));this.setTitle("帮助");titlePanel.setBackground(bg);;contentPanel.setBackground(bg);closePanel.setBackground(bg);help.setText("1、设置服务端的侦听端口(默认端口为8888)。

相关文档
最新文档