JAVA聊天程序实验报告.docx
- 文档编号:4809326
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:41
- 大小:3.36MB
JAVA聊天程序实验报告.docx
《JAVA聊天程序实验报告.docx》由会员分享,可在线阅读,更多相关《JAVA聊天程序实验报告.docx(41页珍藏版)》请在冰豆网上搜索。
JAVA聊天程序实验报告
网络聊天程序实验报告
组长:
xxxPB09210xxx
其他组员:
无
实验内容
用面向对象程序设计方法编写一个网络聊天程序。
程序的功能是允许处在网络上不同结点的多个用户进行文字聊天。
最基本的要求是实现一对一的聊天,即最多只允许两个人在线。
也可以实现多人同时聊天,即在线的任何一个用户输入的文字,其他的人都能立即收到。
建议采用 Socket通讯方式。
实验实现
(1)概要设计:
GAGA聊天程序实现结构图:
........
.......
注:
图中粗箭头表示信息传递
图解:
在客户端着一端:
每一个客户端登录时候,先向服务器发送一个登录名的信息,向服务器注册这个客户端,然后进入群聊窗口,可以直接在群聊窗口中发送群聊的信息,也可以点击在线用户,打开私聊窗口,向相应用户私聊。
群聊,私聊的消息发送给服务器,服务器再把这些消息广播给所有客户端,每个客户端对接受的消息进行识别:
要是群聊消息则放到群聊窗口里面;要是私聊信息,检查是不是给自己的私聊信息,要是给自己的,显示到相应私聊窗口上,要是没有相应私聊窗口则创建那个私聊窗口;要是不是自己的私聊消息则无视这个消息
在服务器这一端:
每一个客户端与服务器建立连接时候,就为它建立一个CreatServerThread的线程类,用来专门处理这个客户端。
服务器每当接收到消息后就使用Broadcast线程类进行广播,直到消息列表里面的消息发送完为止。
Broadcast是通过查找CreatServerThread线程类的数组,找到每个CreatServerThread线程类,也就找到每个客户端,再逐个发送消息
(2)详细设计:
实验实现代码结构
客户端:
(每种颜色代表一个类)
packageClient;
//主类message_frame,用来创建message_frame_to类
publicclassmessage_frame
{
publicstaticvoidmain(Stringargs[])
{//主函数,创建message_frame_to类,调用其构造函数
message_frame_tom=newmessage_frame_to();
}
}//主类message_frame结束
//类message_frame_to,用于创建客户端群聊窗口,与服务器连接,接发消息
classmessage_frame_toextendsKeyAdapterimplementsActionListener
{
publicmessage_frame_to()
{//构造函数,调用其他函数
Frame();//建立主框架
Text();//建立文本域
Label();//建立标签域
Button();//建立按钮域
online_users();//建立在线用户列表
DlogD=newDlog();//建立登陆界面
Client();//连接服务器函数
}
//建立主框架函数
publicstaticvoidFrame()
{}
//文本域函数
publicstaticvoidText()
{}
//标签域函数
publicstaticvoidLabel()
{}
//按钮函数
publicvoidButton()
{}
//按钮监听函数
publicvoidactionPerformed(ActionEvente)
{}
//输入框键盘监听函数,支持CTRL+ENTER快捷键发送消息
publicvoidkeyReleased(KeyEvente)
{}
//在线列表函数
publicvoidonline_users()
{}
//服务器建立连接与接收数据函数
publicintClient()
{}
//群聊信息发送函数
publicvoidsend()
{}
//延迟函数,用来解决需要延迟执行问题
publicstaticvoiddeley(intms)
{}
//抖屏函数
publicvoidshake()
{}
}//类message_frame_to结束
//私聊窗口类(线程派生类),每点击一个用户进行私聊时候,就创建一个对应的私聊窗口
classframeextendsThreadimplementsActionListener
{
//构造函数
publicframe(Strings)
{
send_name=s;
start();
}//构造函数结束
//run函数,用来构造私聊窗口
publicvoidrun()
{}
//私聊窗口按钮监听执行器函数
publicvoidactionPerformed(ActionEvente)
{}
//私聊消息发送函数
publicvoidsend_one()
{}
//私聊窗口信息显示函数
publicvoidwrite(Stringinn)
{}
}//私聊窗口类结束
//登录界面类,用来构造登录界面
classDlogextendsFrameimplementsActionListener
{
//构造函数,创建登录窗口界面
publicDlog()
{}
//登录窗口按钮监听执行器函数
publicvoidactionPerformed(ActionEvente)
{}
}//登录界面类结束
//音乐播放类,可以播放wav格式音乐
classPlayWav
{
//构造函数
publicPlayWav(Stringsoun)
{}
//播放函数
publicvoidplay()
{}
}//音乐播放类结束
服务器:
(Server为最大类,内部包含两个子类以用不同颜色表明)
packageServer;
//主类Server,是整个服务器的类
publicclassServerextendsServerSocketimplementsActionListener
{
//主函数
publicstaticvoidmain(String[]args)throwsIOException
{
newServer();//调用Server构造函数
}
//Sever函数,用来监听客户端连接
publicServer()throwsIOException
{}
//服务器的界面设计window函数
publicvoidwindow()
{}
//服务器GUI上按钮监听执行器函数
publicvoidactionPerformed(ActionEvente)
{}
//广播类(线程派生类),用来广播消息
classBroadcastextendsThread
{
publicBroadcast()
{
start();
}
//run函数,广播消息
publicvoidrun()
{}
}//广播类结束
//客户端线程类,每个对应一个客户端
classCreateServerThreadextendsThread
{
//构造函数
publicCreateServerThread(Sockets)throwsIOException
{}
//负责接收客户端发来的消息
publicvoidrun()
{}
publicvoidsendMessage(Stringmsg)
{//发送消息函数,保证发送给这个线程对应的客户端}
}//线程类CreateServerThread结束
}//主类Server结束
程序运行与使用说明
(1)打开服务器
运行Server.java,输入密码0911001,按下start按钮,文本域会出现红色的"TheServerisworking"字符串,表示服务器已经开始工作,要是密码输入不正确会提示"Thepasswordiswrong",重新输入正确的密码才能打开服务器,具体截图如下:
(2)登入客户端
运行message_frame.java,首先会跳出登录界面,输入用户名,点击sure按钮登录:
登录之后就会进入主聊天窗口,它可以支持群聊,可以看到主窗口分为:
输入框InputArea,信息框MessageArea,当前客户端用户名User,在线用户名列表OnlineUser,发送按钮Send,信息框清屏按钮Clear,抖屏按钮Shake
群聊:
在输入框中输入“你们好,我是卡卡”,按CTRL+ENTER键直接发送(也可以按Send按钮发送)
继续群聊:
私聊:
比如现在“卡卡”找“劳尔”私聊,可以直接点击主窗口在线列表里面的“劳尔”的名字,会弹出私聊窗口
在私聊窗口输入信息,点击发送即可和“劳尔”私聊,此时劳尔也会跳出一个对“卡卡”的私聊窗口
“劳尔”也可以对“卡卡”进行私聊
然后在用户退出时候会有在线列表更新,例如“罗比尼奥”退出:
注:
在用户登入,退出时候都会有提示音提醒在线的所有用户,在用户有消息到来时候会有消息提示音
软件特色:
GAGA聊天软件,支持群聊,私聊;支持CTRL+ENTER快捷键发送(群聊);支持清屏,抖屏功能 ; 界面清新 ;服务器管理便捷 ; 使用方便等许多优点
实验总结:
本次的上机作业,收获颇大,以前对面向对象语言只是只懂语法,没有接受太多的编程训练,这个实验代码量较大,很好的训练的面向对象编程方式的能力,也自己摸索了很多过去没有去看得东西,比如Java的音乐播放,socket聊天这些之前不太了解的东西 另外在GUI设计上面也是花了很多功夫,界面布局,各种功能器件的使用诸如此类的东西,总之,通过这次实验学习了很多新东西,也锻炼了很多老知识
代码:
/*客户端程序:
message_frame.java
*创建者:
xxxPB09210xxx
*创建时间:
2011年11月26日
*联系方式:
xxx
*版本信息:
version2.0
**/
packageClient;
importjava.awt.*;
importjavax.swing.ImageIcon;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.event.ListSelectionEvent;
importjavax.swing.event.ListSelectionListener;
import.*;
importjava.io.*;
importjava.util.*;
importjavax.sound.sampled.AudioFormat;
importjavax.sound.sampled.AudioInputStream;
importjavax.sound.sampled.AudioSystem;
importjavax.sound.sampled.DataLine;
importjavax.sound.sampled.SourceDataLine;
importjava.io.File;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
//主类message_frame
publicclassmessage_frame
{
publicstaticvoidmain(Stringargs[])
{//主函数,创建message_frame_to类,调用其构造函数
message_frame_tom=newmessage_frame_to();
}
}//主类message_frame结束
//***************************************************************************************************************************************************************************************
//**************************************************************类message_frame_to,用于创建客户端窗口,与服务器连接,接发消息********************************************
classmessage_frame_toextendsKeyAdapterimplementsActionListener
{
staticJFramef=newJFrame("GAGA2.0");
staticImageIconicon=newImageIcon("C:
\\scan5.jpg");//聊天窗口皮肤背景
staticpublicJLabelpanel=newJLabel(icon);
publicstaticJTextAreatext_input=newJTextArea();
publicstaticTextAreatext_message=newTextArea();
publicstaticLabellabel_4=newLabel("User:
");
Buttonb=newButton("Send");
Buttonbc=newButton("Clear");
Buttonbl=newButton("Shake");
publicstaticDefaultListModellistModel=newDefaultListModel();
publicstaticJListUser_List=newJList(listModel);//显示用户列表,支持私聊
publicstaticStringUserName=newString("");//当前客户端登陆账户
publicstaticSocketsocket;
publicstaticBufferedReaderin;
publicstaticPrintWriterout;
publicstaticArrayListframe_Threader=newArrayList();//私聊窗口列表
publicstaticCalendarnow;
//构造函数,调用其他所有函数
publicmessage_frame_to()
{
Frame();//建立主框架
Text();//建立文本域
Label();//建立标签域
Button();//建立按钮域
online_users();//建立在线用户列表
DlogD=newDlog();//建立登陆界面
Client();//连接服务器函数
}//构造函数结束
//建立主框架函数
publicstaticvoidFrame()
{
f.setLayout(null);
f.setBounds(300,200,600,500);
f.setBackground(Color.gray);
f.setResizable(false);
f.setVisible(false);
panel.setBounds(0,0,600,500);
f.add(panel);
f.addWindowListener
(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)//当点击关闭按钮时候,退出客户端
{
out.println("#");
System.exit(0);
}
}
);
}//主框架函数结束
//文本域函数
publicstaticvoidText()
{
text_input.setBounds(10,400,400,100);
text_input.setBackground(Color.white);
text_input.setVisible(true);
text_input.setFont(newFont("宋体",Font.BOLD,22));
text_input.setForeground(Color.blue);
text_message.setBounds(10,70,400,300);
text_message.setBackground(Color.white);
text_message.setVisible(true);
text_message.setFont(newFont("宋体",Font.BOLD,20));
text_message.setForeground(Color.blue);
text_message.setEditable(false);
text_message.selectAll();
panel.add(text_input);
panel.add(text_message);
}//文本域函数结束
//标签域函数
publicstaticvoidLabel()
{
Labellabel_1=newLabel("InputArea");
Labellabel_2=newLabel("MessageArea");
Labellabel_3=newLabel("OnlineUser");
label_1.setBounds(10,370,360,30);
label_1.setBackground(Color.gray);
label_1.setVisible(true);
label_1.setFont(newFont("黑体",Font.BOLD,20));
label_1.setForeground(Color.black);
label_2.setBounds(10,40,400,30);
label_2.setBackground(Color.gray);
label_2.setVisible(true);
label_2.setFont(newFont("黑体",Font.BOLD,16));
label_2.setForeground(Color.black);
label_3.setBounds(450,85,120,30);
label_3.setBackground(Color.gray);
label_3.setVisible(true);
label_3.setFont(newFont("黑体",Font.BOLD,16));
label_3.setForeground(Color.black);
label_4.setBounds(450,40,120,30);
label_4.setBackground(Color.gray);
label_4.setVisible(true);
label_4.setFont(newFont("黑体",Font.BOLD,12));
label_4.setForeground(Color.black);
panel.add(label_1);
panel.add(label_2);
panel.add(label_3);
panel.add(label_4);
}//标签域函数结束
//按钮函数
publicvoidButton()
{
b.setBounds(450,440,100,30);
b.setBackground(Color.LIGHT_GRAY);
b.setVisible(true);
b.setFont(newFont("隶书",Font.BOLD,20));
b.setForeground(Color.black);
panel.add(b);
b.addActionListener(this);
bc.setBounds(450,400,100,30);
bc.setBackground(Color.LIGHT_GRAY);
bc.setVisible(true);
bc.setFont(newFont("隶书",Font.BOLD,20));
bc.setForeground(Color.black);
panel.add(bc);
bc.addActionListener(this);
bl.setBounds(370,370,40,30);
bl.setBackground(Color.LIGHT_GRAY);
bl.setVisible(true);
bl.setFont(newFont("隶书",Font.BOLD,10));
bl.setForeground(Color.black);
panel.add(bl);
bl.addActionListener(this);
text_input.addKeyListener(this);
}//按钮函数结束
//按钮监听函数
publicvoidactionPerformed(ActionEvente)
{
if(e.getSource()==b)
{
send();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 聊天 程序 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)