概述
最近公司项目准备使用WebSocket实现消息推送功能,在网上搜了一下几个支持WebSocket的框架,在使用框架之前简单说一下我对WebSocket的理解:同HTTP协议相似,也是一种协议,我们知道,每种协议有他的长处和短处,HTTP适合接口通信、单次通信,但是如果是聊天这种频繁的通信且不只是客户端请求服务端要求双方都能够给对方发消息的使用HTTP就不怎么合适了,像WebSocket,服务器和客户端建立连接之后就可以自由的通信,双方都可以发送消息,非常爽。这就是我理解他们的区别,值得一提的是,WebSocket也是需要客户端和服务器建立连接,连接的这部分使用的是HTTP的,但是后面的通信部分就和HTTP无关了,有兴趣的自己百度去深究,下面我说一下我调试时使用了几个框架(不清楚哪个好哪个差。。)
1. AndroidAsyn
GitHub地址:https://github.com/koush/AndroidAsync
使用:
Gradle:
dependencies {
compile 'com.koushikdutta.async:androidasync:2.+'
}
使用方式:
AsyncHttpClient.getDefaultInstance().websocket(
"ws://192.168.250.38:8181",// webSocket地址
"8181",// 端口
new AsyncHttpClient.WebSocketConnectCallback() {
@Override
public void onCompleted(Exception ex, WebSocket webSocket) {
if (ex != null) {
ex.printStackTrace();
return;
}
webSocket.send("a string");// 发送消息的方法
webSocket.send(new byte[10]);
webSocket.setStringCallback(new WebSocket.StringCallback() {
public void onStringAvailable(String s) {
Log.i(TAG, "onStringAvailable: " + s);
}
});
webSocket.setDataCallback(new DataCallback() {
public void onDataAvailable(DataEmitter emitter, ByteBufferList byteBufferList) {
System.out.println("I got some bytes!");
// note that this data has been read
byteBufferList.recycle();
}
});
}
});
多么简单粗暴的使用。。。
2.autobahn
官网:http://autobahn.ws/android/,下到jar包放项目里面就好了
使用:
private WebSocketConnection mConnect = new WebSocketConnection();
String url = "ws://192.168.250.38:8181/";
public void init() {
try {
mConnect.connect(url, new WebSocketHandler() {
@Override
public void onOpen() {
Log.i(TAG, "onOpen: ");
}
@Override
public void onTextMessage(String payload) {
Log.i(TAG, "onTextMessage: "+payload);
}
@Override
public void onClose(int code, String reason) {
Log.i(TAG, "onClose: " + code + "|" + reason);
}
});
} catch (WebSocketException e) {
e.printStackTrace();
}
}
同样简单粗暴到不行。。。
3.java-webSocket
GitHub地址:https://github.com/TooTallNate/Java-WebSocket
使用:
private String address = "ws://192.168.250.38:8181/";
private URI uri;
private static final String TAG = "JavaWebSocket";
public void initSockect() {
try {
uri = new URI(address);
} catch (URISyntaxException e) {
e.printStackTrace();
}
if (null == mWebSocketClient) {
mWebSocketClient = new WebSocketClient(uri) {
@Override
public void onOpen(ServerHandshake serverHandshake) {
Log.i(TAG, "onOpen: ");
}
@Override
public void onMessage(String s) {
Log.i(TAG, "onMessage: " + s);
}
@Override
public void onClose(int i, String s, boolean b) {
Log.i(TAG, "onClose: ");
}
@Override
public void onError(Exception e) {
Log.i(TAG, "onError: ");
}
};
mWebSocketClient.connect();
}
}
依然这么。。简单粗暴。。
4.Netty
说明:恕在下无能,其实netty是我最想使用的!它很有名,且它的使用方式,封装方式都是我觉得很好的,而且看了一下网上的性能测试,netty是又快又准,但是网上找不到比较好的关于netty实现webSocket的例子啊,泪崩,试了好几种都不行,有大神会用的希望能教下我。。。