




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
重庆大学课程设计报告课程设计题目: Android聊天室 学 院: 计算机学院 专业班级: 网络工程2班 年 级: 2009级 姓 名: x x x 学 号: 完成时间: 2012 年 7 月 5 日成 绩: 指导教师: 李季 重庆大学教务处制 课程设计成绩评定参考标准 钟玉文20095578项目分值优秀(100x90)良好(90x80)中等(80x70)及格(70x60)不及格(xx90)良好(90x80)中等(80x70)及格(70x60)不及格(xx90)良好(90x80)中等(80x70)及格(70x60)不及格(xx90)良好(90x80)中等(80x70)及格(70x60)不及格(x60)参考标准参考标准参考标准参考标准参考标准学习态度15学习态度认真,科学作风严谨,严格保证设计时间并按任务书中规定的进度开展各项工作学习态度比较认真,科学作风良好,能按期圆满完成任务书规定的任务学习态度尚好,遵守组织纪律,基本保证设计时间,按期完成各项工作学习态度尚可,能遵守组织纪律,能按期完成任务学习马虎,纪律涣散,工作作风不严谨,不能保证设计时间和进度技术水平与实际能力25设计合理、理论分析与计算正确,实验数据准确,有很强的实际动手能力、经济分析能力和计算机应用能力,文献查阅能力强、引用合理、调查调研非常合理、可信设计合理、理论分析与计算正确,实验数据比较准确,有较强的实际动手能力、经济分析能力和计算机应用能力,文献引用、调查调研比较合理、可信设计合理,理论分析与计算基本正确,实验数据比较准确,有一定的实际动手能力,主要文献引用、调查调研比较可信设计基本合理,理论分析与计算无大错,实验数据无大错设计不合理,理论分析与计算有原则错误,实验数据不可靠,实际动手能力差,文献引用、调查调研有较大的问题创新10有重大改进或独特见解,有一定实用价值有较大改进或新颖的见解,实用性尚可有一定改进或新的见解有一定见解观念陈旧论文(计算书、图纸)撰写质量50结构严谨,逻辑性强,层次清晰,语言准确,文字流畅,完全符合规范化要求,书写工整或用计算机打印成文;图纸非常工整、清晰结构合理,符合逻辑,文章层次分明,语言准确,文字流畅,符合规范化要求,书写工整或用计算机打印成文;图纸工整、清晰结构合理,层次较为分明,文理通顺,基本达到规范化要求,书写比较工整;图纸比较工整、清晰结构基本合理,逻辑基本清楚,文字尚通顺,勉强达到规范化要求;图纸比较工整内容空泛,结构混乱,文字表达不清,错别字较多,达不到规范化要求;图纸不工整或不清晰摘要 本次课程设计是以嵌入式系统课程和理论知识为基础,通过课程设计的实践,培养学生理论联系实际的思想,加强学生对所修相关课程的理解、掌握,训练并提高学生Android应用软件的设计、编程能力,独立解决问题的思路。此系统设计了一个基于Android系统与PC之间的通信,采用Socket流式套接字进行网络通信。其中Android系统的模拟器作为客户端,客户端采用获取手机号码作为该客户端的唯一标识,PC作为服务器端。依据Android应用程序的仿真器,我们实现了多个应用客服端及服务器端的通信,其中,客服端之间可以相互进行单独的文本通信(私聊),也可以进行群聊。同时,客服端也可以进行文件的传输。关键词:Android;Socket通信;私聊;群聊;文件传输目录一、聊天室的描述11.1聊天室的设计背景11.2聊天室的基本功能1二、聊天室的设计22.1聊天室的粗略设计分析22.2聊天室的具体设计分析3三、聊天室的实现63.1聊天室所使用的类及功能的实现6四、运行结果36五、课程设计存在问题、解决方法及总结435.1系统存在的问题435.2系统改进方法4353总结44六、 参考文献44课设题目:Android聊天室一、聊天室的描述1.1聊天室的设计背景当今社会,网络技术越来越发展,可以说,二十一世纪就是网络的世纪。网络迅猛发展,势不可挡。为了实现资源共享,各式各样的网站发展迅速,各种各样的聊天工具不断更新。所以制作一个聊天室势在必行。为了实现一个更好的网络交互平台,各用户之间能够实时方便的传递信息,按照用户对系统的要求不同,可以在聊天室里实现公共聊天,也可以邀几个私交好友私聊,同时提供了两个用户之间能够传送文件。本系统是基于方便用户聊天,传递信息,共享资源,所以系统的功能主要是从以上几个模块着手。本项目主要是利用Android制作一个聊天室,采用的是客户/服务器。 二层的C/S结构是指以单一的服务器和局域网为核心,能通过客户端与用户进行直接对话。主要有二大功能:一是它用于检查用户从键盘等输入的数据,显示应用输出的数据。为使用户能直观地进行操作,一般要使用图形用户接口,操作简单、易学易用。在变更用户接口时,只需改写显示控制和数据检查程序,而不影响其他。检查的内容也只限于数据的形式和值的范围,不包括有关业务本身的处理逻辑。典型的C/S结构有以下特点:1、服务器负责数据管理及程序处理。2、客户机负责界面描述和界面显示。3、客户机向服务器提出处理要求。4、服务器响应将处理结果返回客户机。5、使网络数据流量最少。1.2聊天室的基本功能1. 用户注册 2. 用户登录3. 用户公聊4. 用户私聊5. 传输文件n 用户注册第一次用户需要提供个人注册信息,注册的用户名不能重复,个人信息必须提供完整。n 用户登录用户输入用户名和密码,提交给将服务器端的确认,根据从服务器中传过来的确认信息,判断用户登录的情况。并且把此次登录的时间及登录的IP记录在服务器。如果用户名和密码正确的话,则登录聊天室主界面;如果已经在线,则输出已经在线;否则输出用户名和密码错误,需要重新登录或者注册。n 用户公聊用户输入的用户名和密码都正确后,则进入聊天室。聊天主界面主要由四大版块组成:公聊的聊天信息、在线用户列表、系统消息和聊天的一些操作。n 用户私聊如果两个人聊的话题比较隐秘,不想被其他人看到,就要使用私聊。在这里,如果说话对象是所有人的话,不能选择私聊;从当前好友列表中选择了一个用户之后,则私聊对话框应该弹出来。n 文件传递两个用户在聊天过程中,可能需要相互间传送文件。象用户聊天信息和在线用户这样一些信息都是保存在服务器端,然后每个客户读取服务器端向量中的内容,此时服务器与客户端的联系是一对多的,而传送文件是一对一的。所以直接传送,不需要经过服务器端保存。二、聊天室的设计2.1聊天室的粗略设计分析1、聊天系统平台应有两个部分组成:服务端和客户端。服务端主要完成用户信息的存储、客户端命令的接受与响应以及信息转发等服务端应有的功能。客户端主要完成聊天信息的发送与接受、登录等功能。此系统使用的是TCP/IP协议,应用了如下通讯模式:2、在网络上的两个程序通过一个双向的通信链路实现数据交换,这个双向链路的一段就被称为一个Socket,Socket通常用来实现客户端和服务器端的链接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket有一个IP地址和一个端口号确定。在Java环境中实现基于TCP/IP协议的网络编程都需要采用Socket机制。并且与基于URL的网络编程Socket编程提供更高的传输效率。Socket通常采用C/S结构,使用Socket进行C/S程序设计的一般链接过程如下图:图1.1 Socket编程连接一般过程2.2聊天室的具体设计分析根据课程设计的要求及项目的需求分析,聊天程序应实现以下几项功能:登录、注册、公聊、私聊、文件传送等。当客户程序需要与服务器程序通讯的时候,客户程序在客户机创建一个socket对象。创建了一个Socket对象后,那么它可以通过调用Socket的getInputStream()方法从服务程序获得输入流读传送来的信息,也可以通过调用Socket的getOutputStream()方法获得输出流来发送消息。由于Client使用了流套接字,所以服务程序也要使用流套接字。这就要创建一个ServerSocket对象,接下来服务程序进入无限循环之中,无限循环从调用ServerSocket的accept()方法开始,在调用开始后accept()方法将导致调用线程阻塞直到连接建立。在建立连接后accept()返回一个最近创建的Socket对象,该Socket对象绑定了客户程序的IP地址或端口号。由于存在单个服务程序与多个客户程序通讯的可能,服务程序循环检测是否有客户连接到服务器上,如果有,则创建一个线程来服务这个客户,以此完成对客户端的监听。在客户端程序实现了界面的显示以及与服务器端的数据交互。各模块主要功能及名称如下:服务器端启动主要类:Server和ServerThread类,主要实现服务器端的启动和对客户端的监听。用户登陆和注册的主要类:MainActivity和MyRegisteActivity类,前一个主要实现用户的登陆,后一个主要实现用户的注册。用户实现私聊和群聊:MyChatActivity和ChatEveryActivity类用户之间传送和接收文件:MyFileActivity、NetTcpFileSendThread和NetTcpFileReceiveThread类具体流程如下图所示: 未注册用户:开始结束读取服务器IP接收用户信息判断信息显示注册界面显示主界面NoYes写入服务器数据库 主界面 已注册用户:读取服务器IP接收用户名及密码判断密码显示登录界面显示主界面NoYes开始结束三、聊天室的实现3.1聊天室所使用的类及功能的实现1、 服务器启动类1、Server类public class Server extends JFrame implements ActionListenerBorderLayout borderLayout1=new BorderLayout();BorderLayout borderLayout2= new BorderLayout();JPanel jPanel1=new JPanel();JPanel jPanel2=new JPanel();JButton jButton1=new JButton();JButton jButton2=new JButton();JScrollPane jScrollPane1=new JScrollPane();static JTextArea jTextArea1=new JTextArea();boolean bool=false,start=false;ServerThread serverThread;Thread thread;public Server()super(Server);getContentPane().setLayout(borderLayout1);jButton1.setText(启动服务器);jButton2.setText(关闭服务器);jButton1.addActionListener(this);jButton2.addActionListener(this);getContentPane().add(jPanel1,BorderLayout.NORTH);jPanel1.add(jButton1);jPanel1.add(jButton2);jTextArea1.setText();jPanel2.setLayout(borderLayout2);jPanel2.add(jScrollPane1, BorderLayout.CENTER);jScrollPane1.getViewport().add(jTextArea1);getContentPane().add(jPanel2, BorderLayout.CENTER);this.setSize(400, 400);this.setVisible(true);public static void main(String args) Server server=new Server();server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Overridepublic void actionPerformed(ActionEvent e) if(e.getSource()=jButton1)serverThread=new ServerThread();serverThread.start();else if(e.getSource()=jButton2)bool=false;start=false;serverThread.finalize();this.setVisible(false);2、ServerThread类public class ServerThread extends Thread ServerSocket serverSocket;public static final int PORT=8524;Vector clients;Vector messages;BroadCast broadCast;String ip;InetAddress myIPaddress=null;public ServerThread()clients=new Vector();messages=new Vector();try serverSocket=new ServerSocket(PORT); catch (IOException e) try myIPaddress=InetAddress.getLocalHost(); catch (UnknownHostException e) System.out.println(e.toString();ip=myIPaddress.getHostAddress();Server.jTextArea1.append(服务器地址: +ip+端口号: +String.valueOf(serverSocket.getLocalPort()+n);broadCast=new BroadCast(this);broadCast.start();public void run()while(true)try Socket socket=serverSocket.accept();System.out.println(socket.getInetAddress().getHostAddress();ClientThread clientThread=new ClientThread(socket,this);clientThread.start();if(socket!=null)synchronized (clients) clients.addElement(clientThread); catch (IOException e) System.out.println(发生异常:+e);System.out.println(建立客户端连接失败!);System.exit(2);public void finalize()try serverSocket.close(); catch (IOException e) serverSocket=null;2、 用户登陆和注册类1、MainActivity类/* * 登陆的主要Activity,实现登陆的基本功能 * * author 钟玉文 * */public class MainActivity extends Activity /* Called when the activity is first created. */private TextView tv1,tv2;private Button bt1,bt2; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); tv1=(TextView)this.findViewById(R.id._id); tv1.setText(账号); tv2=(TextView)this.findViewById(R.id._pwd); tv2.setText(密码); bt1=(Button)this.findViewById(R.id.button_login); bt2=(Button)this.findViewById(R.id.button_registe); bt1.setOnClickListener(new OnClickListener()Overridepublic void onClick(View v) / TODO Auto-generated method stubIntent intent=new Intent();intent.setClass(MainActivity.this,MyFeiGeActivity.class);startActivity(intent);MainActivity.this.finish(); ); bt2.setOnClickListener(new OnClickListener()Overridepublic void onClick(View v) / TODO Auto-generated method stubIntent intent=new Intent();intent.setClass(MainActivity.this,MyRegisterActivity.class);startActivity(intent);MainActivity.this.finish(); ); 2、MyRegisterActivity类public class MyRegisterActivity extends Activity private TextView tv1,tv2;private Button button2; /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.register); tv1=(TextView)this.findViewById(R.id._id); tv1.setText(账号); tv2=(TextView)this.findViewById(R.id._pwd); tv2.setText(密码); button2=(Button)this.findViewById(R.id.button_confirm); button2.setOnClickListener(new Button.OnClickListener()Overridepublic void onClick(View v) / TODO Auto-generated method stubIntent intent=new Intent();intent.setClass(MyRegisterActivity.this, MainActivity.class);startActivity(intent);MyRegisterActivity.this.finish(); ); 三、用户之间私聊和群聊类1、MyChatActivity类/* * 聊天窗口activity,实现私聊 * author 钟玉文 * * 2012/7/3 * */public class MyChatActivity extends MyFeiGeBaseActivity implements OnClickListener,ReceiveMsgListener/private NetThreadHelper netThreadHelper;/private ImageView chat_item_head;/头像private TextView chat_name;/名字及IPprivate TextView chat_mood;/组名private Button chat_quit;/退出按钮private ListView chat_list;/聊天列表private EditText chat_input;/聊天输入框private Button chat_send;/发送按钮private List msgList;/用于显示的消息listprivate String receiverName;/要接收本activity所发送的消息的用户名字private String receiverIp;/要接收本activity所发送的消息的用户IPprivate String receiverGroup;/要接收本activity所发送的消息的用户组名private ChatListAdapter adapter;/ListView对应的adapterprivate String selfName;private String selfGroup;private final static int MENU_ITEM_SENDFILE = Menu.FIRST;/发送文件private final static int MENU_ITEM_EXIT = Menu.FIRST + 1;Overrideprotected void onCreate(Bundle savedInstanceState) / TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.chat);findViews();/netThreadHelper = NetThreadHelper.newInstance();msgList = new ArrayList();Intent intent = getIntent();Bundle bundle = intent.getExtras();receiverName = bundle.getString(receiverName);receiverIp = bundle.getString(receiverIp);receiverGroup = bundle.getString(receiverGroup);selfName = 手机+getLocalIpAddress();selfGroup = android;chat_name.setText(receiverName + ( + receiverIp + );chat_mood.setText(组名: + receiverGroup);chat_quit.setOnClickListener(this);chat_send.setOnClickListener(this);Iterator it = netThreadHelper.getReceiveMsgQueue().iterator();while(it.hasNext()/循环消息队列,获取队列中与本聊天activity相关信息ChatMessage temp = it.next();/若消息队列中的发送者与本activity的消息接收者IP相同,则将这个消息拿出,添加到本activity要显示的消息list中if(receiverIp.equals(temp.getSenderIp() msgList.add(temp);/添加到显示listit.remove();/将本消息从消息队列中移除adapter = new ChatListAdapter(this, msgList);chat_list.setAdapter(adapter);netThreadHelper.addReceiveMsgListener(this);/注册到listenersprivate void findViews()/chat_item_head = (ImageView) findViewById(R.id.chat_item_head);chat_name = (TextView) findViewById(R.id.chat_name);chat_mood = (TextView) findViewById(R.id.chat_mood);chat_quit = (Button) findViewById(R.id.chat_quit);chat_list = (ListView) findViewById(R.id.chat_list);chat_input = (EditText) findViewById(R.id.chat_input);chat_send = (Button) findViewById(R.id.chat_send);Overridepublic void processMessage(Message msg) / TODO Auto-generated method stubswitch(msg.what)case IpMessageConst.IPMSG_SENDMSG:adapter.notifyDataSetChanged();/刷新ListViewbreak;case IpMessageConst.IPMSG_RELEASEFILES: /拒绝接受文件,停止发送文件线程if(NetTcpFileSendThread.server != null)try NetTcpFileSendThread.server.close(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();break;case UsedConst.FILESENDSUCCESS:/文件发送成功makeTextShort(文件发送成功);break;/end of switchOverridepublic boolean receive(ChatMessage msg) / TODO Auto-generated method stubif(receiverIp.equals(msg.getSenderIp()/若消息与本activity有关,则接收msgList.add(msg);/将此消息添加到显示list中sendEmptyMessage(IpMessageConst.IPMSG_SENDMSG); /使用handle通知,来更新UIMyFeiGeBaseActivity.playMsg();return true;return false;Overridepublic void finish() / TODO Auto-generated method stub/一定要移除,不然信息接收会出现问题netThreadHelper.removeReceiveMsgListener(this);super.finish();Overridepublic void onClick(View v) / TODO Auto-generated method stubif(v = chat_send)sendAndAddMessage();else if(v = chat_quit)finish();/* * 发送消息并将该消息添加到UI显示 */private void sendAndAddMessage()String msgStr = chat_input.getText().toString().trim();if(!.equals(msgStr)/发送消息IpMessageProtocol sendMsg = new IpMessageProtocol();sendMsg.setVersion(String.valueOf(IpMessageConst.VERSION);sendMsg.setSenderName(selfName);sendMsg.setSenderHost(selfGroup);sendMsg.setCommandNo(IpMessageConst.IPMSG_SENDMSG);sendMsg.setAdditionalSection(msgStr);InetAddress sendto = null;try sendto = InetAddress.getByName(receiverIp); catch (UnknownHostException e) / TODO Auto-generated catch blockLog.e(MyFeiGeChatActivity, 发送地址有误);if(sendto != null)netThreadHelper.sendUdpData(sendMsg.getProtocolString() + 0, sendto, IpMessageConst.PORT);/添加消息到显示listChatMessage selfMsg = new ChatMessage(localhost, selfName, msgStr, new Date();selfMsg.setSelfMsg(true);/设置为自身消息msgList.add(selfMsg);elsemakeTextShort(不能发送空内容);chat_input.setText();adapter.notifyDataSetChanged();/更新UIOverridepublic boolean onCreateOptionsMenu(Menu menu) / TODO Auto-generated method stubsuper.onCreateOptionsMenu(menu);menu.add(0, MENU_ITEM_SENDFILE, 0, 发送文件);menu.add(0, MENU_ITEM_EXIT, 0, 退出);return true;Overridepublic boolean onOpt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 质量异常处理流程培训
- 《奇趣生物》课件
- 边境承包鱼塘合同协议
- 车位营销策划合同协议
- 轻质防爆墙销售合同协议
- 车位租赁合同安全协议
- 协议书楼盘认筹协议书
- 速贷超期合同解除协议
- 产品研发战略合作协议说明与说明
- 专业艺术品展览馆销售合同
- 国土空间规划与自然资源“一张图”构建的理论方法和实践
- 全国青少年电子信息智能创新大赛图形化编程(必做题模拟三卷)
- 2022秋“1530”安全教育记录
- 2023学年度六年级语文下册期末复习(根据课文内容填空)
- 2023学年完整公开课版虎皮鹦鹉
- 共产主义原理
- 内科培训计划
- GRR分析表格模板
- 抚顺东科精细化工有限公司 15万吨-年减水剂单体、3万吨-年表面活性剂系列产品及16万吨-年碳酸酯 系列产品建设项环境影响报告
- 产品需求文档(PRD)模板
- 2022新教科版科学五下全册教案、全册教学反思(表格式)
评论
0/150
提交评论