Java-WebSocket实现简单对话示例

       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运行的效果图

 

注意:一定要做好资源管理与释放,这里只是最基本的使用演示,如果想要源码,可以评价留下方式,谢谢。

注:如果感觉有帮助,欢迎扫码关注

Java-WebSocket实现简单对话示例_第1张图片

你可能感兴趣的:(Android基础,随笔,网络开发)