桂林理工大学JAVAIM即时通讯软件何天从.docx
- 文档编号:15635432
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:30
- 大小:912.21KB
桂林理工大学JAVAIM即时通讯软件何天从.docx
《桂林理工大学JAVAIM即时通讯软件何天从.docx》由会员分享,可在线阅读,更多相关《桂林理工大学JAVAIM即时通讯软件何天从.docx(30页珍藏版)》请在冰点文库上搜索。
桂林理工大学JAVAIM即时通讯软件何天从
JAVA项目实训报告
课题名称JAVA即时通讯软件
姓名何天从
学号3110757101
班级网络11-1班
院系信息科学与工程学院
指导老师姜传贤
起止日期2013.6.1~2013.7.6
JAVA即时通讯软件
1、需求分析
1.1JAVA即时通讯软件的功能
1.1.1具有注册、登陆、聊天和下线的基本工能;
1.1.2增加、删除好友和搜索附近所有人的操作;
1.1.3动态显示好友的上线、下线信息。
1.2设计思路
1.2.1用户使用客户端可以连接到服务器并注册一个属于自己的惟一的ID,成功注册ID后,用户可以登录到个人的客户端;
1.2.2在个人的客户端,用户可以添加好友,可以和好友聊天,可以删除好友,搜索附近所有人;
1.2.3当用户关掉软件或者下线的时候,客户端会自动告诉服务器端用户下线,服务器端将用户头像显示为灰色的离线模式。
1.3设计思路分析
1.3.1【运行环境说明】
操作系统:
Windows
开发语言:
Java
开发环境:
eclipse
需要软件:
tomcat服务器、SQLServer2012数据库
1.3.2【用户的注册、修改】
设计用户的登录界面(GUI),注册界面(GUI)将注册信息写入数据库。
1.3.3【服务器端实现多线程】
当客户端登陆时,服务器端创建一个线程,当多个客户端连接时,服务器端会创建多个线程,实现线程的同步运行。
1.3.4【实现客户端和服务器端简单通信】
所有客户端信息通过服务器转发,实现服务器端和客户端的简单通信。
1.3.5【实现用户之间的通信】
用户之间的通讯通过服务器转发实现。
1.3.6【用户好友的管理】
用户登录后,可以获取用户的好友列表,列表从数据库中获得,用户可以对好友进行删除,可以添加新的好友。
1.3.7【数据库设计】
JIM数据库由2张表构成,User用户信息表和Friend好友表。
2、概要设计
2.1本程序包含5部分:
2.1.1客户端(Client)
2.1.2服务器端(Server)
2.1.3业务层(Business)
2.1.4数据操作层(SqlHelper)
2.1.5窗体层(Form)
【客户端】由用户来添加、查找、删除用户和注册、登录、注销及一对一通信。
在客户端中包括business、Form、Datalayer和image四个包。
Datalayer包主要负责数据库的操作,Form窗体的构造,image图片的存放。
【服务器端】由管理员用来控制客户端注册、登录、注销、好友管理、在线查询等功能。
服务器端负责数据的转发工作,和登陆信息的验证和注册工作。
【数据操作层】连接SQLServer2012数据库,对User用户信息表和Friend好友表的读取和写入进行操作。
【业务层】包含对Form层的一些功能操作,相当于一个功能基类。
2.2系统功能结构图
2.3数据库Users用户表
2.4数据库Friend朋友表
3、核心代码
3.1聊天窗口构造代码:
packagebusiness;
importjava.awt.*;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JPanel;
importjavax.swing.JScrollPane;
importjavax.swing.JSplitPane;
importjavax.swing.JTextArea;
importForm.*;
publicclassChatBaseextendsJFrameimplementsActionListene
{protectedintuserNum;
protectedintfriendNum;
protectedStringfriendIp;
protectedStringuserName;
protectedbooleanopenRecrod=false;
protectedJLabelinfomation;
protectedJTextAreainput;
protectedJTextAreaoutput;
protectedJPanelpnlButtom;
protectedJPanelpnlCenter;
protectedJButtonbtnSend;
protectedJButtonbtnCancel;
protectedJButtonbtnRecord;
protectedClientparent;
protectedJScrollPanepanel;
protectedJTextArearecrod;
//用于初始控件和布局,以下为聊天窗口的布局
publicvoidsetup()
{infomation=newJLabel("");
Stringinfo=User.getInfo(friendNum);
infomation.setText(info);
input=newJTextArea();
output=newJTextArea();
JScrollPanejspInput=newJScrollPane(input,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
JScrollPanejspOutput=newJScrollPane(output,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
pnlButtom=newJPanel();
pnlCenter=newJPanel();
pnlButtom.setLayout(newFlowLayout());
btnSend=newJButton("发送");
btnCancel=newJButton("取消");
btnRecord=newJButton("聊天记录");
btnSend.addActionListener(this);
btnCancel.addActionListener(this);
btnRecord.addActionListener(this);
pnlCenter.setLayout(newBorderLayout());
pnlCenter.add("Center",jspInput);
pnlCenter.add("South",jspOutput);
javax.swing.JSplitPanejs=newJSplitPane(JSplitPane.VERTICAL_SPLIT,jspInput,jspOutput);
js.setDividerSize(4);
jspInput.setPreferredSize(newDimension(200,200));
pnlButtom.add(btnSend);
pnlButtom.add(btnCancel);
pnlButtom.add(btnRecord);
recrod=newJTextArea();
recrod.setPreferredSize(newDimension(200,280));
panel=newJScrollPane(recrod,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
this.getContentPane().add(panel,"East");
getContentPane().add("North",infomation);
getContentPane().add("Center",pnlCenter);
getContentPane().add("South",pnlButtom);
getContentPane().add(js);
input.setEditable(false);
}
publicChatBase()
{
}
publicvoidsetMessage(Stringstring)
{
}
publicvoidactionPerformed(ActionEvente){
//TODO自动生成方法存根
}
}
3.2服务器转发信息代码
publicvoidrun(){
try{
Stringline=newString("Q");
while(!
login){
if(!
serving)break;
line=in.readUTF();
if(line.charAt(0)=='L'){
userName=line.substring
(2);
//向登陆的用户发送当前在线用户列表
login=true;
list.add(userName);
user.setText("User("+list.getItemCount()+")");
String[]str=list.getItems();
line="A";//accepted
for(inti=0;i line+=(str[i]+""); } out.writeUTF(line); line="L"+userName; rightNow=Calendar.getInstance().getTime().toString(); output.append(rightNow+"\n"+userName+"login.\n\n"); //向在线用户(不包括当前客户)发送消息 for(Enumeratione=ht.elements();e.hasMoreElements();){ DataOutputStreamout=(DataOutputStream)(e.nextElement()); out.writeUTF(line); } ht.put(userName,out);//将登录的客户加入名单 ht_s.put(userName,connection); } } while(login){ StringrecName=null;//信息要发送给的用户 line=in.readUTF(); if(! serving)break; if(line.charAt(0)=='Q'){ out.writeUTF("Q"); login=false; ht.remove(userName);//将退出登录的客户从名单中剔除 ht_s.remove(userName); list.remove(userName); user.setText("User("+list.getItemCount()+")"); line="Q"+userName; rightNow=Calendar.getInstance().getTime().toString(); output.append(rightNow+"\n"+userName+"logout.\n\n"); sendForAllFriend(line); } else{ //接受到普通信息 //向指定用户发送消息 sendForOne(line,"M"); } } in.close(); out.close(); connection.close(); }catch(SocketExceptionse){ ht.remove(userName); ht_s.remove(connection); list.remove(userName); output.append("Connectionto"+userName+"closed\n"); }catch(IOExceptionioe){ if(! (ioeinstanceofEOFException)){ output.append("Error: "+ioe+"\n\n"); } } }} //用于接受客户连接请求的线程类 privateclassServerThreadextendsThread{ privatebooleanrunning; publicServerThread() { start(); } publicvoidrun() { try{ while(serving){ Socketconnection=server.accept(); ServerThreadSinglehandler =newServerThreadSingle(connection); } }catch(SocketExceptionse){ rightNow=Calendar.getInstance().getTime().toString(); output.append(rightNow+"\nServingstoped.\n\n"); }catch(IOExceptionioe){ output.append("Error: "+ioe+"\n\n"); } } } //消息处理方法 publicvoidactionPerformed(ActionEventevent) { if(event.getSource()==enter) { if(serving){ try{ for(Enumeratione=ht.elements();e.hasMoreElements();){ DataOutputStreamout=(DataOutputStream)(e.nextElement()); out.writeUTF("Q"); } serving=false; ht.clear(); ht_s.clear(); list.clear(); user.setText("User(0)"); server.close(); enter.setLabel("Start"); }catch(SocketExceptionse){ rightNow=Calendar.getInstance().getTime().toString(); output.append(rightNow+"\nServingstoped.\n\n"); }catch(IOExceptionioe){ output.append("Error: "+ioe+"\n\n"); } } else{ try{ server=newServerSocket(Integer.parseInt(getSvrPort.getText())); rightNow=Calendar.getInstance().getTime().toString(); output.append(rightNow+"\nServingstarted.\n\n"); enter.setLabel("Stop"); ht=newHashtable(); ht_s=newHashtable(); st=newServerThread(); serving=true; }catch(IOExceptionioe){ output.append("Error: "+ioe+"\n\n"); } } } } 3.3客户端UDP转发通讯代码 publicvoidready() { try{ clientAddress=InetAddress.getLocalHost(); byte[]ip=clientAddress.getAddress(); strIP=(ip[0]&0xFF)+"."+(ip[1]&0xFF)+ "."+(ip[2]&0xFF)+"."+(ip[3]&0xFF); User.setIP(strIP,this.userNum); strIP="192.168.0.2"; connection=newSocket(strIP,port); in=newDataInputStream(connection.getInputStream()); out=newDataOutputStream(connection.getOutputStream()); out.writeUTF("L"+userNum+""); }catch(UnknownHostExceptione){ //TODO自动生成catch块 JOptionPane.showMessageDialog(Client.this,"未找到服务器! "); Client.this.clientClosed(); }catch(IOExceptione){ //TODO自动生成catch块 JOptionPane.showMessageDialog(Client.this,"未找到服务器! "); Client.this.clientClosed(); } } //用于发送服务器消息的线程类 publicvoidsendMessage(Stringstring,StringdesIp) { try{ if(string.charAt(0)=='M') { udpSend(desIp,string); } else out.writeUTF(string); }catch(IOExceptione){ //TODO自动生成catch块 JOptionPane.showMessageDialog(Client.this,"未找到服务器! "); Client.this.clientClosed(); } } publicvoidudpSend(Stringip,Stringstring) { byte[]bufferOut=newbyte[100]; //byte[]bufferIn=newbyte[26]; bufferOut=string.getBytes(); try{ DatagramSocketds=newDatagramSocket(3333); InetAddressia=InetAddress.getByName(ip); DatagramPacketpacketOut=newDatagramPacket(bufferOut,bufferOut.length,ia,13); ds.send(packetOut); ds.close(); }catch(Exceptione){ e.printStackTrace(); } } //由于更新窗体 publicvoidupdateClient() { try{ friend.removeAllElements(); panel.removeAll(); Client.this.setFriendList(panel); }catch(SQLExceptione){ //TODO自动生成catch块 e.printStackTrace(); } panel.updateUI(); } //用于接受服务器的信息 privateclassrecThreadextendsThread { publicrecThread() { start(); } publicvoidrun() { try{ while(login){ Stringline=in.readUTF(); rightNow=Calendar.getInstance().getTime().toString(); if(line.charAt(0)=='Q'){ if(line.length()==1){ //退出 connection.close(); login=false; b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 桂林 理工大学 JAVAIM 即时通讯 软件