利用JAVA实现简单聊天室.docx
《利用JAVA实现简单聊天室.docx》由会员分享,可在线阅读,更多相关《利用JAVA实现简单聊天室.docx(26页珍藏版)》请在冰点文库上搜索。
利用JAVA实现简单聊天室
利用JAVA实现简单聊天室
1.设计思路
Java是一种简单的,面向对象的,分布式的,解释的,键壮的,安全的,结构中立的,可移植的,性能很优异的,多线程的,动态的语言。
而且,Java很小,整个解释器只需215K的RAM。
因此运用JAVA程序编写聊天室,实现简单聊天功能。
程序实现了聊天室的基本功能,其中有:
(1)启动服务器:
实现网络的连接,为注册进入聊天室做准备。
(2)注册登陆界面:
填写基本信息如姓名等,可以供多人进入实现多人聊天功能。
(3)发送信息:
为用户发送信息提供平台。
(4)离开界面:
使用户退出聊天室。
(5)关闭服务器:
断开与网络的连接,彻底退出聊天室。
2.设计方法
在设计简单聊天室时,需要编写5个Java源文件:
Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。
3程序功能图及程序相关说明
(1)主功能框图
(2)聊天室基本功能表
序号
文件名
主要功能
1
ServerHost
被服务器调用
2
Client
显示聊天室
3
ClientUser
被客户端调用
4
LogIn
注册登陆
5
Objecting
连接服务器
6
Server
启动服务器
4.程序代码是说明程序中引入的包:
packageChat;import.*;importjava.awt.*;importjava.awt.event.*;importjavax.swing.*;importjava.util.*;
importjava.io.*;
(1)服务器端代码中用户自定义类:
类名:
Server
作用:
服务器启动
继承的接口名:
ActionListenerpublicclassServerimplementsActionListener{定义的对象:
count//记录点机关闭按钮次数2次关闭
创建一个ServerSocket对象,用于接受指定端口客户端的信息ServerSocketserver=newServerSocket("1234");接受请求时候,通过accept()方法,得到一个socket对象。
Socketsocket=server.accept();通过socket创建流(输入,输出)。
BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()))
DataInputStreamdis=newDataInputStream(socket.getInputStream());
PrintWriterout=newPrintWriter(socket.getOutputStream());通过流,来和客户交互。
(2)用户注册代码中相关类:
类名:
LogIn
作用:
用户注册登录
继承的接口名:
ActionListenerpublicclassLogInimplementsActionListener
定义标题
提示输入姓名,添加注册信息提示点击“进入”,进入聊天室
定义的对象:
Title//
Name//
Send//
构造方法:
publicLogIn()
(3)客户端:
1创建一个socket对象,用于连接服务器
2用socket创建流。
3通过流和服务器进行交互。
4交互完毕,将流和socket关闭
(4)聊天室:
类名:
Client
作用:
实现发送即时信息继承的接口名:
ActionListener
publicclassClientimplementsActionListener
构造方法:
publicClient(Stringname2)
异常处理:
publicvoidactionPerformed(ActionEvente)
publicvoidconnect()
publicvoidactionPerformed(ActionEvente)
定义的子类:
ClientSocket
继承的父类:
Thread
classClientSocketextendsThread()5.设计结果与分析
5个Java源文件:
Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。
分别编译这5个Java源文件,或运行“javac*.java”命令,编译全部的源文件,然后运行连接服务器的主类,即运行Server类。
连接完毕后在运行注册的主函数类,即运行LogIn类。
图1服务器启动成功
结果分析:
在进入聊天室之前必须先启动服务器,实现服务器端的连接为用户的登录打开“窗口”。
其次运行用户注册登录文件LogIn.java,运行结果如下:
图2用户登陆界面
结果分析:
添加用户信息,输入用户姓名,为用户进入聊天室提供关口。
并且利
用以下语句实现如图3的界面JLabeltitle=newJLabel("免注册版");
JLabelname=newJLabel("输入姓名");
JButtonsend=newJButton("进入");添加注册信息后点击“进入”按钮,结果如图3
图3显示用户已登录
结果分析:
当服务器启动用户完成信息注册时,在服务期端的界面中会显示当前在线的人员,并且提示客户已连接到服务器,可以进行聊天行为。
图4显示聊天内容
结果分析:
多个用户进入聊天室之后,用户可以在发送信息的文本框里填写自己的内容,点击“发送信息”按钮,信息会出现在上方的区域内,在界面的右方还可以显示在线人员的姓名,另在线用户可以知道有谁在聊天室内。
聊天结束点击“离开”按钮,结果如图5所示:
图5离开聊天室
点击服务器中的“停止”按钮,结果如图6.图7.所示:
图6点击“停止”按钮
图7终止与服务器端连接结果分析:
用户聊天结束点击“离开”按钮之后会在服务器端的界面上自动显示该用户已离开,提时、示服务器执行相关行为。
离开界面:
使用户退出聊天室;关闭服务器:
断开与网络的连接,彻底退出聊天室。
6.语句实现
(1)Server.java
packageChat;
import.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
importjava.io.*;
publicclassServerimplementsActionListener{
intcount=0;
Vectorsoconly=newVector();
HashMapsockets=newHashMap();
HashMapsocket_thread=newHashMap();
ServerSocketserversocket;
JFrameframe;
JTextAreaarea=newJTextArea();
JPanelpanel=newJPanel();
JButtonstart=newJButton("启动");
JButtonstop=newJButton("停止");
publicServer(){
panel.add(start);
panel.add(stop);
frame.add(panel,BorderLayout.NORTH);frame.add(area,BorderLayout.CENTER);
frame.pack();
center();
frame.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);frame.setVisible(true);
start.addActionListener(this);
stop.addActionListener(this);
System.out.println("new");
}
publicvoidcenter(){
Toolkittoolkit=Toolkit.getDefaultToolkit();
Dimensione=toolkit.getScreenSize();
intx=e.width/2-(int)(frame.getSize().getWidth()/2);
inty=e.height/2-(int)(frame.getSize().getHeight()/2);
frame.setLocation(x,y);
}
publicvoidactionPerformed(ActionEvente){
JButtonbtn=(JButton)e.getSource();
if(btn==start){serverRunserverrun=newserverRun();System.out.println("gogo");serverrun.start();
}
if(btn==stop){
try{
Iteratori=soconly.iterator();
while(i.hasNext()){
Sockets=(Socket)i.next();
ObjectOutputStreamout=newObjectOutputStream(s.getOutputStream());
Objectingbj=newObjecting();
out.writeObject("系统消息服务器马上关闭!
!
!
!
!
!
请马上关
闭客户端");
}
count++;if(count==2){System.exit(0);
}
JOptionPane.showMessageDialog(frame,"已通知客户端,请再次点击关闭按钮关闭");
}catch(Exceptionex){ex.printStackTrace();}
}
}
classserverRunextendsThread{
publicvoidrun(){try{
System.out.println("开始SERVERRUN");serversocket=newServerSocket(55555);area.append("服务器启动\n");
start.setEnabled(false);while(true){
Socketsocket=serversocket.accept();
System.out.println("连接成功");
BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()));
Stringname=br.readLine();
area.append("服务器接收用户"+name+"的连接\n");soconly.add(socket);
Iteratori=soconly.iterator();
while(i.hasNext()){
Sockets=(Socket)i.next();//获得其他SOCKET的通信口ObjectOutputStreamout=new
Detailsd=newDetails(socket);
socket_thread.put(name,d);
d.start();
}
}catch(Exceptione){e.printStackTrace();}
}}
classDetailsextendsThread{
booleanalive=true;
ObjectInputStreamin;
ObjectOutputStreamout;
Socketsocket;
Details(Socketsocket){
this.socket=socket;
publicvoidrun(){
while(alive){
try{
in=newObjectInputStream(socket.getInputStream());
Objectingobjecting=(Objecting)in.readObject();
Stringname=objecting.getKey();
Stringcontent=objecting.getValue();
if(name.equalsIgnoreCase("all")){
Iteratori=soconly.iterator();
while(i.hasNext()){
Sockets=(Socket)i.next();
out=newObjectOutputStream(s.getOutputStream());
out.writeObject(content);
System.out.println("Send");
}}
if(name.equalsIgnoreCase("exit")){
Detailsthread=(Details)socket_thread.get(content);
thread.alive=false;
area.append(content+"socket.close();soconly.remove(socket);sockets.remove(content);Iteratori=soconly.iterator();while(i.hasNext()){
离开\n");
Sockets=(Socket)i.next();
out=newObjectOutputStream(s.getOutputStream());out.writeObject("
系统消息"+content+"
用户离开
"+"");}
Vectorv=getList();
Iteratorj=soconly.iterator();
while(j.hasNext()){
Sockets=(Socket)j.next();
ObjectOutputStream
ObjectOutputStream(s.getOutputStream());
out.writeObject(v);
System.out.println("
}
}
out
new
服务器发送用户列表离开
");
if(!
name.equalsIgnoreCase("all")&!
name.equalsIgnoreCase("exit")){
area.append("处理私聊信息");Sockets=(Socket)sockets.get(name);
out=newObjectOutputStream(s.getOutputStream());out.writeObject(content);
}catch(Exceptione){e.printStackTrace();}
}}}
publicVectorgetList(){
Vectorv=newVector();
Setset=sockets.keySet();
Iteratori=set.iterator();
while(i.hasNext()){
v.add(i.next());
}
returnv;
}
publicstaticvoidmain(Stringargs[]){
newServer();}}
(2)Objecting.java
packageChat;
importjava.io.Serializable;
publicclassObjectingimplementsSerializable{
Stringkey;
Stringvalue;
publicObjecting(){}
publicObjecting(Stringkey,Stringvalue){
this.key=key;
this.value=value;}
publicvoidsetKey(Stringkey){
this.key=key;}
publicvoidsetValue(Stringvalue){
this.value=value;}
publicStringgetKey(){
returnkey;}
publicStringgetValue(){
returnvalue;}}
(3)LogIn.javapackageChat;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
publicclassLogInimplementsActionListener{
JFrameframe;
JLabeltitle=newJLabel("免注册版");
JPanelbanner=newJPanel();
JTextFieldtext=newJTextField(10);
JPanelbody=newJPanel();
JPanelbuttom=newJPanel();
JLabelname=newJLabel("输入姓名");
JButtonsend=newJButton("进入");
publicLogIn(){
frame=newJFrame("注册");frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);banner.add(title);
body.add(name);
body.add(text);
buttom.add(send);
frame.add(banner,BorderLayout.NORTH);frame.add(body,BorderLayout.CENTER);frame.add(buttom,BorderLayout.SOUTH);frame.pack();
center();
frame.setVisible(true);
send.addActionListener(this);}
publicvoidcenter(){
Toolkittoolkit=Toolkit.getDefaultToolkit();
Dimensione=toolkit.getScreenSize();
intx=e.width/2-(int)(frame.getSize().getWidth()/2);
inty=e.height/2-(int)(frame.getSize().getHeight()/2);frame.setLocation(x,y);}
publicvoidactionPerformed(ActionEvente){if(text.getText().equals("")){JOptionPane.showMessageDialog(frame,"姓名不能为空");
return;}else{newClient(text.getText());frame.dispose();}}publicstaticvoidmain(Stringargs[]){newLogIn();}}
(4)ClientUser.java
packageChat;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
import.*;
importjava.io.*;
publicclassClientUserextendsWindowAdapterimplementsActionListener,Runnable{publicJFramejf;
publicJTextFieldjt;
publicJTextFieldname;
publicJButtonconnect;
publicJScrollPanejsp;
publicJTextAreajta;
publicJButtonjb;publicJLabell;Socketsoc;InputStreamsoc_in;OutputStreamsoc_out;BufferedReaderBsoc_in;PrintWriterPsoc_out;
publicClientUser(){jf=newJFrame("ClientChatRoom");jta=newJTextArea(10,30);jta.setEditable(false);jsp=new
JScrollPane(jta,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
jt=newJTextField(30);name=newJTextField(5);
l=newJLabel("Pleaseinputyourname");
connect=newJButton("Connect");connect.addActionListener(this);jt.addActionListener(this);jb=newJButton("SendTheMessage");jb.addActionListener(this);JPaneljp=newJPanel();
JPaneljp2=newJPanel();jp.setLayout(newFlowLayout());jp.add(jt);
jp.add(jb);
jp2.add(l);jp2.add(name);jp2.add(connect);
Containerc=jf.getContentPane();c.setLayout(newGridBagLayout());GridBagConstraintsgbc=newGridBagConstraints();gbc.gridx=0;
gbc.gridy=0;c.add(jp2,gbc);
gbc.g