版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在Android中使用Websocket实现一个聊天室
这期内容当中在下将会给大家带来有关怎么在Android中使用Websocket实现一个聊天室,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。WebSocket有以下几个特点
1.支持WebSocketRFC6455,DraftHybi-10+andWAMPv12.支持Android2.2以上3.非常好的兼容性4.高性能的异步设计5.非常容易使用的api6.与Androidapp非常好的结合7.没有网络操作在UI线程8.开源下面是官网给的一段示例代码private
final
WebSocketConnection
mConnection
=
new
WebSocketConnection();
private
void
start()
{
final
String
wsuri
=
"ws://localhost:9000";
try
{
mConnection.connect(wsuri,
new
WebSocketHandler()
{
@Override
public
void
onOpen()
{
Log.d(TAG,
"Status:
Connected
to
"
+
wsuri);
mConnection.sendTextMessage("Hello,
world!");
}
@Override
public
void
onTextMessage(String
payload)
{
Log.d(TAG,
"Got
echo:
"
+
payload);
}
@Override
public
void
onClose(int
code,
String
reason)
{
Log.d(TAG,
"Connection
lost.");
}
});
}
catch
(WebSocketException
e)
{
Log.d(TAG,
e.toString());
}
}是不是挺简单的,在onOpen()方法中做与服务器连接的操作,onTextMessage()是收到服务器发送给客服端的消息,onClose()是与服务器断开走的方法,发送消息用sendTextMessage()。我是在MsgService实现与服务器的连接与发送消息的,直接上代码:public
class
MsgService
extends
Service
{
private
final
IBinder
binder
=
new
MsgBinder();
private
boolean
flag
=
false;
private
WebSocketConnection
mConnection;
private
Intent
intent
=
new
Intent("munication.RECEIVER");
public
void
startSocket(String
sn)
{
final
String
wsuri
=
"ws://localhost:9000";
final
JSONObject
json
=
new
JSONObject();
try
{
json.put("type",
"command");
json.put("command",
"auth");
json.put("key",
Constants.API_KEY);
json.put("access_token",
UserManager.getInstance().getUser()
.getUserAccessToken());
json.put("user_token",
UserManager.getInstance().getUser()
.getLYUserToken());
json.put("sn",
sn);
}
catch
(Exception
e)
{
e.printStackTrace();
}
try
{
mConnection.connect(wsuri,
new
WebSocketHandler()
{
@Override
public
void
onOpen()
{
if
(!flag)
{
//与服务器连接认证
mConnection.sendTextMessage(json.toString());
}
else
{
}
}
@Override
public
void
onTextMessage(String
payload)
{
intent.putExtra("message",
payload);
sendBroadcast(intent);//发送广播给Fragment
}
@Override
public
void
onClose(int
code,
String
reason)
{
//连接失败也把效应的提示信息告诉用户
Map<String,
String>
map
=
new
HashMap<>();
map.put("status",
"failed");
map.put("type",
"command");
map.put("command",
"auth");
String
msg
=
map.toString();
intent.putExtra("message",
msg);
sendBroadcast(intent);
}
});
}
catch
(WebSocketException
e)
{
e.printStackTrace();
}
}
//发送消息的方法
public
void
sendMessage(String
message)
{
mConnection.sendTextMessage(message);
}
@Override
public
IBinder
onBind(Intent
intent)
{
return
binder;
}
@Override
public
void
onCreate()
{
mConnection
=
new
WebSocketConnection();
super.onCreate();
}
@Override
public
int
onStartCommand(Intent
intent,
int
flags,
int
startId)
{
return
super.onStartCommand(intent,
flags,
startId);
}
public
class
MsgBinder
extends
Binder
{
/**
*
获取当前Service的实例
*
*
@return
*/
public
MsgService
getService()
{
return
MsgService.this;
}
}
@Override
public
void
onDestroy()
{
super.onDestroy();
mConnection.disconnect();
}
}下面是Fragment的代码public
class
ChatRoomFragment
extends
Fragment
{
private
View
view,
rootView,
headView;
private
MsgService
msgService;
private
UListView
chatlist;//因为ScrollVie与ListView有冲突,重写了ListView
private
static
List<ChatMessage>
mlist;
private
ChatMessage
chatMessage;
private
ChatMessageAdapter
chatMessageAdapter;
private
ScrollView
scrollView;
private
Handler
handler
=
new
Handler()
{
public
void
handleMessage(Message
msg)
{
switch
(msg.what)
{
case
1:
msgService
.startSocket(((PlayActivity)
getActivity()).getSn());
break;
default:
break;
}
}
};
//通过聊天室来更新在线人数
public
interface
UpdataOnlineUsersListener
{
public
void
updataOnlineUser(int
number);
}
private
UpdataOnlineUsersListener
mCallback;
private
EditText
messageEditText;
private
Button
sendBtn;
private
Intent
mIntent;
private
MsgReceiver
msgReceiver;
private
ServiceConnection
conn
=
new
ServiceConnection()
{
@Override
public
void
onServiceDisconnected(ComponentName
name)
{
Log.d("time",
"msg");
}
@Override
public
void
onServiceConnected(ComponentName
name,
IBinder
service)
{
//
返回一个MsgService对象
MsgService.MsgBinder
binder
=
(MsgService.MsgBinder)
service;
if
(binder
!=
null)
{
Log.d("time",
"msg");
}
msgService
=
binder.getService();
if
(msgService
!=
null)
{
Log.d("time",
"msg");
Message
msg
=
new
Message();
msg.what
=
1;
handler.sendMessage(msg);
}
}
};
public
View
onCreateView(LayoutInflater
inflater,
ViewGroup
container,
Bundle
savedInstanceState)
{
view
=
inflater.inflate(R.layout.fragment_chat_room,
container,
false);
return
view;
}
public
void
bindChatService()
{
getActivity().bindService(mIntent,
conn,
Context.BIND_AUTO_CREATE);
}
public
void
destoryChatService()
{
getActivity().unbindService(conn);
}
@Override
public
void
onAttach(Activity
activity)
{
super.onAttach(activity);
mCallback
=
(UpdataOnlineUsersListener)
(activity);
}
@Override
public
void
onActivityCreated(Bundle
savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
//
动态注册广播接收器
msgReceiver
=
new
MsgReceiver();
IntentFilter
intentFilter
=
new
IntentFilter();
intentFilter.addAction("munication.RECEIVER");
getActivity().registerReceiver(msgReceiver,
intentFilter);
mIntent
=
new
Intent(getActivity(),
MsgService.class);
bindChatService();
chatlist
=
(UListView)
view.findViewById(R.id.chatlist);
messageEditText
=
(EditText)
view.findViewById(R.id.input);
scrollView
=
(ScrollView)
view.findViewById(R.id.scroll);
scrollView.setFocusable(false);
mlist
=
new
ArrayList<ChatMessage>();
chatMessageAdapter
=
new
ChatMessageAdapter(mlist,
getActivity());
chatlist.setAdapter(chatMessageAdapter);
chatlist.setVerticalScrollBarEnabled(true);
sendBtn
=
(Button)
view.findViewById(R.id.send);
builder
=
new
AlertDialog.Builder(getActivity());
sendBtn.setOnClickListener(new
OnClickListener()
{
@Override
public
void
onClick(View
v)
{
final
View
view
=
v;
if
(UserManager.getInstance().getUser().getGuest())
{
ToastUtil.getInstance().showToast(getActivity(),
getResources().getString(R.string.is_not_login));
}
else
{
String
message
=
messageEditText.getText().toString();
if
(!message.equals(""))
{
JSONObject
json
=
new
JSONObject();
try
{
json.put("type",
"message");
json.put("to",
"");
json.put("message",
message);
}
catch
(Exception
e)
{
}
msgService.sendMessage(json.toString());
}
else
{
Toast.makeText(getActivity(),
getResources().getString(R.string.textisnull),
Toast.LENGTH_SHORT).show();
}
}
HideKeyboard(v);
messageEditText.setText("");
}
});
rootView
=
(View)
view.findViewById(R.id.rootview);
rootView.setFocusable(true);
rootView.setFocusableInTouchMode(true);
rootView.requestFocus();
setRetainInstance(true);
}
//隐藏软键盘
private
void
HideKeyboard(View
v)
{
InputMethodManager
imm
=
(InputMethodManager)
v.getContext()
.getSystemService(Context.INPUT_METHOD_SERVICE);
if
(imm.isActive())
{
imm.hideSoftInputFromWindow(v.getApplicationWindowToken(),
0);
}
}
@Override
public
void
onResume()
{
super.onResume();
scrollView.smoothScrollTo(0,
0);
}
//接受服务端发送的消息
public
class
MsgReceiver
extends
BroadcastReceiver
{
@Override
public
void
onReceive(Context
context,
Intent
intent)
{
String
msg
=
intent.getStringExtra("message");
try
{
JSONObject
json
=
new
JSONObject(msg);
if
(json.getString("type").equals("command"))
{
String
command
=
json.getString("command");
if
(command.equals("auth"))
{
{
chatMessage
=
new
ChatMessage("tips",
"服务器连接中...",
"111",
"111");
mlist.add(chatMessage);
chatMessageAdapter.notifyDataSetChanged();
}
if
(json.getString("status").equals("success"))
{
chatMessage
=
new
ChatMessage("tips",
"服务器连接中成功",
"111",
"111");
}
else
{
chatMessage
=
n
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五金材料合同范本
- 砖砌蓄水池施工方案
- 工程机械设备合同
- 口腔颌面部囊肿Thecystsoforalregion
- 二年级上册数学期末测试卷含下载答案
- 小学三年级上册数学期末测试卷ab卷
- 人教版小学四年级下册数学期末测试卷答案下载
- 小学三年级上册数学期末测试卷加解析答案
- 小学四年级下册数学期末测试卷含答案
- 人教版三年级上册数学期末测试卷附参考答案(完整版)
- 东南亚ICT市场分析报告-培训课件
- 保安服务项目投标方案
- 智能电网变电设备相关项目实施方案
- DB32T 4725-2024池塘养殖尾水生态处理技术规范
- 化工厂化验培训
- MOOC 地球科学概论-中国地质大学(武汉) 中国大学慕课答案
- 2024-2030年中国SOC芯片及系统集成产品市场前景预测及投资规划研究报告
- 2024-2029年中国刹车鼓行业发展前景分析及趋势预测报告预测
- 2024年中考语文【热点重点难点】专练(北京专用)热点08古诗文默写(原卷版+解析)
- 大单元视域下小学语文的单篇教学
- 新能源汽车的物流运输应用分析
评论
0/150
提交评论