Java-WebSocket是对WebSocket进行封装的java语言开源框架,用于简化使用java语言和WebSocket技术建立客户端与服务端长连接的操作。关于WebSocket,下面是百度百科的一段概述,这里不做深入分析,重点在该框架的基本使用:
WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocketAPI也被W3C定为标准。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 [1]
下面我们进入主题,Java-WebSocket开源地址,添加到项目的方式(Android项目):
(1)项目gradle中的repositories中添加
mavenCentral()
比如:
repositories {
google()
jcenter()
mavenCentral()
}
(2)在module依赖中添加
compile "org.java-websocket:Java-WebSocket:1.4.0"
2.1 客户端
实现步骤:
onOpen():连接成功回调,获取握手数据
onMessage():接收消息回调,获取接收数据
onClose():关闭连接回调,获取关闭信息
onError():连接异常回调,获取异常信息
客户端示例:
package aoto.com.client;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;
/**
* author:why
* created on: 2019/7/8 15:54
* description:
*/
public class ChatClient extends WebSocketClient {
private static final String TAG = "ChatClientWhy";
private static volatile ChatClient client = null;
private Handler mHandler;
private ChatClient(URI uri,Handler handler) {
super(uri);
this.mHandler=handler;
}
/**
* DCL
*
* @param uri
* @return
*/
public static ChatClient getInstance(URI uri,Handler handler) {
if (client == null) {
synchronized (ChatClient.class) {
if (client == null) {
client = new ChatClient(uri,handler);
}
}
}
return client;
}
@Override
public void onOpen(ServerHandshake handshakedata) {
Log.e(TAG, "onOpen: "+handshakedata.getHttpStatusMessage());
MessageHelper.sendMsg(mHandler,null,MessageId.OPEN);
}
@Override
public void onMessage(String message) {
Log.e(TAG, "onMessage: "+message);
MessageHelper.sendMsg(mHandler,message,MessageId.SERVER_MSG);
}
@Override
public void onClose(int code, String reason, boolean remote) {
Log.e(TAG, "onClose: ");
MessageHelper.sendMsg(mHandler,null,MessageId.CLOSE);
}
@Override
public void onError(Exception ex) {
Log.e(TAG, "onError: ");
}
}
2.2 服务端
实现步骤如下:
onOpen():有客户端连接回调,回调参数中有连接WebSocket可用于发送消息,可保存通道用于发送数据
onClose():连接断开回调
onError():连接异常回调
onMessage():接收消息回调,回调参数中有连接WebSocket可用于发送消息,可保存通道用于发送数据
onStart():服务开启成功回调
服务端示例:
package aoto.com.server;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import java.net.InetSocketAddress;
/**
* author:why
* created on: 2019/7/8 16:19
* description:
*/
public class ChatServer extends WebSocketServer {
private static final String TAG = "ChatServerWhy";
private Handler mHandler;
private WebSocket webSocket;
public ChatServer(InetSocketAddress address){
super(address);
}
public ChatServer(int port,Handler handler){
super(new InetSocketAddress(port));
this.mHandler=handler;
}
@Override
public void onOpen(WebSocket conn, ClientHandshake handshake) {
Log.e(TAG, "onOpen: "+conn.getLocalSocketAddress().getAddress().getHostAddress() );
MessageHelper.sendMsg(mHandler,null,MessageId.OPEN);
webSocket=conn;
}
@Override
public void onClose(WebSocket conn, int code, String reason, boolean remote) {
Log.e(TAG, "onClose: " );
MessageHelper.sendMsg(mHandler,null,MessageId.CLOSE);
}
@Override
public void onMessage(WebSocket conn, String message) {
Log.e(TAG, "onMessage: "+message );
MessageHelper.sendMsg(mHandler,message,MessageId.CLIENT_MSG);
webSocket=conn;
}
@Override
public void onError(WebSocket conn, Exception ex) {
Log.e(TAG, "onError: "+ex.getMessage() );
}
@Override
public void onStart() {
Log.e(TAG, "onStart: " );
}
public void sendMsg(String content){
if(webSocket!=null) {
webSocket.send(content);
}
else {
Log.e(TAG, "sendMsg: 请先初始化" );
}
}
}
下面看一下Demo运行的效果图:
注意:一定要做好资源管理与释放,这里只是最基本的使用演示,如果想要源码,可以评价留下方式,谢谢。
注:如果感觉有帮助,欢迎扫码关注