JAVA聊天室(参考实现)

合集下载

本科毕业论文-基于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的聊天室系统设计与实现
Absr c : n o o k ti ewo k p o r mmig it ra e T i a e nto u e h c a im t a t Wi d ws S c e sa n t r r g a n ne fc . h sp p ri r d c d t e me h n s
户端根据输入 Sr r I e e 的 P地址连入相应的服务器参与聊天活动, v 服务器上显示当前在线的用户信
息 , 对用户进 入或 断开 的信 息加 以显示。 并 关键词 :aa 接 字 ; Jv 套 聊天 室 ; 户端 ; 客 服务器
D I 码 : .9 9 ii n 1 0 2 7 .0 0 0 . 1 O编 1 3 6 /.s . 0 2— 2 9 2 1 .5 0 9 0 s
中图分 类号 :P 9 T 33
文献标识 码 : A
文章编号 :0 2— 2 9 2 1 )5— 0 6— 2 10 2 7 (0 0 O 0 6 0
De in & I lme to a y t m a e n J v c e sg mpe n fCh tS se B s d o a a So k t
ci t o n c dwt cm a besr r n ie h tn codn eI f e e i ut .nte l n cn et i o p t l ev dj ndcat gacri t t Po r r n t d I h e e h i ea o i goh sv p e
H ig j g L a g h n U J — i ,U M n — og n n
( u a io i l n l t m ca i l o t h i, h nsa4 0 2 ,hn ) H n nBo gc dEe r eh n a le n C a gh 1 16 C i l aa co c P yc c a

用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课程设计聊天室(含代码)

Java程序课程设计任务书JAVA聊天室的系统的设计与开发1.主要内容:用JAVA实现基于C/S模式的聊天室系统。

聊天室分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的信息,客户端需要登陆到服务器端才可以实现正常的聊天功能。

2.具体要求(包括技术要求等):系统的功能要求:A.服务器端主要功能如下:1.在特定端口上进行侦听,等待客户端连接。

2.用户可以配置服务器端的侦听端口,默认端口为8888。

3.向已经连接到服务器端的用户发送系统消息。

4.统计在线人数。

5.当停止服务时,断开所有的用户连接。

B.客户端的主要功能如下:1.连接到已经开启聊天服务的服务器端。

2.用户可以配置要连接的服务器端的IP地址和端口号。

3.用户可以配置连接后显示的用户名。

4.当服务器端开启的话,用户可以随时登录和注销。

5.用户可以向所有人或某一个人发送消息。

学习并掌握一下技术:Java JavaBean 等熟练使用一下开发工具:Eclipse, JCreator 等实现系统上诉的功能。

3.进度安排:12月28日 ~ 12月29日:课程设计选题,查找参考资料12月30日 ~ 1月1日:完成系统设计1月2日 ~ 1月5日:完成程序代码的编写1月6日:系统测试与完善1月7日:完成课程设计报告,准备答辩4.主要参考文献:[1].张广彬孟红蕊张永宝.Java课程设计(案例精编)[M].清华大学出版社.2007年版摘要在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,例如,国外的ICQ、国内腾讯公司开发的OICQ。

基于Java网络编程的强大功能,本次毕业设计使用Java编写一个聊天系统。

一般来说,聊天工具大多数由客户端程序和服务器程序外加服务器端用于存放客户数据的数据库组成,本系统采用客户机/服务器架构模式通过Java提供的Soket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能用多线程可完成多点对多点的聊天,数据库管理系统用SQL Server2000完成并通过JDBC-ODBC桥访问数据库。

使用Java和WebSocket实现网页聊天室实例代码

使用Java和WebSocket实现网页聊天室实例代码

使⽤Java和WebSocket实现⽹页聊天室实例代码在没介绍正⽂之前,先给⼤家介绍下websocket的背景和原理:背景在浏览器中通过http仅能实现单向的通信,comet可以⼀定程度上模拟双向通信,但效率较低,并需要服务器有较好的⽀持; flash中的socket 和xmlsocket可以实现真正的双向通信,通过 flex ajax bridge,可以在javascript中使⽤这两项功能. 可以预见,如果websocket⼀旦在浏览器中得到实现,将会替代上⾯两项技术,得到⼴泛的使⽤.⾯对这种状况,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。

在JavaEE7中也实现了WebSocket协议。

原理WebSocket protocol 。

现很多⽹站为了实现即时通讯,所⽤的技术都是轮询(polling)。

轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给客户端的浏览器。

这种传统的HTTP request 的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然⽽HTTP request 的header是⾮常长的,⾥⾯包含的有⽤数据可能只是⼀个很⼩的值,这样会占⽤很多的带宽。

⽽⽐较新的技术去做轮询的效果是Comet – ⽤了AJAX。

但这种技术虽然可达到全双⼯通信,但依然需要发出请求。

在 WebSocket API,浏览器和服务器只需要做⼀个握⼿的动作,然后,浏览器和服务器之间就形成了⼀条快速通道。

两者之间就直接可以数据互相传送。

在此WebSocket 协议中,为我们实现即时服务带来了两⼤好处:1. Header互相沟通的Header是很⼩的-⼤概只有 2 Bytes2. Server Push服务器的推送,服务器不再被动的接收到浏览器的request之后才返回数据,⽽是在有新数据时就主动推送给浏览器。

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

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

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

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

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

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

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

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

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

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

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

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

根据目前使用聊天室的用户需求显示,用户对于聊天室主要有以下几点要求:(1). 与聊天室成员一起聊天,可以与聊天室成员私聊(3). 可以改变聊天内容风格,用户注册(含头像)、登录(4). 服务器,服务器过滤非法内容。

(5). 服务器发送通知,保存服务器日志,保存用户聊天信息。

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

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

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

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

(6)、系统消息:服务端运行,为每一个用户都能接收服务器端发送的信息提示信息。

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

(8)、用户剔除:用户可以被系统剔除,并重新登记登录名和地址。

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

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

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

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

(1) 聊天室服务端模块图:聊天室服务端模块图 4-1-1 端口服务:输入要侦听的端口,默认为8888。

启动服务:启动服务器,并开始在设置的端口中侦听,客户端用户可以登录并聊天。

停止服务:关闭服务器,侦听结束。

客户端用户不能再聊天。

发送系统消息:服务器端给所有人或者个别用户发送消息。

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

退出服务器:退出程序,并停止服务。

(2)聊天室客户端4-1-2用户设置:用户可以设置自己的用户名进行聊天。

连接设置:用户可以设置自己的服务器的IP,端口号,默认地址为:127.0.0.1:8888。

用户登录:只能在聊天室服务端已开启的情况下,用户才能登录,用户登录之后才能开始聊天,登录后不能再修改用户设置和连接设置。

用户注销:退出聊天,可以继续修改用户设置和连接设置。

发送和接收聊天信息:用户可以给所有人或者个别用户发送信息,并能看到其他用户发送给自己或所有人的消息。

退出:关闭所有聊天并退出客户端。

2.流程图流程图4-1-33.主要类UML关系图:1、聊天室服务器端设计:聊天室服务端主要包括4个文件,它们的功能如下:(1)AppServer .java 服务器端进行监听客户端进行服务器的启动,以及端客户进行处理用户退出。

(2)ServerFrame 为服务器端管理界面,负责用户帐号信息保存和用户在线的状态和相关服务器端口的信息以及访问的方式。

(3)serverChat.java 负责对用户信息的处理包括公聊和私聊的信息的发送以及将聊天信息的序列化对象填加到保存聊天信息的记事本中。

(4)serverMessage.java该类是实现服务器端的消息的收发的类。

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

(5)Register.java处理用户注册, 用户登录,进行选择自己喜欢的头像和注册相应的信息聊天室客户端主要包括6个文件,其主要功能如下:(1).ChatClient.java 为客户端程序启动类,负责客户端的启动和退出。

(2).Login.java 为客户端程序登录界面,负责用户帐号信息的验证与反馈。

(3).Register.java 为客户端程序注册界面,负责用户帐号信息的注册验证与反馈。

(4).ChatRoom.java 为客户端程序聊天室主界面,负责接收、发送聊天内容与服务器端的Connection.java 亲密合作。

(5).Windowclose 为ChatRoom.java的内部类,负责监听聊天室界面的操作,当用户退出时返回给服务器信息。

(6).Clock.java 为客户端程序的一个小程序,实现的一个石英钟功能。

六.主要程序代码清单和界面展示:1.服务器的启动画面以及相应的代码:public class AppServer extends Thread {private ServerSocket serverSocket;private ServerFrame sFrame;private static Vector userOnline = new Vector(1, 1)private static Vector v = new Vector(1, 1);创建服务器启动服务监听8888端口public AppServer() {sFrame = new ServerFrame();try {serverSocket = new ServerSocket(8888);// 获取服务器的主机名和IP地址InetAddress address = InetAddress.getLocalHost();sFrame.txtServerName.setText(address.getHostName());sFrame.txtIP.setText(address.getHostAddress());sFrame.txtPort.setText("8888");} catch (IOException e) {fail(e, "不能启动服务!");}sFrame.txtStatus.setText("已启动...");this.start(); // 启动线程}public static void fail(Exception e, String str) {System.out.println(str + " 。

" + e);}//监听客户的请求,当有用户请求时创建 Connection线程//public void run() {try {while (true) {// 监听并接受客户的请求Socket client = serverSocket.accept();new Connection(sFrame, client, userOnline, v); // 支持多线程// System.out.println("userLength:"+userLength)}} catch (IOException e) {fail(e, "不能监听!");}}//启动服务器//public static void main(String args[]) {new AppServer();}}2.客户端管理界面如下:服务器端图 6-1-13.用户的注册信息主要如下代码:public class Register extends JFrame implements ActionListener {private JComboBox comboBox;private static final long serialVersionUID = 9019746127517522180L;JPanel pnlRegister;JLabel lblUserName,lblGender,lblAge;JLabel lblPassword,lblConfirmPass,lblEmail,logoPosition;JTextField txtUserName,txtAge,txtEmail;JPasswordField pwdUserPassword,pwdConfirmPass;JRadioButton rbtnMale,rbtnFemale;ButtonGroup btngGender;JButton btnOk,btnCancel,btnClear;String strServerIp;final JLabel headLabel = new JLabel();//用于将窗口用于定位Dimension scrnsize;Toolkit toolkit=Toolkit.getDefaultToolkit(); //构造方法public Register(String ip){super("[HappyChat]聊天室注册窗口");strServerIp=ip;pnlRegister=new JPanel();this.getContentPane().add(pnlRegister);lblUserName=new JLabel("用户名:");lblGender=new JLabel("性别:");lblAge=new JLabel("年龄:");lblPassword=new JLabel("密码:");lblConfirmPass=new JLabel("确认密码:");lblEmail=new JLabel("电子邮件:");txtUserName=new JTextField(30);txtEmail=new JTextField(30);txtAge=new JTextField(10);pwdUserPassword=new JPasswordField(30);pwdConfirmPass=new JPasswordField(30);rbtnMale=new JRadioButton("男",true);rbtnFemale=new JRadioButton("女");btngGender=new ButtonGroup();btnOk=new JButton("确定(O)");btnOk.setMnemonic('O');btnOk.setToolTipText("保存注册信息");btnCancel=new JButton("返回(B)");btnCancel.setMnemonic('B');btnCancel.setToolTipText("返回登录窗口");btnClear=new JButton("清空(L)");btnClear.setMnemonic('L');btnClear.setToolTipText("清空注册信息");try{//连接到服务器Socket toServer;toServer = new Socket(strServerIp,8888);ObjectOutputStream streamToServer=new ObjectOutputStream (toServer.getOutputStream());//写客户详细资料到服务器socketstreamToServer.writeObject((Register_Customer)data);//读来自服务器socket的登陆状态BufferedReader fromServer=new BufferedReader(new InputStreamReader(toServer.getInputStream()));String status=fromServer.readLine();//显示成功消息JOptionPane op=new JOptionPane();op.showMessageDialog(null,status);if(status.equals(data.custName+"注册成功")){txtUserName.setText("");pwdUserPassword.setText("");pwdConfirmPass.setText("");txtAge.setText("");txtEmail.setText("");}//关闭流对象streamToServer.close();fromServer.close();}catch(InvalidClassException e1){JOptionPane.showMessageDialog(null,"类错误!");}catch(NotSerializableException e2){JOptionPane.showMessageDialog(null,"对象未序列化!");}catch(IOException e3){JOptionPane.showMessageDialog(null,"不能写入到指定服务器!");}} //方法register()结束public static void main(String args[]){new Register("127.0.0.1");}} //class Register 结束聊天注册窗口图6-1-24.聊天室登录主要代码:// Title: HappyChat聊天系统登录程序////Description: 根据指定的服务器地址、用户名和密码登录聊天服务器// public class Login extends JFrame implements ActionListenerprivate static final long serialVersionUID = -8965773902056088264Lprivate JPanel pnlLogin;private JButton btnLogin, btnRegister, btnExit;private JLabel lblServer, lblUserName, lblPassword, lblLogo; private JTextField txtUserName, txtServer;private JPasswordField pwdPassword;private String strServerIp;// 用于将窗口定位private Dimension scrnsize;private Toolkit toolkit = Toolkit.getDefaultToolkit()// 构造登陆窗体//public Login() {super("登录[HappyChat]聊天室");pnlLogin = new JPanel();this.getContentPane().add(pnlLogin);lblServer = new JLabel("服务器(S):");lblUserName = new JLabel("用户名(U):");lblPassword = new JLabel("密码(P):");txtServer = new JTextField(20);txtServer.setText("127.0.0.1");txtUserName = new JTextField(20);pwdPassword = new JPasswordField(20);btnLogin = new JButton("登录(L)");btnLogin.setToolTipText("登录到服务器");btnLogin.setMnemonic('L');btnRegister = new JButton("注册(R)");btnRegister.setToolTipText("注册新用户");btnRegister.setMnemonic('R');btnExit = new JButton("退出(X)");btnExit.setToolTipText("退出系统");btnExit.setMnemonic('X');// 设置登录窗口setResizable(false);setSize(340, 260);setVisible(true);scrnsize = toolkit.getScreenSize();setLocation(scrnsize.width / 2 - this.getWidth() / 2, scrnsize.height / 2 - this.getHeight() / 2);Image img = toolkit.getImage("images\\appico.jpg");= ae.getSource();if (source.equals(btnLogin)) {// 判断用户名和密码是否为空if (txtUserName.getText().equals("")|| pwdPassword.getText().equals("")) {JOptionPane op1 = new JOptionPane();op1.showMessageDialog(null, "用户名或密码不能为空");} else {strServerIp = txtServer.getText();login();}}if (source.equals(btnRegister)) {strServerIp = txtServer.getText();this.dispose();new Register(strServerIp);}if (source == btnExit) {System.exit(0);}} // actionPerformed()结束// 登录事件响应方法//@SuppressWarnings("deprecation")public void login() {// 接受客户的详细资料Customer data = new Customer();data.custName = txtUserName.getText();data.custPassword = pwdPassword.getText();try {// 连接到服务器Socket toServer;toServer = new Socket(strServerIp, 8888);ObjectOutputStream streamToServer = new ObjectOutputStream(toServer.getOutputStream());// 写客户详细资料到服务器socketstreamToServer.writeObject((Customer) data);// 读来自服务器socket的登录状态BufferedReader fromServer = new BufferedReader(new InputStreamReader(toServer.getInputStream()));String status = fromServer.readLine();if (status.equals("登录成功")) {new ChatRoom((String) data.custName, strServerIp);this.dispose();// 关闭流对象streamToServer.close();fromServer.close();toServer.close();} else {JOptionPane.showMessageDialog(null, status);// 关闭流对象streamToServer.close();fromServer.close();toServer.close();}} catch (ConnectException e1) {JOptionPane.showMessageDialog(null, "未能建立到指定服务器的连接!");} catch (InvalidClassException e2) {JOptionPane.showMessageDialog(null, "类错误!");} catch (NotSerializableException e3) {JOptionPane.showMessageDialog(null, "对象未序列化!");} catch (IOException e4) {JOptionPane.showMessageDialog(null, "不能写入到指定服务器!");}} // login()结束// 启动登陆窗体public static void main(String args[]) {new Login();}} // Class Login结束5.聊天室登录界面:6.聊天界面代码:public class ChatRoom extends Thread implements ActionListener {private JComboBox daXiaoComboBox;private JComboBox yangShiComboBox;private JComboBox zitiComboBox;private JComboBox emote;static JFrame frmChat;JPanel pnlChat;JButton btnCls, btnExit, btnSend, btnClear, btnSave, btnTimer; JLabel lblUserList, lblUserMessage, lblSendMessage, lblChatUser; JLabel lblUserTotal, lblCount, lblBack;JTextField txtMessage;java.awt.List lstUserList;TextArea taUserMessage;JComboBox cmbUser;JCheckBox chPrivateChat;String strServerIp, strLoginName;Thread thread;final JLabel headLabel = new JLabel();// 构造方法public ChatRoom(String name, String ip) {// Dialog d = new FontDialog();strServerIp = ip;strLoginName = name;frmChat = new JFrame("聊天室" + "[用户:" + name + "]");pnlChat = new JPanel();frmChat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frmChat.getContentPane().add(pnlChat);Font fntDisp1 = new Font("宋体", Font.PLAIN, 12);String list[] = { "所有人" };btnCls = new JButton("清屏(C)");btnExit = new JButton("退出(X)");btnSend = new JButton("发送(N)");btnSave = new JButton("保存(S)");btnTimer = new JButton("时钟(T)");lblUserList = new JLabel("【在线用户列表】");lblUserMessage = new JLabel("【聊天信息】");lblSendMessage = new JLabel("聊天内容:");lblChatUser = new JLabel("你对:");lblUserTotal = new JLabel("在线人数:");lblCount = new JLabel("0");lstUserList = new java.awt.List();txtMessage = new JTextField(170);cmbUser = new JComboBox(list);// chenmincmbUser.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent arg0) { freshHead();}});chPrivateChat = new JCheckBox("私聊");taUserMessage = new TextArea("", 300, 200,TextArea.SCROLLBARS_VERTICAL_ONLY);// 只能向下滚动// taUserMessage.setText("aaaaaa汉字aaaa");taUserMessage.setForeground(new Color(0, 0, 0));taUserMessage.setEditable(false); // 不可写入emote.setModel(new DefaultComboBoxModel(new String[] { "表情", "微笑","甜笑", "惊喜", "嘻嘻", "扮酷", "嘿嘿", "傻笑", "好奇", "媚眼", "鬼脸", "陶醉","想想" }));emote.setBounds(141, 301, 60, 23);pnlChat.add(emote);zitiComboBox = new JComboBox();zitiComboBox.addItemListener(new ItemListener() {public void itemStateChanged(ItemEvent arg0) {freshFont();boolean isFirstLogin = true; // 判断是否刚登陆boolean isFound; // 判断是否找到用户Vector user_exit = new Vector();try {// Socket toServer;// toServer = new Socket(strServerIp, 8888);for (;;) {Socket toServer;toServer = new Socket(strServerIp, 8888);// 将信息发往服务器messobj = new Message();ObjectOutputStream streamtoserver = new ObjectOutputStream(toServer.getOutputStream());streamtoserver.writeObject((Message) messobj);// 收来自服务器的信息ObjectInputStream streamfromserver = new ObjectInputStream(toServer.getInputStream());messobj = (Message) streamfromserver.readObject();// //////刷新聊天信息列表//////////if (isFirstLogin) // 如果刚登陆{intMessageCounter = messobj.chat.size(); // 屏蔽该用户登陆前的聊天内容isFirstLogin = false;}if (strLoginName.equals(messobj.ti)) {// taUserMessage.append("ni bei ti");exitChatRoom();JOptionPane.showMessageDialog(null, strLoginName+ "你被管理员剔除!");}if (!serverMessage.equals(messobj.serverMessage)) {serverMessage = messobj.serverMessage;taUserMessage.append("[系统消息]:" + serverMessage+"\n");}// taUserMessage.setText("");for (int i = intMessageCounter; i < messobj.chat.size(); i++) {Chat temp = (Chat) messobj.chat.elementAt(i);// chenminString emote = temp.emote;if (emote.equals("表情")) {emote = "";} else {emote += "地";}String temp_message;if (temp.chatUser.equals(strLoginName)) {if (temp.chatToUser.equals(strLoginName)) {temp_message = "系统提示您:请不要自言自语!" + "\n";} else {if (!temp.whisper) // 不是悄悄话{temp_message = "【你】对【" + temp.chatToUser + "】"+ emote + "说:" + temp.chatMessage+ "\n";} else {temp_message = "【你】悄悄对【" + temp.chatToUser+ "】" + emote + "说:" + temp.chatMessage+ "\n";}}} else {基于JAVA的聊天室的设计与实现计算机072 周蔓 0708140822if (temp.chatToUser.equals(strLoginName)) {if (!temp.whisper) // 不是悄悄话{temp_message = "【" + temp.chatUser + "】对【你】"+ emote + "说:" + temp.chatMessage+ "\n";} else {temp_message = "【" + temp.chatUser + "】悄悄对【你】"+ emote + "说:" + temp.chatMessage+ "\n";}{temp_message = "【" + temp.chatUser + "】对【"+ temp.chatToUser + "】" + emote+ "说:" + temp.chatMessage + "\n";} else {temp_message = "";}} else {temp_message = "";}}}taUserMessage.append(temp_message);intMessageCounter++;}// //////刷新在线用户//////////lstUserList.clear();for (int i = 0; i < erOnLine.size(); i++) {String User = ((Customer) erOnLine.elementAt(i)).custName;lstUserList.addItem(User);}Integer a = new Integer(erOnLine.size());lblCount.setText(a.toString());// 显示用户进入聊天室的信息if (erOnLine.size() > intUserTotal) {// chenminString tempstr = ((Customer) erOnLine.elementAt(erOnLine.size() - 1)).custName;// String tempstr = erOnLine.elementAt(// erOnLine.size() - 1).toString();if (!tempstr.equals(strLoginName)) {taUserMessage.append("【" + tempstr + "】来了" + "\n");}}// 显示用户离开聊天室的信息if (erOnLine.size() < intUserTotal) {for (int b = 0; b < user_exit.size(); b++) {isFound = false;for (int c = 0; c < erOnLine.size(); c++) {String tempstr = ((Customer) user_exit.elementAt(b)).custName;if (tempstr.equals(((Customer) erOnLine.elementAt(c)).custName)) {isFound = true;break;}}if (!isFound) // 没有发现该用户{String tempstr = ((Customer) user_exit.elementAt(b)).custName;if (!tempstr.equals(strLoginName)) {taUserMessage.append("【" + tempstr + "】走了"+ "\n");}}}} catch (Exception e) {@SuppressWarnings("unused")JOptionPane jop = new JOptionPane();JOptionPane.showMessageDialog(null, "不能连接服务器!");e.printStackTrace();frmChat.dispose();// System.out.println();// System.out.println(e.getMessage());}} // run()结束private void exitChatRoom() {// TODO 自动生成方法存根exit();}try {Socket toServer = new Socket(strServerIp, 1001);// 向服务器发送信息ObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream());outObj.writeObject(exit);outObj.close();toServer.close();frmChat.dispose();// this.destroy();} catch (Exception e) {}} // exit()结束// "发送"按钮public void sendMessage() {Chat chatobj = new Chat();chatobj.chatUser = strLoginName;chatobj.chatMessage = txtMessage.getText();chatobj.chatToUser = String.valueOf(cmbUser.getSelectedItem());chatobj.whisper = chPrivateChat.isSelected() ? true : false;chatobj.emote = emote.getSelectedItem().toString();// 向服务器发送信息try {Socket toServer = new Socket(strServerIp, 8888);ObjectOutputStream outObj = new ObjectOutputStream(toServer.getOutputStream());outObj.writeObject(chatobj);txtMessage.setText(""); // 清空文本框outObj.close();toServer.close();} catch (Exception e) {}} // sendMessage()结束// "保存"按钮public void saveMessage() {try {FileOutputStream fileoutput = new FileOutputStream(this.strLoginName + "_message.txt", true);String temp = taUserMessage.getText();// System.out.println(temp);fileoutput.write(temp.getBytes());fileoutput.close();JOptionPane.showMessageDialog(null, "聊天记录保存在" + this.strLoginName+ "_message.txt");} catch (Exception e) {System.out.println(e);}}// 将所选用户添加到cmbUser中public void changeUser() {boolean key = true;String selected = lstUserList.getSelectedItem();// JOptionPane.showMessageDialog(null, selected);for (int i = 0; i < cmbUser.getItemCount(); i++) { if (selected.equals(cmbUser.getItemAt(i))) {key = false;break;}}if (key == true) {cmbUser.insertItemAt(selected, 0);}String head = getUserHead(lstUserList.getSelectedItem()); // JOptionPane.showMessageDialog(null, head);cmbUser.setSelectedItem(selected);// chenminheadLabel.setIcon(new ImageIcon("face//" + head + ".JPG")); } // changeUser()结束// chenminprotected void freshHead() {// TODO 自动生成方法存根String head = getUserHead(cmbUser.getSelectedItem().toString());// JOptionPane.showMessageDialog(null, head);// cmbUser.setSelectedItem(selected);// chenminheadLabel.setIcon(new ImageIcon("face//" + head + ".JPG"));}// chenminprivate String getUserHead(String selectedItem) {// TODO 自动生成方法存根String head = "oo";for (int i = 0; i < erOnLine.size(); i++) {String User = ((Customer) erOnLine.elementAt(i)).custName;head = ((Customer) erOnLine.elementAt(i)).custHead;// System.out.println(User+":"+head);if (User.equals(selectedItem)) {break;}// lstUserList.addItem(User);}return head;}public static void main(String args[]) {new ChatRoom("测试用户", "127.0.0.1");基于JAVA的聊天室的设计与实现计算机072 周蔓 0708140822 }}参考资料:Merlin Hughes Michael Shoffner《Java网络编程实例》清华大学出版社耿祥义张跃平《JA V A 2 实用教程》清华大学出版社张辉潭浩强《JA V A 程序设计》清华大学出版社30。

相关文档
最新文档