哥哥手把手教你使用OKHttp3进行WebSocket长连接
步骤一:
注意,okhttp是3.5以后才添加对WebSocket的支持,以前都是提供了扩展库okhttp-ws,建议使用3.5以上版本。
在项目中添加
implementation 'com.squareup.okhttp3:okhttp:3.8.1'
步骤二:
创建一个内部类,集成okhttp中抽象类WebSocketListener
private final class EchoWebSocketListener extends WebSocketListener {
@Override
public void onOpen(WebSocket webSocket, Response response) {
webSocket.send("hello world");
webSocket.send("welcome");
webSocket.send(ByteString.decodeHex("adef"));
webSocket.close(1000, "再见");
}
@Override
public void onMessage(WebSocket webSocket, String text) {
output("onMessage: " + text);
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
output("onMessage byteString: " + bytes);
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
webSocket.close(1000, null);
output("onClosing: " + code + "/" + reason);
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
output("onClosed: " + code + "/" + reason);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
output("onFailure: " + t.getMessage());
}
}
重写了WebSocketListener中的几个方法,这几个方法很好理解,是用来异步回调的,这里简单说一下:
onOpen当WebSocket和远程建立连接时回调;
两个onMessage就是接收到消息时回调,只是消息内容的类型不同;
onClosing是当远程端暗示没有数据交互时回调(即此时准备关闭,但连接还没有关闭);
onClosed就是当连接已经释放的时候被回调;
onFailure当然是失败时被回调(包括连接失败,发送失败等)。
步骤三:
private void connect() {
EchoWebSocketListener listener = new EchoWebSocketListener();
Request request = new Request.Builder()
.url("ws://echo.websocket.org")
.build();
OkHttpClient client = new OkHttpClient();
client.newWebSocket(request, listener);
client.dispatcher().executorService().shutdown();
}
如果打印成功,就说明整个简单的流程走通啦。