[计算机软件及应用]Android Socket聊天工具.doc
《[计算机软件及应用]Android Socket聊天工具.doc》由会员分享,可在线阅读,更多相关《[计算机软件及应用]Android Socket聊天工具.doc(44页珍藏版)》请在三一文库上搜索。
1、 Android Socket 聊天工具 -一个服务端实现多个客户端间通信 程序开源,共同学习。最近在学Android,做了一个由Socket实现的基于TCP协议的聊天工具,用一个服务端支持多个客户端之间的交流 通信。虽然本人之前做过蓝牙控制小车的软件,但这次做起来也花了不少时间。没办法,谁叫本人还是只菜鸟,所以下面有哪些说得不当的地方,还请各位多多包涵!如果某位朋友也打算做这个Socket聊天工具,本人有个小小的建议,你可以不必太着急些代码,先想清楚自己最终要做到怎样效果,然后把自己的思路都写下来,有一个基本的实现方法。在写代码时就按照自己的思路一步一步地写下去,这样可以很好地避免写代码时由
2、于思路不清左删右改。以下是本人程序的设计思路 客户端设计思路: 一 用户登录界面1 用一个EditText作为用户名输入口,用一个按键确定。2 注册一个广播接收器,专门接收由后来的聊天界面发过来的消息广播(包括发信人,收信人,消息体)。3 创建一个客户端连接服务端的方法(要在线程中启动该方法),连接成功并获取输入输出流以后,再在里面启动一个输入流管理线程(接受并处理由服务端发送过来的消息)。并通过intent启动下一个好友列表界面(同时把自身用户名发给下一界面)。4 对于输入流管理线程,要先判断接收到的是好友名单还是聊天消息发送两种广播,(服务端发送两种信息时可以加个标签以便线程区分)。然后分
3、发出两种广播,一种广播后面的好友列表界面接受的在线好友名单,另一种广播出聊天界面接收的聊天信息。5 在菜单下做一个退出Activity按键,方便用户退出程序。6 当一切准备好以后,用户在输入用户名并点击确定,就可以实现以上操作,同时进入了好友列表界面(前提是能正确连接上服务端)。 二 好友列表界面1 注册一个广播接收器,专门接收由登录界面的输入流管理线程发送过来的好友名单广播2 用listView逐个显示好友名单。3 获取用户登录界面发过来的自身用户名。4 给listView绑定一个监听器,当用户点击listView上的某一好友时,通过intent启动下一个聊天界面,并把所点击到的好友用户名以
4、及自身用户名发给下一个界面。 三 聊天界面1 获取好友列表界面发送过来的聊天好友用户名以及自身用户名,并在Title上显示。2 用一个EditText作为聊天消息输入口,用一个按键确定输出。3 当用户点击确定以后,发送一个消息广播(包含发信人,收信人,消息体),让用户登录界面的消息广播接收器接收。4 注册一个广播接收器接受用户登录界面的输入流管理线程发送过来的消息。 服务端设计思路: 消息处理界面(只有一个界面)1 创建一个监听连接请求方法 (监听客户端发送连接请求,需要在线程中启动)。 A 当用户发送连接请求时,生成socket对象。由该socket对象生成输出流和输入流,从输入流中提取出客
5、户端发送过来的用户名,把用户名放到sickName数组上,把输出流放在ArrayOut数组中。 B 发送新客户端XXX连接成功广播。 C 预先用sickName数组和ArrayOut数组创建发送好友列表方法(给各已连接客户端发送好友名单),在这里调用方法。 D 新生成并启动输入流管理线程(接受并处理客户端发送过来的消息,由于有一个新用户生成,就新生一个输入流管理线程,所以客户端发送的消息不会混乱)。2 创建发送好友列表方法。3 注册两个广播接收器,一个接收新客户端XXX连接成功广播;另一个接收输入流管理线程发送过来的聊天消息,识别出目标对象,并向目标对象分别发送消息。4 在onResume方法
6、中启动监听线程。5 在菜单下做一个退出Activity按键和刷新按钮(再次发送已连接用户名单给各客户端)。 可完善地方: 可考虑好友退出时显示离线。 非正在聊天好友发送信息时提醒。 只要登录了,未接信息可以一直保存,当进入聊天界面时可以再度显示。 可考虑添加LQ头像与聊天表情。 。 /*/客户端代码:1 用户登录界面package cn.text2;import java.io.BufferedWriter;import java.io.OutputStreamWriter;import java.io.PrintWriter;import .InetAddress;import .Socke
7、t;import android.app.Activity;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.widget.Button
8、;import android.widget.EditText;public class Text2Activity extends Activity Button buttonSure; Button buttonDump; EditText editTextName; PrintWriter output ; Text2Helper text2helper; int k = 0; /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState)
9、super.onCreate(savedInstanceState); setContentView(R.layout.main); buttonSure = (Button)findViewById(R.id.buttonSure); editTextName = (EditText)findViewById(R.id.editTextName); /*确定按键*/ public void buttonsure(View v) new Thread() public void run() Connect(); System.out.println(注册Text2ClientActivity的
10、发送信息广播); .start(); System.out.println(注册Text2ClientActivity的发送信息广播); OpenBroadcastReceiver(); /*注册广播方法*/ public void OpenBroadcastReceiver() /生成BroadcastReceiver对象 Text2ClientActivityReceiver Receiver = new Text2ClientActivityReceiver(); /生成过滤器IntentFilter对象 IntentFilter filter = new IntentFilter();
11、 /为过滤器添加识别标签 filter.addAction(android.intent.action.VOICE_COMMAND);/读取Text2ClientActivity的发送信息广播 /接收广播状态 Text2Activity.this.registerReceiver(Receiver, filter); System.out.println(注册广播完成!); /*广播接收器类*/专门读取Text2ClientActivity的发送信息广播 public class Text2ClientActivityReceiver extends BroadcastReceiver Ove
12、rride public void onReceive(Context context, Intent intent) / TODO Auto-generated method stub String yourself = intent.getStringExtra(SendYourself);/接收要发送的对象名称以及信息 String target = intent.getStringExtra(SendTarget); String message = intent.getStringExtra(SendMessage); if(k0) output.println(yourself);
13、 /yourself output.flush(); output.println(target); /target output.flush(); output.println(message); /内容 output.flush(); System.out.println(接收器接收到Text2ClientActivity的广播,并发送到服务端); /*启动客户端方法*/ public void Connect() try InetAddress addr = InetAddress.getByName(192.168.22.10);/服务端手机网络IP地址,连一下wifi就可以知道 Sy
14、stem.out.println(客户端发出请求); /客户端向服务端发出连接请求 Socket socket = new Socket(addr,6666); System.out.println(连接成功,socket= + socket); /通过该条socket通道得到输出流 output = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), true); System.out.println(输出流获取成功); output.println(editTextName.
15、getEditableText().toString(); output.flush(); k+; /启动getMessage线程 text2helper = new Text2Helper(socket,this); /生成新的CGetMessage对象即调用一次CGetMessage Thread gt = new Thread(text2helper); gt.start(); /*跳转到下一个FriendListActivity*/ Intent intentdump =new Intent(); intentdump.putExtra(ClientName,editTextName.
16、getText().toString(); intentdump.setClass(Text2Activity.this, Text2FriendActivity.class); Text2Activity.this.startActivity(intentdump); catch (Exception e) e.printStackTrace(); /*菜单功能*/ Override public boolean onCreateOptionsMenu(Menu menu) menu.add(0,1,1,退出); menu.add(0,2,2,连接); return true; Overri
17、de public boolean onMenuItemSelected(int featureId, MenuItem item) if(item.getItemId() = 1) finish(); if(item.getItemId() = 2) new Thread() public void run() Connect(); .start(); return super.onMenuItemSelected(featureId, item); 2 好友列表界面package cn.text2;import java.util.ArrayList;import java.util.Ha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件及应用 计算机软件及应用Android Socket聊天工具 计算机软件 应用 Android Socket 聊天工具
链接地址:https://www.31doc.com/p-1991441.html