Java-WebSocket是對WebSocket進行封裝的java語言開源框架,用於簡化使用java語言和WebSocket技術建立客戶端與服務端長連接的操作。關於WebSocket,下面是百度百科的一段概述,這裏不做深入分析,重點在該框架的基本使用:
WebSocket是一種在單個TCP連接上進行全雙工通信的協議。WebSocket通信協議於2011年被IETF定爲標準RFC 6455,並由RFC7936補充規範。WebSocketAPI也被W3C定爲標準。
WebSocket使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和服務器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。 [1]
關於整理這個內容主要原因是目前在網絡上查找的基本都是客戶端的使用,基本沒有找到服務端的實現,所以這裏給出了客戶端與服務端的基本使用實現
1,添加依賴
下面我們進入主題,Java-WebSocket開源地址,添加到項目的方式(Android項目):
(1)項目gradle中的repositories中添加
mavenCentral()
比如:
repositories {
google()
jcenter()
mavenCentral()
}
(2)在module依賴中添加
compile "org.java-websocket:Java-WebSocket:1.4.0"
2,使用介紹
2.1 客戶端
實現步驟:
- 自定義消息收發客戶端繼承WebSocketClient,構建自己的構造方法,傳入連接的URI
- 實現以下幾個抽象方法
onOpen():連接成功回調,獲取握手數據
onMessage():接收消息回調,獲取接收數據
onClose():關閉連接回調,獲取關閉信息
onError():連接異常回調,獲取異常信息
- 獲取自定義客戶端實例,調用connect()方法即可,連接成功,即回調onOpen(),否則回調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 服務端
實現步驟如下:
- 自定義服務端繼承WebSocketServer,構建自己的構造方法,傳入服務端口號
- 實現以下幾個抽象方法
onOpen():有客戶端連接回調,回調參數中有連接WebSocket可用於發送消息,可保存通道用於發送數據
onClose():連接斷開回調
onError():連接異常回調
onMessage():接收消息回調,回調參數中有連接WebSocket可用於發送消息,可保存通道用於發送數據
onStart():服務開啓成功回調
- 調用start()方法開啓服務
服務端示例:
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運行的效果圖:
注意:一定要做好資源管理與釋放,這裏只是最基本的使用演示,如果想要源碼,可以評價留下方式,謝謝。
注:如果感覺有幫助,歡迎掃碼關注