Android端用webSocket完成实时聊天的工作任务
导读:android端实现websocket通信,我只是会用的程度,与之分享
1.添加网路权限
在AndroidManifest.xml下添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
2.添加依赖库
在build.gradle (module:app)添加java-websocket库
dependencies{
compile 'org.java-websocket:Java-WebSocket:1.3.0'
}
3.初始化webSocke,handler
在onCreate()调用initWebSocket()
/**
* 申明 websocket
*/
private WebSocketClient mSocketClient;
/**
* 处理websocket推来的消息
*/
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//打开通道
Log.d("sll===", "打开通道" + msg.obj);
break;
case 1:
//接收消息
Log.d("sll===ws推送的消息:", msg.obj + "");
//消息处理,将返回的json数据进行处理
break;
case 2:
//通道关闭
Log.d("sll===ws通道关闭:", msg.obj+"");
break;
}
}
};
/**
* 在onCreate()调用初始化webSocket()
**/
private void initWebSocket() {
new Thread(new Runnable() {
@Override
public void run() {
try {
mSocketClient = new WebSocketClient(
//url后台开发会给你的ws开头的网址,替换成你的地址
new URI("ws://192.168.250.38:8181/"),new Draft_17()) {
@Override
public void onOpen(ServerHandshake handshakedata) {
Log.d("sll===", "打开通道" + handshakedata.getHttpStatus());
handler.obtainMessage(0, handshakedata.getHttpStatus()).sendToTarget();
}
@Override
public void onMessage(String message) {
Log.d("sll===", "接收消息" + message);
handler.obtainMessage(1, message).sendToTarget();
}
@Override
public void onClose(int code, String reason, boolean remote) {
Log.d("sll===", "通道关闭");
handler.obtainMessage(2, reason).sendToTarget();
}
@Override
public void onError(Exception ex) {
Log.d("sll===", "链接错误");
}
};
mSocketClient.connect();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
}).start();
}
4.断网后重连
在onCreate()注册广播接收器
// 注册广播接收器器来跟踪网络连接的变化。
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
receiver = new NetworkReceiver();
this.registerReceiver(receiver, filter);
广播接收器的代码
/**
* 是否是离线状态
*/
private boolean isHaveOffline = false;
//是否连上网
public boolean isOnline() {
ConnectivityManager connMgr = (ConnectivityManager)
getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
}
class NetworkReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(isOnline()){
Log.d("sll===", "连上网了...");
if(isHaveOffline){
if(!mSocketClient.getConnection().isOpen()){
Log.d("sll===", "再连一次...");
//再连一次
mSocketClient=null;
initWebSocket();
//to do things
Log.d("sll===", "连上ws。。。。");
}
}
}else {
Log.d("sll===", "网络不可用...");
isHaveOffline = true;
}
}
}