JAVA聊天工具设计
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
目录
1. 需求分析 ………………………………………………………………………1 2. 概要设计 ……………………………………………………………………….2 2.1 功能图 …………………………………..……………………………………..2 3. 详细设计 ………………………………………………………………………2 3.1 类关系图 ………………………………………………………………………2 3.2 类设计图 ………………………………………………………………………3 3.2.1、类client …………………………………………………………………3 3.2.2、类RTFSend…………………………………………………………………4 3.2.3、类RTFReceive ……………………………………………………………4 3.2.4、类Server …………………………………………………………………5 3.2.5、类YeeKuMap ………………………………………………………………5 3.2.6、类ServerThread …………………………………………………………6 3.2.8、类ClinetThread …………………………………………………………6 4. 主要程序实现………………………………………………………………….7 5. 测试与结果 ………………………………………………………………….16 5.1功能模块界面 .……………………………………………………………….16 6.
心得
信息技术培训心得 下载关于七一讲话心得体会关于国企改革心得体会关于使用希沃白板的心得体会国培计划培训心得体会
体会 …………………………………………………………………….22 参考文献…………………………………………………………………………..23
嘉兴学院 Java综合实训报告
聊天小程序
1. 需求分析
聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客服机/服务器架构模式。通过Java提供的Socket类来连接客户机和服务器并使客户机与服务器之间相互通信。由于聊天是多点对多点的而Java提供的多线程功能,用多线程可完成多点对多点的聊天。
主要有两个应用程序,分别为服务器程序和客户端程序。服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
的显示和信息输入。采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。该聊天系统实现私聊,群聊,用户登陆,退出聊天系统等功能。
本系统的主要功能有以下几个部分组成:
服务器端模块:
系统信息的输入:可以输入任何信息;
功能:将系统信息广播至各个客户端;
踢除用户:服务器可以选择性删除在线的用户;
客户端模块:
登陆服务器
列出当前在线用户信息;
私聊和多人聊天的选择;
发言:对输入的数据进行发送;
离开状态;
1
嘉兴学院 Java综合实训报告 2. 概要设计
2.1 功能图
图1.程序功能图 3. 详细设计
3.1 类关系图
2
嘉兴学院 Java综合实训报告
RTFSend
-bin : bin-bout-socket+socket()ClientThread+run() : void结束2-br结束1+ClientThread() : voidClient+getRealMsg() : string-SERNER : int+run() : void-jfc-keyIn : string1..11..1-listModelRTFReceive-peopleList-receiveServer-ps-socket-SERVER_PORT : int-socket+RTFReceive() : RTFReceive1..1-clients : int-userName : string+run() : void-kick1..1+Frame() : void-ss+actionPerformed() : void1..1+Server() : Server+closeRs() : void1..1+init() : void+init() : void+main() : void+main() : void1..11..11..11..1ServerThreadYeekumAP-br-ps+put() : void-socket+getKeyByVALUE()+ServerThreaad()+removeByValue() : void+getRealMsg() : string(idl)+run() : void
图2:类关系图 3.2 类设计图
3.2.1、类client
模块名称 Client
启动客户端系统 功能描述
SERNER:int
Jfc
接口与属性
Peoplrlist
Ps
keyIn:string
3
嘉兴学院 Java综合实训报告
Frame():void
userName:string
Function:启动客户端
InPut: 无
OutPut: 无
Return:空
public Client()
windowClosing(WindowEvent e)
mouseClicked(MouseEvent e)
InPut:
OutPut:
Return:
void closeSocket()
Function: 退出时,关闭 Socket 3.2.2、类RTFSend
模块名称 RTFSend
功能描述 信息发送
Bin
Bout
接口与属性 Socket
Socket
Run():void
3.2.3、类RTFReceive 模块名称 RTFReceive
信息接收 功能描述
void run()
Function: 运行多线程 接口与属性 InPut: 无
OutPut: 无
Return: 空
4
嘉兴学院 Java综合实训报告
3.2.4、类Server
模块名称 server
功能描述 启动服务器端
void main(String args[])
Function: 启动服务器端 接口与属性 InPut: 无
OutPut: 无
Return: 空
server()
Function:
InPut: 无
OutPut: 无
Return: 空
void closeSocket()
Function: 设置关闭socket
InPut: 无
OutPut: 无
Return: 空
void gonggao(int a,String s)
Function:
InPut: 无
OutPut: 无
Return: 空
String chakan(String name)
Return: name/null
void del(String tmp)
Return: 空
3.2.5、类YeeKuMap 模块名称 YeeKuMap
功能描述 按钮事件的处理
Put():void
getkeyByVALLE 接口与属性 actionPerformed(ActionEvent e)
Function:
InPut:
OutPut:
Return:
5
嘉兴学院 Java综合实训报告
3.2.6、类ServerThread 模块名称 ServerThread 功能描述 负责所有客户的接待
Br
接口与属性 PS
SS
void run()
Function: 运行该线程
InPut: 无
OutPut: 无
Return:空
3.2.7、类ClinetThread 模块名称 ClinetThread 功能描述 处理每一个连接上的客户
ClinetThread(Socket sc)
Br
接口与属性 getRESTmeg()viod
InPut: 无
OutPut: 无
Return:空
String getLogName()
InPut: 无
OutPut: 无
Return:空
void run()
Function: 运行该线程
InPut: 无
OutPut: 无
Return:空
6
嘉兴学院 Java综合实训报告
4. 主要程序实现
客户端:
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.List;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
import javax.swing.*;
import java.util.*;
public class Client extends JFrame implements ActionListener{
private static final int SERVER_PORT = 30000;
private Socket socket;
private PrintStream ps;
private BufferedReader brServer;
private JFileChooser jfc;
private String keyIn;
public static DefaultListModel listModel = new DefaultListModel(); //
ListModel对象
private static JList peopleList;
Button button1=new Button("发送");
static Button button2=new Button("私聊");
static Button button3=new Button("发送文件");
static JCheckBox jcb = new JCheckBox("私聊");
String userName = null;
//JButton sendflie=null;
static TextArea txtA1=new TextArea();
//static List list1 = null;
static TextArea txtA2 = new TextArea();
//JTextArea txtA2=null;
public void Frame(){
JFrame frame=new JFrame("客户端:聊天窗口");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container pane=frame.getContentPane();
pane.setLayout(null);
frame.setLocation(320, 240);
frame.setSize(500,500);
frame.setVisible(true);
7
嘉兴学院 Java综合实训报告
// TextArea txtA1=new TextArea ();
Client.txtA1.setBounds(10, 10, 370,300);
//TextArea Client.txtA2=new TextArea();
Client.txtA2.setBounds(10, 340, 370, 80);
/* List list2=new List();
list2.setBounds(400, 10,90,300);*/
peopleList = new JList(listModel);
peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选
JScrollPane ListScrollPane = new JScrollPane(peopleList);
Client.peopleList.setBounds(400, 10,90,300);
// List list3=new List();
// list3.setBounds(400, 340, 90, 120);
// Button button3=new Button("发送文件");
button3.setBounds(405,350,50,20);
button3.addActionListener(this);
// Button button1=new Button("发送");
jcb.setBounds(160, 430, 80, 40);
//
button1.setBounds(240,440,30,20);
button1.addActionListener(this);
// Button button2=new Button("私聊");
button2.setBounds(300,440, 30, 20);
button2.addActionListener(this);
pane.add(txtA1);
pane.add(txtA2);
pane.add(peopleList);
// pane.add(list1);
//pane.add(list2);
// pane.add(list3);
pane.add(jcb);
pane.add(button1);
pane.add(button2);
pane.add(button3);
}
8
嘉兴学院 Java综合实训报告
/*public static void main(String[] args) {
Frame frame1=new Frame();//
//Frame frame2=new Frame();
frame1.gost();*/
/*setVisible(true);
setBounds(400,100,600,500);
Container con= getContentPane();
con.setVisible(true);
con.setLayout(new FlowLayout());
txtA1=new JTextArea(15,45);
listModel = new DefaultListModel();
peopleList = new JList(listModel);
peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选
JScrollPane ListScrollPane = new JScrollPane(peopleList);
txtA2=new JTextArea(5,45);
yesBt=new JButton("确定发送");
yesBt.addActionListener(this);
cancelBt=new JButton("发送文件");
cancelBt.addActionListener(this);
//fr.add(btnSend);
// fr.setSize(200,200);
//fr.setVisible(true);
// 为发送按钮注册事件
cancelBt.addActionListener(this);
add(new JLabel("客户端:"));
con.add(new JLabel("聊天内容:"));
con.add(txtA1);
add(ListScrollPane, BorderLayout.EAST);
con.add(txtA2);
con.add(cancelBt);
con.add(yesBt);
// this.addWindowListener(this);
validate();
con.validate();
//server=SocketSever(); */
public void init(Client client){
9
嘉兴学院 Java综合实训报告
try
{
//初始化代表键盘的输入流
//keyIn = this.txtA2.getText();
//keyIn = new BufferedReader(new InputStreamReader(System.in));
//连接到服务器
socket = new Socket("127.0.0.1", SERVER_PORT);
//获取该Socket对应的输入流和输出流
ps = new PrintStream(socket.getOutputStream());
brServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String tip = "";
//采用循环不断地弹出对话框要求输入用户名
while(true){
client.userName = JOptionPane.showInputDialog(tip + "输入用户名");
//将用户输入的用户名的前后增加
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
字符串后发送
ps.println(YeekuProtocol.USER_ROUND + userName+ YeekuProtocol.USER_ROUND);
//读取服务器的响应
String result = brServer.readLine();
//如果用户重复,开始下次循环
/*if(result.equals(userName)){
Client.listModel.addElement(userName);
}*/
if (result.equals(YeekuProtocol.NAME_REP)){
tip = "用户名重复~请重新";
continue;
}
//如果服务器返回登录成功,结束循环
if (result.equals(YeekuProtocol.LOGIN_SUCCESS)){
client.Frame();
//Client.listModel.addElement(userName);
break;
}
}
}
//捕捉到异常,关闭网络资源,并退出该程序
10
嘉兴学院 Java综合实训报告
catch (UnknownHostException ex){
System.out.println("找不到远程服务器,请确定服务器已经启动~");
closeRs();
System.exit(1);
}catch (IOException ex){
System.out.println("网络异常~请重新登录~");
closeRs();
System.exit(1);
}
//以该Socket对应的输入流启动ClientThread线程
new ClientThread(brServer).start();
}
//定义一个读取键盘输出,并向网络发送的方法
/*private void readAndSend(String keyIn){
//try{
//不断读取键盘输入
String line = null;
while((line = keyIn) != null)
{
//如果发送的信息中有冒号,且以//开头,则认为想发送私聊信息
if (line.indexOf(":") > 0 && line.startsWith("//")){
line = line.substring(2);
ps.println(YeekuProtocol.PRIVATE_ROUND +
line.split(":")[0] +
tocol.SPLIT_SIGN + YeekuPro
line.split(":")[1] +
YeekuProtocol.PRIVATE_ROUND);
}else if(line.equals("byebye")){
System.out.println("aaaaaaaaaaaaabbbbbbbbbbbbbbbb"+ps);
String key = (String)Server.clients.getKeyByValue(ps);
System.out.println("aaaaaaaaaaaaa"+key);
ps.println(YeekuProtocol.LOGIN_OUT+key+YeekuProtocol.LOGIN_OUT);
}else{
ps.println(YeekuProtocol.MSG_ROUND + line+ YeekuProtocol.MSG_ROUND);
}
}
//}
//捕捉到异常,关闭网络资源,并退出该程序
//catch (IOException ex){
System.out.println("网络通信异常~请重新登录~");
11
嘉兴学院 Java综合实训报告
closeRs();
System.exit(1);
}
//}*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==button1){
String line = Client.txtA2.getText();
while(line != null)
{
// String username = null;
String name = null;
//如果发送的信息中有冒号,且以//开头,则认为想发送私聊信息
if ( jcb.isSelected() &&
Client.peopleList.getSelectedValue()!=null){
name = (String) Client.peopleList.getSelectedValue();
//line = line.substring(2);
//String siliao = YeekuProtocol.PRIVATE_ROUND +
//userName + YeekuProtocol.SPLIT_SIGN+ name+
//YeekuProtocol.SPLIT_SIGN +
//line + YeekuProtocol.PRIVATE_ROUND;
//System.out.println(siliao+"这是客户端发送的");
//ps.println(siliao);
Client.txtA2.setText(null);
/*if (line.indexOf(":") > 0 && line.startsWith("//")){
line = line.substring(2);
ps.println(YeekuProtocol.PRIVATE_ROUND +
line.split(":")[0] +
YeekuProtocol.SPLIT_SIGN +
line.split(":")[1] +
YeekuProtocol.PRIVATE_ROUND);*/
}else if(line.equals("byebye")){
System.out.println("aaaaaaaaaaaaabbbbbbbbbbbbbbbb"+ps);
String key = (String)Server.clients.getKeyByValue(ps);
System.out.println("aaaaaaaaaaaaa"+key);
ps.println(YeekuProtocol.LOGIN_OUT+key+YeekuProtocol.LOGIN_OUT);
}else{
ps.println(YeekuProtocol.MSG_ROUND + line+
12
嘉兴学院 Java综合实训报告 YeekuProtocol.MSG_ROUND);
//((TextComponent) Client.txtA2).setText("");
Client.txtA2.setText(null);
break;
}
}
}
if(e.getSource()==Client.button3){
jfc.showOpenDialog(new Frame());
//启动新的线程传递文 件
RTFSend send = new RTFSend(jfc.getSelectedFile());
send.start();
}
}
//关闭Socket、输入流、输出流的方法
private void closeRs(){
//try{
if (keyIn != null)
{
ps.close();
}
if (brServer != null)
{
ps.close();
}
if (ps != null)
{
ps.close();
}
/*if (socket != null)
{
//keyIn.close();
}
}catch (IOException ex)
{
ex.printStackTrace();
}*/
}
/*public void actionPerformed1 (ActionEvent e) {
// 弹出文件选择对话框
if(e.getSource()==Client.button3){
jfc.showOpenDialog(new Frame());
//启动新的线程传递文 件
13
嘉兴学院 Java综合实训报告
RTFSend send = new RTFSend(jfc.getSelectedFile());
send.start();
}}*/
public static void main(String[] args){
Client client = new Client();
//client.Frame();
client.init(client);
}
}
服务器端:
import java.net.*;
import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Server extends JFrame {
private static final int SERVER_PORT = 30000;
public static DefaultListModel listModel; // ListModel对象
private JList peopleList;
private JButton kick;
private ServerSocket ss;
//使用MyMap对象来保存每个客户名字和对应输出流之间的对应关系。
public static YeekuMap
clients =new YeekuMap();
public Server(){
super("服务器");
setLayout(new BorderLayout());
listModel = new DefaultListModel();
peopleList = new JList(listModel);
peopleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);//设置单选
JScrollPane ListScrollPane = new JScrollPane(peopleList);
add(ListScrollPane, BorderLayout.CENTER);
kick = new JButton("踢人");
kick.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(e.getSource()==kick){
14
嘉兴学院 Java综合实训报告
String userName = (String)peopleList.getSelectedValue();//
从列表里得到用户选择的项
PrintStream ps = Server.clients.get(userName);
ps.println(Server.clients.getKeyByValue(ps)+ "您已经被迫下线,请重新登录");//1.告知本人被迫下线
ps.flush();
ps.close();//2.关闭流
Server.clients.removeByValue(ps);
for (PrintStream clientPs : Server.clients.valueSet()){
clientPs.println("用户"+userName+"已经下线。");
}//3.通知其他人 这个用户已经下线
listModel.removeElement(userName);//4.从列表中移除
for (PrintStream clientPs : Server.clients.valueSet()){
clientPs.println(YeekuProtocol.USER_REMOVE+userName+YeekuProtocol.USER_REM
OVE);
}
}
}
});
//dataList.getSelectedValue();
add(kick, BorderLayout.SOUTH);
ion(300, 100); setLocat
setSize(150, 450);
setResizable(false); //设置不能最大化
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);//设置可不可见
}
public void init(){
try{
//建立监听的ServerSocket
ss = new ServerSocket(SERVER_PORT);
//采用死循环来不断接受来自客户端的请求
while(true){
Socket socket = ss.accept();
new ServerThread(socket).start();
}
}
//如果抛出异常
catch(IOException ex){
System.out.println("服务器启动失败,是否端口" + SERVER_PORT + "已被
15
嘉兴学院 Java综合实训报告 占用,");
}
//使用finally块来关闭资源
finally{
try{
if (ss != null){
ss.close();
}
}catch (IOException ex){
ex.printStackTrace();
}
System.exit(1);
}
}
public static void main(String[] args){
Server server = new Server();
server.init();
}
}
5. 测试与结果
5.1功能模块界面
服务器端界面:
16
嘉兴学院 Java综合实训报告
图3.服务器端界面
登陆界面:
图4.登陆界面
客户端界面:
17
嘉兴学院 Java综合实训报告
图5.输入用户名
图6.登陆客户端 登陆后的服务器:
18
嘉兴学院 Java综合实训报告
图7.用户登陆后的服务器
第2个客户端登陆:
图8.第2个用户登陆
19
嘉兴学院 Java综合实训报告
图9.可在客户端显示在线用户
踢除用户:
20
嘉兴学院 Java综合实训报告
图10.服务器端点击踢人
图11.客户端显示被迫下线 发送聊天:
21
嘉兴学院 Java综合实训报告
图12.在客户端输入字符点击发送
图13.在接收用户客户端显示出发送的字符
图14.在发送用户客户端显示发送的字符
6. 心得体会
经过一个学期的JAVA课程学习了解了JAVA的基础理论知识,通过这次程序设计,进一步巩固、加深了我们所学专业课程的基本理论知识,理论联系实际,进一步培养了综合分析问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,解决问题的能力,进一步加强了JAVA的实际应用能力。通过本次Java语言课程设计,我对面向对象的程序设计有了更深程度的掌握,它将重点放在对象与对象的接口上。在通过对题目进行需求分析,考虑一些编程中可能遇到的问题。其次开始界面设计、类的设计、类功能的连接等等实现。在遇到问题解决问题的过程中不断完善功能。这次Java课程设计不仅考查了对Java语言基本理论知识的学习程度还考核了我们综合运用以及学习新知识的能力。在以后的学习道路上必须多加强自己的实际业务能力,才能适应社会对应用型人才实际工作能力的需求。
22
嘉兴学院 Java综合实训报告
参考文献
[1] 夏宽理 .Java语言程序设计1. 机械工业出版社, 2008年4月. [2] 丁宝康 .数据库系统原理. 经济科学出版社,2007年.
[3] 王建华,董志敏译,JAVA核心技术 卷2:高级特性,北京:机械工业出版社,2005
[4] 李建峰译,java2图形设计 卷二:swing.北京:机械工业出版社,2000 [5] 姬猛洛,李军译,即时消息传递系统编程源代码解析. 北京:电子工业出版社,2002
内部资料,
请勿外传~
精品资料精品资料 精品资料 精品资料 精品资料
精品资料
23
嘉兴学院 Java综合实训报告
型 号 ,
制 造 厂 家
额定功率,KW, 560
额定电压,V, 400
额定电流,A, 1010
额定频率,Hz, 50
额定转速,r/min, 1500
功率因数 0.8,滞后,
励磁电流,A, 2
励磁电压,V, 40
定子绕组接线 Y 0
冷却方式 风冷
励磁方式 强励倍数2
绝缘等级 H
防护等级
蓄电池容量,Ah, 92
1
型 号
形 式 闭式循环水冷却、涡轮增压
额定功率,KW, 628
额定转速,r/min, 1500
冷却方式 闭式循环水带热交换器
起动方式 24V直流电起动
燃油消耗,L,h,
保护与报警 定值与结果 保护与报警 定值与结果 过载 大于110%报警~大于120%延时5秒跳闸 出口电压高卸载 大于108% 短路 200%~延时0.08秒跳闸 出口电压低卸载 低于85% 电流不平衡 不平衡电流大于20%~延时5秒跳闸 电压高跳闸 大于110% 漏电电流 大于30%~延时10秒 三相电压不平衡 电压差大于10% 逆功率 大于8%~延时0.5秒 过频率 大于110% 超速 大于115%~延时5秒跳闸 低频率 小于85% 蓄电池电压低 小于21V 蓄电池电压高 大于30V 差动保护 0秒跳闸 失磁保护 跳闸 单相接地保护 跳闸 过电流保护 跳闸 润滑油压低 跳闸 三次自起动失败 发信并闭锁自起动 冷却水温高 发信 润滑油温度高 发信
24
嘉兴学院 Java综合实训报告
机油油压过低 跳闸 机油油压低 发信 冷却水断水 跳闸 燃油量过低 发信 油箱油位低 发信 冷却水水位低 发信
HYQ,Z ? /?
25
嘉兴学院 Java综合实训报告
26
嘉兴学院 Java综合实训报告
常见故障 产生原因 解 决 办 法
燃油供应量不足 开大燃油调节阀
雾化介质过量 关小雾化介质调节阀
点火位置不当 重新调整点火位置
燃油压力不稳定 稳定燃油压力
雾化介质压力不稳定 稳定雾化介质压力
雾化介质过量 关小雾化介质调节阀
喷头有异物堵塞 清理喷头
燃油压力低 增大燃油压力
雾化介质压力小 增大雾化介质压力
助燃风小 调大助燃风
燃油量大 关小燃油调节阀 火焰
助燃风小 调大助燃风
27
嘉兴学院 Java综合实训报告
雾化介质少 增大雾化介质流量
燃油量少 增加燃油供应量 焰呈
助燃风大 减小助燃风
燃油中有杂质 管路中设置过滤器 漏油 接头密封不严 拧紧软管接头
28