基于安卓的简易聊天室.docx
- 文档编号:5939478
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:25
- 大小:839.25KB
基于安卓的简易聊天室.docx
《基于安卓的简易聊天室.docx》由会员分享,可在线阅读,更多相关《基于安卓的简易聊天室.docx(25页珍藏版)》请在冰点文库上搜索。
基于安卓的简易聊天室
智能终端开发课程设计
简易聊天室的设计与实现
专业
计算机科学技术
学生姓名
haha
班级
lala
学号
tata
任课教师
王翠香
完成日期
2014.6.20
一、课程设计的目的、要求
【目的】:
软件开发综合技能训练,即软件工程学课程设计是该课程的后继教学环节,是一个重要的、不可或缺的实践环节。
其目的是通过该课程设计使学生能够针对具体软件工程项目,全面掌握软件工程理管、软件需求分析、软件初步设计、软件详细设计等阶段的方法和技术,使学生进一步理解和掌握软件开发模型、软件生命周期、软件过程等理论在软件项目开发过程中的意义和作用,培养学生按照软件工程的原理、方法、技术、标准和规范进行软件开发的能力,培养学生的合作意识和团队精神,培养学生对技术文档的编写能力,从而使提高学生软件工程的综合应用能力。
【要求】:
1)严格按照课题分组及对应课题的内容要求进行系统设计,设计过程要完整;2)同一课题组可采用不同的方法进行设计(如不同的软件工程方法、不同的描述工具、不同的开发语言等),设计报告不得相互抄袭,如发现雷同报告,成绩记为不及格;3)按时到规定地点做设计,缺勤3次以上成绩记为不及格;4)按时交纳报告及相关电子文档。
二、课程设计的内容
运用所学知识,建立一个虚拟机,用Android的基本理论和编程方法实现一个简易的聊天室,能够进行简单的交流,一个是发送端,一个是接收端,利用Android平台的架构以及在Android平台上开发即时通讯系统,实现了即时通讯的功能。
(1)题目选择
简易聊天室的设计与实现
(2)系统功能要求
本系统采用客户端(C)/服务端(S)架构的体系结构,具有服务器端和客户端。
客户端:
基于Android平台进行开发。
客户端负责初始化通信过程,进行即时通讯时,由客户端负责向服务器发起创建连接请求,并存储由客户端发送的数据,以用来和另一个spark客户端交互。
服务器:
客户端连接到服务器上时,服务器对客户端的连接进行认证,对认证通过的客户端创建会话,客户端与服务器端之间的通讯就在该会话的上下文中进行。
对系统服务器端的运行流程进行了详细的分析,对Android客户端从通讯模块、数据模块和应用模块三个方面进行了详细的设计与实现。
对系统进行了部署、消息的发送和接收等方面进行了测试
(3)需要处理的基本数据
发送窗口,接收窗口,发送端,接收端,界面
(1)用户登录;
(2)消息的发送与接收;
课程设计内容
(一)系统的架构分析
通讯模块:
负责与服务器建立通讯。
数据模块:
定义客户端存入信息属性的数据类型和对象,以及存储用户的所有聊天记录。
应用模块:
主要用作客户端和用户交流的接口,用于即时通讯。
包括用户界面处理和用户数据管理两大子模块。
实现的功能主要用户登录,消息的发送和接收等。
客户端模块
应用模块
本系统采用开源的Openfire来建立即时通讯服务器。
Openfire采用Java语言进行开发,Java语言具有跨平台的特点,因此Openfire服务器可以架设于多种操作系统平台之上。
Openfire服务器的内核主要由连接管理组件、服务器连接管理组件、会话管理组件、注册登录管理组件、管理更新组件、文件传输管理组件、外部管理组件、数据存储组件和传输器组件等组件组成。
Openfire实现了插件机制,方便扩展,通过安装与异构网络通讯的插件,就能与其它的通讯软件实现通讯。
在Openfire服务器中,针对每个用户的请求,创建线程来进行响应。
系统的用户信息和聊天信息在服务器存储在openfire自身所带的SQLite数据库上。
服务器的搭建与配置如图
域名设置
数据库设置
图3.2openfire控制台服务器界面
(二)使用myEclipse编写代码
启动服务器以及安装客户端软件的Android模拟器,并在模拟器上运行客户端软件和Spark客户端软件。
我们主要从系统注册、登录、获取好友、查找好友、消息的发送和接收等几个方面进行测试。
(1)用户注册:
测试要求:
注册界面输入用户名为”zhouxiaochun”注册信息,并且要求密码以“*”显示,注册成功后,能够在服务器的用户列表中看到注册的用户名,用注册的用户信息登录服务器后,用户名在服务器中的用户列表中能够以高亮显示,密码不少于8个字符,如果不符合要求,将提示“密码不符合要求”
测试结果:
图5.1用户注册界面
(2)用户登录:
测试要求:
登录界面输入用户名为”zhouxiaochun”的信息,密码以“*”显示,点击确定按钮后,登录服务器验证信息,用户存在则跳转到下一个界面。
测试结果:
图5.2用户登录界面
(3)获取好友列表
测试要求:
客户端向服务器发送获取好友列表的请求,客户端能够对从服务器收到的结果进行处理,并且将好友信息在好友列表中进行显示。
点击menu后,在界面上显示查找和刷新的菜单选项。
图5.3服务器用户列表
(4)消息的发送和接收
测试要求:
Android用户“zhouxiaochun”和Android用户“zxc”之间进行即时通讯,互相发送文本消息,通讯双方能够准确的收到对方的消息
测试结果
图5.5用户聊天界面
(三)主要代码
packagecom.zzk;
importjava.awt.BorderLayout;
importjava.awt.Frame;
importjava.awt.Image;
importjava.awt.MenuItem;
importjava.awt.PopupMenu;
importjava.awt.SystemTray;
importjava.awt.TrayIcon;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.io.PrintWriter;
import.ServerSocket;
import.Socket;
import.URL;
importjava.util.Hashtable;
importjava.util.Iterator;
importjava.util.Set;
importjava.util.Vector;
importjavax.swing.ImageIcon;
importjavax.swing.JFrame;
importjavax.swing.JScrollPane;
importjavax.swing.JTextArea;
publicvoidcreatChatLog(Stringstr){
ArrayList
chatItem.put(str,list);}
publicvoidaddChat(Stringkey,ChatMsgmsg){
aList=chatItem.get(key);
if(aList==null){
creatChatLog(key);}
chatItem.get(key).add(msg);}
publicArrayList
returnchatItem.get(key);}
publicclassChatServerFrameextendsJFrame{
privateJTextAreata_info;
privateServerSocketserver;//声明ServerSocket对象
privateSocketsocket;//声明Socket对象socket
privateHashtable
publicvoidcreateSocket(){
try{
server=newServerSocket(1982);//创建服务器套接字对象
while(true){
ta_info.append("等待新客户连接......\n");
socket=server.accept();//获得套接字对象
ta_info.append("客户端连接成功。
"+socket+"\n");
newServerThread(socket).start();//创建并启动线程对象
}
}catch(IOExceptione){
e.printStackTrace();
}
}
classServerThreadextendsThread{
Socketsocket;
publicServerThread(Socketsocket){
this.socket=socket;
}
publicvoidrun(){
try{
ObjectInputStreamins=newObjectInputStream(socket
.getInputStream());
while(true){
Vectorv=null;
try{
v=(Vector)ins.readObject();
}catch(ClassNotFoundExceptione){
e.printStackTrace();
}
if(v!
=null&&v.size()>0){
for(inti=0;i Stringinfo=(String)v.get(i);//读取信息 Stringkey=""; iRegistrationreg=newRegistration(); PacketFilterfilter=newAndFilter(newPacketIDFilter( reg.getPacketID()),newPacketTypeFilter(IQ.class)); PacketCollectorcollector=connect.createPacketCollector(filter); connect.sendPacket(reg); IQresult=(IQ)collector.nextResult(SmackConfiguration .getPacketReplyTimeout());//等待服务器返回结果 handler.sendEmptyMessage (1);//界面的切换 connect.login(USERID,PWD); Presencepresence=newPresence(Presence.Type.available);//状态可见 connect.sendPacket(presence); Intentintent=newIntent(HappySpringActivity.this,FriendsList.class); intent.putExtra("USERID",USERID);//两个进程之间通信,把信息传到下一个activity startActivity(intent);} layout1.setVisibility(View.VISIBLE);//显示界面 layout2.setVisibility(View.GONE);//隐藏界面 publicstaticvoidmain(Stringargs[]){ ChatServerFrameframe=newChatServerFrame(); frame.setVisible(true); frame.createSocket(); publicChatServerFrame(){ super(); addWindowListener(newWindowAdapter(){ publicvoidwindowIconified(finalWindowEvente){ setVisible(false); } }); setTitle("聊天室服务器端"); setBounds(100,100,385,266); finalJScrollPanescrollPane=newJScrollPane(); getContentPane().add(scrollPane,BorderLayout.CENTER); 2.客户端: packagecom.zzk; importjava.awt.BorderLayout; importjava.awt.Dimension; importjava.awt.EventQueue; importjava.awt.Font; importjava.awt.Frame; importjava.awt.Image; importjava.awt.MenuItem; importjava.awt.PopupMenu; importjava.awt.SystemTray; importjava.awt.TrayIcon; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjava.awt.event.MouseAdapter; importjava.awt.event.MouseEvent; importjava.io.BufferedReader; importjava.io.IOException; importjava.io.InputStreamReader; importjava.io.ObjectOutputStream; import.Socket; import.URL; import.UnknownHostException; importjava.text.DateFormat; importjava.util.Date; importjava.util.Vector; importjavax.swing.DefaultComboBoxModel; importjavax.swing.ImageIcon; importjavax.swing.JButton; importjavax.swing.JFrame; importjavax.swing.JLabel; importjavax.swing.JList; importjavax.swing.JOptionPane; importjavax.swing.JPanel; importjavax.swing.JScrollPane; importjavax.swing.JSplitPane; importjavax.swing.JTextArea; importjavax.swing.JTextField; publicclassChatClientFrameextendsJFrame{ privateJTextFieldtf_newUser; privateJListuser_list; privateJTextAreata_info; privateJTextFieldtf_send; privateObjectOutputStreamout;//声明输出流对象 privatebooleanloginFlag=false;//为true时表示已经登录,为false时表示未登录 publicstaticvoidmain(Stringargs[]){ EventQueue.invokeLater(newRunnable(){ publicvoidrun(){ try{ ChatClientFrameframe=newChatClientFrame(); frame.setVisible(true); frame.createClientSocket();//调用方法创建套接字对象 }catch(Exceptione){ e.printStackTrace(); } }});} publicvoidcreateClientSocket(){ try{ Socketsocket=newSocket("localhost",1982);//创建套接字对象 out=newObjectOutputStream(socket.getOutputStream());//创建输出流对象 newClientThread(socket).start();//创建并启动线程对象 }catch(UnknownHostExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); }}classClientThreadextendsThread{ Socketsocket; publicClientThread(Socketsocket){ this.socket=socket; } publicvoidrun(){ try{ BufferedReaderin=newBufferedReader(newInputStreamReader( socket.getInputStream()));//创建输入流对象 DefaultComboBoxModelmodel=(DefaultComboBoxModel)user_list .getModel();//获得列表框的模型 while(true){ Stringinfo=in.readLine().trim();//读取信息 if(! info.startsWith("MSG: ")){//接收到的不是消息 if(info.startsWith("退出: ")){//接收到的是退出消息 model.removeElement(info.substring(3));//从用户列表中移除用户 }else{//接收到的是登录用户 booleanitemFlag=false;//标记是否为列表框添加列表项,为true不添加,为false添加 for(inti=0;i if(info.equals((String)model.getElementAt(i))){//如果用户列表中存在该用户名 itemFlag=true;//设置为true,表示不添加到用户列表 break;//结束for循环 } } if(! itemFlag){ model.addElement(info);//将登录用户添加到用户列表 } } }else{//如果获得的是消息,则在文本域中显示接收到的消息 DateFormatdf=DateFormat.getDateInstance();//获得DateFormat实例 StringdateString=df.format(newDate());//格式化为日期 df=DateFormat.getTimeInstance(DateFormat.MEDIUM);//获得DateFormat实例 StringtimeString=df.format(newDate());//格式化为时间 StringsendUser=info.substring(4,info.indexOf(": 发送给: "));//获得发送信息的用户 StringreceiveInfo=info.substring(info.indexOf(": 的信息是: ")+6);//获得接收到的信息 ta_info.append(""+sendUser+""+dateString+""+timeString+"\n"+receiveInfo+"\n");//在文本域中显示信息 ta_info.setSelectionStart(ta_info.getText().length()-1);//设置选择起始位置 ta_info.setSelectionEnd(ta_info.getText().length());//设置选择的结束位置 tf_send.requestFocus();//使发送信息文本框获得焦点 }} }catch(IOExceptione){ e.printStackTrace(); }}} privatevoidsend(){ if(! loginFlag){ JOptionPane.showMessageDialog(null,"请先登录。 "); return;//如果用户没登录则返回 } StringsendUserName=tf_newUser.getText().trim();//获得登录用户名 Stringinfo=tf_send.getText();//获得输入的发送信息 if(info.equals("")){ return;//如果没输入信息则返回,即不发送 } Vector Object[]receiveUserNames=user_list.getSelectedValues();//获得选择的用户数组 if(receiveUserNames.length<=0){ return;//如果没选择用户则返回 } for(inti=0;i Stringmsg=sendUserName+": 发送给: "
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 简易 聊天室