利用JAVA实现简单聊天室.docx

上传人:b****4 文档编号:5411924 上传时间:2022-12-16 格式:DOCX 页数:27 大小:105.57KB
下载 相关 举报
利用JAVA实现简单聊天室.docx_第1页
第1页 / 共27页
利用JAVA实现简单聊天室.docx_第2页
第2页 / 共27页
利用JAVA实现简单聊天室.docx_第3页
第3页 / 共27页
利用JAVA实现简单聊天室.docx_第4页
第4页 / 共27页
利用JAVA实现简单聊天室.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

利用JAVA实现简单聊天室.docx

《利用JAVA实现简单聊天室.docx》由会员分享,可在线阅读,更多相关《利用JAVA实现简单聊天室.docx(27页珍藏版)》请在冰豆网上搜索。

利用JAVA实现简单聊天室.docx

利用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

作用:

服务器启动

继承的接口名:

ActionListener

publicclassServerimplementsActionListener{

定义的对象:

count//记录点机关闭按钮次数2次关闭

soconly//只有SOCKET,用于群发

sockets//所有客户的SOCKET

socket_thread//Socket所在的线乘,用于退出;

frame//定义主窗体

panel//定义面板

start,stop//启动和停止按钮

主要成员方法:

publicvoidcenter//定义小程序查看器的位置

publicvoidactionPerformed//定义处理异常机制

定义子类:

serverRun,Details

继承的父类名:

Thread

classserverRunextendsThread//启线乘用于接收连入的Socket

classDetailsextendsThread//具体处理消息的线乘,只管发送消息

创建一个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

作用:

用户注册登录

继承的接口名:

ActionListener

publicclassLogInimplementsActionListener

定义的对象:

Title//定义标题

Name//提示输入姓名,添加注册信息

Send//提示点击“进入”,进入聊天室

构造方法:

publicLogIn()

(3)客户端:

创建一个socket对象,用于连接服务器。

用socket创建流。

通过流和服务器进行交互。

交互完毕,将流和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类。

首先运行启动服务器的文件Server.java,运行结果如下:

图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=newObjectOutputStream(s.getOutputStream());

out.writeObject("系统消息-----"+name+"用户进入"+"------");}

Vectorv=getList();

Iteratorj=soconly.iterator();

while(j.hasNext()){

Sockets=(Socket)j.next();

ObjectOutputStreamout=newObjectOutputStream(s.getOutputStream());

out.writeObject(v);

System.out.println("服务器发送用户列表进入");}

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+"离开\n");

socket.close();

soconly.remove(socket);

sockets.remove(content);

Iteratori=soconly.iterator();

while(i.hasNext()){

Sockets=(Socket)i.next();

out=newObjectOutputStream(s.getOutputStream());

out.writeObject("系统消息-----"+content+"用户离开"+"------");}

Vectorv=getList();

Iteratorj=soconly.iterator();

while(j.hasNext()){

Sockets=(Socket)j.next();

ObjectOutputStreamout=newObjectOutputStream(s.getOutputStream());

out.writeObject(v);

System.out.println("服务器发送用户列表离开");

}

}

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.java

packageChat;

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;

BufferedReade

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1