java_webSocket实现android消息推送

来源:互联网 发布:淘宝直通车无线端推广 编辑:程序博客网 时间:2024/06/07 00:32

背景

公司的项目是直播相关,很自然的就会有直播间以及聊天的功能,和不少直播一样,我们也选择了环信,环信的接入和使用相对来说挺方便的,但是随着直播间人数的增多,出现了一个很严重的问题,我们称之为异次元,进入直播间看不到别人的互动,自己玩的不亦乐乎,别人也看不到…

考虑到问题的严重性,我们决定换一种方式:webSocket.

webSocket简介

因为是做直播中即时通讯,因此消息的发送将会非常频繁,如果采取http请求,那发送每一条消息,将会新建一个链接并发送,这无疑是致命的,而webSocket是一种新的协议,长连接,一次连接成功后,即可多次发送消息,退出直播间时将连接断开即可,具体可以看这篇文章WebSocket 是什么原理?为什么可以实现持久连接?.

项目使用

1.添加依赖,采用的java_webSocket

compile “org.java-websocket:Java-WebSocket:1.3.0”

2.客户端使用java实现websocket client

public class XZMsgClient extends WebSocketClient{    public XZMsgClient(URI serverURI ) {        super( serverURI, new Draft_17());    }    public void sendMsg(String text) throws NotYetConnectedException {        //write a message        send(text);    }    @Override    public void onOpen( ServerHandshake handshakedata ) {        System.out.println( "opened connection" );        // if you plan to refuse connection based on ip or httpfields overload: onWebsocketHandshakeReceivedAsClient    }    @Override    public void onMessage( String message ) {        message.matches("/^id: (.*)\n(content-type: (.*)\n)?\n/m");    }   /* @Override    public void onFragment( Framedata fragment ) {        System.out.println( "received fragment: " + new String( fragment.getPayloadData().array() ) );    }*/    @Override    public void onClose( int code, String reason, boolean remote ) {        // The codecodes are documented in class org.java_websocket.framing.CloseFrame        System.out.println( "Connection closed by " + ( remote ? "remote peer" : "us" ) );    }    @Override    public void onError( Exception ex ) {        ex.printStackTrace();        // if the error is fatal then onClose will be called additionally    }}

3.创建webSocketClient实例,并重写方法

    /**     * 创建websocket连接     */    private void createWebSocket() {        xzMsgClient = new XZMsgClient(uri) {            @Override            public void onOpen(ServerHandshake handshakedata) {                super.onOpen(handshakedata);                Log.i("Websocket", "Opened");                if (mUser != null) {                    String messageContent = "欢迎 " + mUser.usernickname + " 进入直播间";                    String msg = getJsonMessage(messageContent, Enter_OR_LEAVE, "", "1");                    xzClientSendMessage(msg);                }            }            @Override            public void onMessage(String message) {                super.onMessage(message);                Log.e(TAG, "onMessage: 收到新消息 " + message);                mHandler.post(new Runnable() {                    @Override                    public void run() {                        //处理消息                        dealMessage(message);                    }                });            }            @Override            public void onClose(int code, String reason, boolean remote) {                super.onClose(code, reason, remote);                Log.i("Websocket", "Closed " + reason);            }            @Override            public void onError(Exception ex) {                super.onError(ex);                Log.i("Websocket", "Error " + ex.getMessage());            }        };        xzMsgClient.connect();    }

4.简单说明

  • 服务器:后台使用nchan搭建聊天服务器,同时会提供一个地址给客户端,即uri,客户端创建webSocketClient时将其作为参数传入;
  • uri:websocket协议的uri是将开头的 http换成ws,否则无法连接到聊天服务器;
  • 创建webSocketClient实例后,会调用connect(),连接成功后,才会调用onOpen(),此时进入直播间;
  • 进入直播后,即可调用sendMsg()来发送消息,为保证严谨性,可在发送消息前确定连接成功,

    xzMsgClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)

  • 聊天界面销毁时,将webSocket连接断开即可

参考文章:
1.Java-WebSocket
2.websocket实现android消息推送
3.Android中脱离WebView使用WebSocket实现群聊和推送功能

1 0
原创粉丝点击