java实训报告.docx
- 文档编号:5127266
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:11
- 大小:120.06KB
java实训报告.docx
《java实训报告.docx》由会员分享,可在线阅读,更多相关《java实训报告.docx(11页珍藏版)》请在冰豆网上搜索。
java实训报告
实训报告
1实训目的
以Java程序设计语言为基础,以Eclipse为开发平台,通过完成简易聊天程序的编写,调试,运行工作,进一步掌握Java应用程序的开发方法和编程技巧,巩固理论知识。
2实训内容
本系统是java基于c/s模式的聊天室程序。
它是利用Eclipse开发包工具进行开发出的一款网络聊天室。
这款聊天室是套接字通信开发采用c/s模式的聊天室程序。
该 程序分为客户端(client)和服务端(server)两个模块,在一台计算机上启动服务器端程序,客户端使用用户名(昵称)登录,服务器端验证此昵称当前未使用准予登陆,否则其拒绝上线。
用户上线后,在聊天界面,右下的下拉框选择聊天对象,可以是任意在线用户,也可以是所有人选择聊天。
同时用户在服务器端的界面可以查看用户的上线、下线情况,所有用户的聊天记录。
(1)服务器端的主要功能有:
a.在特定端口上进行侦听,等待客户端连接。
b.用户可以配置服务器的侦听端口
c.可以向已经连接的客户端发送系统消息。
d.停止服务时,断开所有的用户连接。
(2)客户端的主要功能有:
a.连接到已经开启聊天服务的服务端。
b.用户可以配置要连接的服务器IP地址和端口号。
c.用户可以配置连接后的用户名。
d.服务器开启时,用户可以随时登录与注消。
e.用户可以想所有的人或者指定的个人发送消息。
3详细设计与实现
3.1服务器启动的实现
IMPanelClient类(JFrame)运行后,服务器启动,创建空的在线用户列表,创建服务器端ServerSocket,绑定6665端口,启动监听线ServerListenThread类,如果有用户发来连接请求立刻接受,判断接收客户传来的消息是不是“login”。
如果是“login”,表示该用户想登陆,接续接收用户传来的消息,即“用户名”。
此时服务器端启动JDBCThread类查询当前用户列表,验证用户名是否已被使用。
运行IMServerFrame类,出现服务器端启动界面窗口,如下图:
服务器启动界面截图
1.为IMServerFrame类添加函数startServer(),如下:
publicvoidstartServer()throwsIOException{
ServerSocketserver=newServerSocket(6665,100);
chatMeg.append("服务器程序已经启动…………"+'\n');
startServer.setEnabled(false);
stopServer.setEnabled(true);
userInfoList=newVector();
userNameList=newVector();
ServerListenThreadlistenThread=newServerListenThread(server,chatMeg,userInfoList,userNameList,userOnlineList);
listenThread.start();
}
2.为“启动服务”按钮添加点击事件,调用startServer()函数:
startServer.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
try{
startServer();
}catch(Exceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
}
});
panel.add(startServer);
startServer.setText("发送")
3.为ServerListenThread类添加函数startListen:
以下为实现代码:
publicvoidstartListen(){
Stringmsg=(String)in.readObject();
if(msg.equals("Login")){
StringcheckUserName=(String)in.readObject();
JDBCThreadjt=newJDBCThread(chatMeg,userInfoList,userNameList,
userOnlineList,clientData,checkUserName);
jt.start();
}
3.2用户远程登录的实现
用户a登陆时,向服务器发送“login”,服务器端通过ServerListenThread类,判断接收客户传来的消息是不是“login”,如果是“login”,表示该用户想登陆,接续接收用户传来的消息,即“用户名”。
此时服务器端启动JDBCThread类查询当前用户列表,如果a已经在列表中,向客户端发送消息“fail”则不允许a登陆,如果a不在列表中,向该客户端发送消息”success”,允许登陆,并把a加入当前用户列表。
在client包下创建登陆窗口类UserLogin,登陆界面如图所示:
登陆的界面截图
1.为UserLogin类添加isLogin方法:
以下为实现代码:
publicbooleanisLogin(ObjectInputStreamdataIn,
ObjectOutputStreamdataOut,
StringuserName){
booleancheckResult=false;
try{
dataOut.writeObject("Login");
dataOut.flush();
dataOut.writeObject(userName);
dataOut.flush();
Stringcheck=(String)dataIn.readObject();
if(check.equalsIgnoreCase("success")){
checkResult=true;
}else
checkResult=false;
}catch(Exceptione){
e.printStackTrace();
}
returncheckResult;
}
2.为JDBCThread类添加check方法,验证用户名:
以下为实现代码:
privatevoidcheck(){
try{
if(!
userNameList.contains(checkUserName)){
clientData.getDataOut().writeObject("success");
clientData.getDataOut().flush();
clientData.setUserName(checkUserName);
chatMeg.append(checkUserName+"上线了!
"+"\n");
userInfoList.add(checkUserName);
userOnlineList.addItem(clientData);
else{
clientData.getDataOut().writeObject("fail");
clientData.getDataOut().flush();
}
}catch(Exceptione){
e.printStackTrace();
}
}
3.3用户下线的实现
JDBCThread类在向用户发送允许登陆的success消息后,启动ServerReceiveThread线程,该线程用于服务器端与某一客户端收发消息(包括聊天消息,下线消息)。
该线程通过megManage()方法判断,如果收到的消息表示当前是用户下线消息,从在线用户列表中删除此用户,反之收到的消息表示当前是用户发来的聊天信息,将此聊天信息转发给指定人。
以下为实现代码:
publicvoidmegManage(){
while(!
isStop&&clientData.getSocket().isClosed()){
try{
StringmessageType=(String)clientData.getDataIn().readObject();
if(messageType.equalsIgnoreCase("用户下线")){
StringuserName=(String)clientData.getUserName();
chatMeg.append((userName+"下线了"+"\n"));
userInfoList.remove(clientData);
userNameList.remove(userName);
userOnlineList.removeItem(clientData);
break;
}
}catch(Exceptione){
e.printStackTrace();
System.exit(0);
}
}
}
3.4用户列表的发送
用户a登陆时,服务器端通过JDBCThread类查询当前用户列表,如果a已经在列表中,向客户端发送消息“fail”则不允许a登陆,如果a不在列表中,向该客户端发送消息”success”,允许登陆,并把a加入当前用户列表。
有用户登录时,向所有用户发送当前的在线用户列表,在JDBCThread类的check()函数中if(!
userNameList.contains(checkUserName))中补充代码,如下:
String[]userArray=(String[])userNameList.toArray(newString[0]);
for(inti=0;i SingleUserMegDataclientData=(SingleUserMegData)userInfoList.get(i); clientData.getDataOut().writeObject("用户列表"); clientData.getDataOut().flush(); clientData.getDataOut().writeObject(userArray); clientData.getDataOut().flush(); } 用户下线时,在ServerReceiveThread类的megManage()方法中,向目前所有在线用户发送一份在线用户列表。 为IMPanelClient类添加窗口关闭事件,保证窗口关闭时,向服务器发送“用户下线“消息,并关闭和服务器端的连接: 以下为实现代码: addWindowListener(newWindowAdapter(){ publicvoidwindowClosing(WindowEvente){ if(clientSocket! =null&&! clientSocket.isClosed()){ try{ dataOut.writeObject("用户下线"); dataOut.flush(); Thread.sleep(1000); clientSocket.close(); }catch(Exceptionex){ ex.printStackTrace(); } } }}); 3.5聊天的实现 当客户端的“发送”按钮或者文本框的回车事件中,向服务器端发送”聊天信息”+对方用户名+信息正文 客户端ClientReceiveThread类的recevThread(),增加判断,如果收到的消息以“聊天信息”开头,则把此条信息显示在客户端界面上。 聊天消息格式: 私聊时,客户端发送: “聊天信息”+对方用户名+信息正文 群聊时,客户端发送: “聊天信息”+“所有人”+信息正文 服务端收到后转发: 私聊,转发给指定人: “聊天信息”+发送方用户名+时间+信息正文 群聊,转发给在线的所有人: “聊天信息”+发送方用户名+“群发”+时间+信息正文。 聊天窗口如下: 聊天窗口的截图 1.客户端发送聊天信息的实现 在IMPanelClient类中给“发送“按钮添加点击事件(或者文本框回车事件)添加下面代码: publicvoidactionPerformed(ActionEventarg0){ if(clientSocket! =null&&! clientSocket.isClosed()){ try{ Stringmessage=textField.getText(); StringtoSomebody=(String)onlineBox.getSelectedItem(); dataOut.writeObject("聊天信息"); dataOut.flush(); dataOut.writeObject(toSomebody); dataOut.flush(); dataOut.writeObject(message); dataOut.flush(); java.util.Dated=newjava.util.Date(); SimpleDateFormats=newSimpleDateFormat("yyyy-MM-ddHH: mm: ss"); StringdateStr=s.format(d); receiveMeg.append(userName+""+dateStr+"\n"+message+"\n"); textField.setText(""); }catch(Exceptione){ } } } }); 2.服务器端接收聊天信息的实现 服务器ServerReceiveThread类的megManage()方法中添加一个判断,如果收到的消息以“聊天信息”开头,即认为是聊天信息,按照“对方用户名”找到相应的用户,将信息转发给他,如果“对方用户名”为“所有人”,则把这条消息转发给所有在线用户。 为ServerReceiveThread类的megManage方法添加下面代码(写在用户下线的if块结束后) 以下为实现代码: : elseif(messageType.equalsIgnoreCase("聊天信息")){ StringtoSomebody=(String)clientData.getDataIn().readObject(); Stringmessage=(String)clientData.getDataIn().readObject(); java.util.Dated=newjava.util.Date(); SimpleDateFormats=newSimpleDateFormat("yyyy-MM-ddHH: mm: ss"); StringdateStr=s.format(d); chatMeg.append(dateStr+"\n"); chatMeg.append(clientData.getUserName()+"对"+toSomebody+"说: "+message+"\n"); }else{ intindex=userNameList.indexOf(toSomebody); SingleUserMegDatatoSomebodyData=(SingleUserMegData)userInfoList.get(index); if(toSomebodyData.getSocket()! =null &&toSomebodyData.getSocket().isClosed()){ toSomebodyData.getDataOut().writeObject("聊天信息"); toSomebodyData.getDataOut().flush(); toSomebodyData.getDataOut().writeObject( clientData.getUserName()+""+dateStr+"\n"+message+"\n"); toSomebodyData.getDataOut().flush(); } 3.客户端接收聊天信息的实现 为ClientReceiveThread类的recevThread()方法监听进行添加判断,如果收到消息以“聊天信息开头”,则把此信息显示在客户端窗口上: 以下为实现代码: publicvoidrecevThread(){ while(! isStop&&clientSocket! =null&&clientSocket.isClosed()){ try{ StringmegType=(String)dataIn.readObject(); if(megType.equalsIgnoreCase("用户列表")){ String[]userList=(String[])dataIn.readObject(); userOnlineList.removeAllItems(); userOnlineList.addItem("所有人"); for(inti=0;i userOnlineList.addItem(userList[i]); } }elseif(megType.equalsIgnoreCase("聊天信息")){ Stringmessage=(String)dataIn.readObject(); receiveMeg.append(message);receiveMeg.setCaretPosition(receiveMeg.getDocument().getLength()); } }catch(Exceptione){ System.exit(0); } } } 4总结和心得 在开学的第一周,我们进行了为期一周的JAVA实训。 它是一个基于C/S模式的聊天系统,系统规模不能说大,功能实现也相对较为简单,但作为一个完整的系统,在整个过程中我还是学到了不少知识,也有较深的体会: 在本次实训的过程中,当我们面对一道陌生的代码和错误时,不应慌张和无措,首先应该想到这和课本上的哪些知识具有结合点,回忆和分析这种结构的算法和具体实施方法,综合考虑其他的方面。 在编写时,我总是粗心大意把字母打错,不区分大小写,在报错后煞费苦心的去寻找那个小小的错瓦,所以,在编写JAVA代码时应该小心谨慎去输入哪怕是一个小小的符号,一个常量变量的设定,一个字母的大小写,这都无不考量着我们的细心和严谨,所以学习JAVA,不仅对我们以后学习其他语言有很大的好处,而且也让我们知道了和理解了作为一个编程人员首先应具有的良好心理素质,那就是冷静思考和专心致志。 对待学术知识应该是严谨和认真。 通过这次的实训,我对Java的熟练程度得到了很大的提升,对包括多线程在内的Java语言高级技术掌握得也更熟了,更对面向对象的分析思想,面向对象的设计方法有了直观的体会。 由于本次要实现的系统是基于C/S模式,这其中需要用到计算机网络知识,需要熟悉socket编程,更要将网络编程与多线程结合起来,使多个线程协调工作,这要求对网络传输原理有较深的理解。 在本次实训中,我对网络的工作原理有了更多的体会。 唯一遗憾的是: 该程序的功能相对还比较单一,知识能在一个聊天室里群聊,离一个即时通讯软件还有很大差距,以后如有时间,可以考虑去做一个真正类QQ的通讯软件。 在设计过程中,我遇到了很多的难题,在解决这些问题的同时,我也加深了对JAVA语言的了解,也学会了解决问题的方法。 我制作的这个聊天室基本完成了设计要求的功能,实现了单人发送信息和多个人发送信息等功能等。 但是由于自身知识的不足,有很多想法没有能够最后实现: (1)没有发送图片、文件等功能 (2)不能保存聊天的历史记录 虽然有这样那样的不足,但是通过这次设计,我的综合能力和知识都得到了很大提高,对java语言的开发也产生了极大的兴趣。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 报告