java开发-WebSocket长连接

╄→гoц情女王★ 提交于 2020-04-28 05:29:21
基础内容

这个项目包含使用100%Java编写的准系统WebSocket服务器和客户端实现。 底层类是java.nio实现的,它允许非阻塞事件驱动模型(类似于Web浏览器的WebSocket API)。

视点1:

    WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。【3】

    WebSocket解决了浏览器客户端-服务器通信低效(低速、低效)的问题,提供了一种高效的长连接通信模式。

视点2:

我们知道,传统的HTTP协议是无状态的,每次请求(request)都要由客户端(如 浏览器)主动发起,服务端进行处理后返回response结果,而服务端很难主动向客户端发送数据;这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应 用。在WebSocket规范提出之前,开发人员若要实现这些实时性较强的功能,经常会使用折衷的解决方法:轮询(polling)和Comet技术。其实后者本质上也是一种轮询,只不过有所改进。

轮询是最原始的实现实时Web应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。明显地,这种方法会导致过多不必要的请求,浪费流量和服务器资源。【4】

 

代码部分

S1.添加到项目

下载Java-WebSocket-1.3.8.jar包

https://github.com/TooTallNate/Java-WebSocket/releases  

添加Java-WebSocket-1.3.8.jar包或直接添加源码到工程libs目录,add as library;

 

S2.使用

//1.参考官方提供的示例example

//2.实用范例

//创建WebSocketService

/**

 * WebSocket service 服务端

 *  https://github.com/TooTallNate/Java-WebSocket

 */

public class WebSocketService extends WebSocketServer {

    private static int counter = 0;

 

    public WebSocketService(int port, Draft d) throws UnknownHostException {

        super(new InetSocketAddress(port), Collections.singletonList(d));

    }

 

    public WebSocketService(InetSocketAddress address, Draft d) {

        super(address, Collections.singletonList(d));

    }

 

    @Override

    public void onOpen(WebSocket conn, ClientHandshake handshake) {

        counter++;

        System.out.print("WebSocket Opened connection number" + counter);

        System.out.print("WebSocket onOpen:" + conn.getRemoteSocketAddress().getAddress().getHostAddress());

    }

 

    @Override

    public void onClose(WebSocket conn, int code, String reason, boolean remote) {

        System.out.print("WebSocket closed:" + conn.getRemoteSocketAddress().getAddress().getHostAddress());

    }

 

    @Override

    public void onError(WebSocket conn, Exception ex) {

        ex.printStackTrace();

        System.out.print("WebSocket Error:" + ex.getMessage());

    }

 

    @Override

    public void onStart() {

        System.out.print("WebSocket Server started!");

    }

 

    @Override

    public void onMessage(WebSocket conn, String message) {

        conn.send(message);

    }

 

    @Override

    public void onMessage(WebSocket conn, ByteBuffer blob) {

        conn.send(blob);

    }

 

    @Override

    public void onWebsocketMessageFragment(WebSocket conn, Framedata frame) {

        FramedataImpl1 builder = (FramedataImpl1) frame;

        builder.setTransferemasked(false);

        conn.sendFrame(frame);

    }

}

//启动WebSocketService

        WebSocketService webSocketService = null;

        try {

            webSocketService = new WebSocketService(9002, new Draft_6455());

            webSocketService.setConnectionLostTimeout(0);

            webSocketService.start();

        } catch (UnknownHostException e) {

            e.printStackTrace();

        }

 

 

//客户端js

var ws = new WebSocket("wss://echo.websocket.org");

 

ws.onopen = function(evt) {

  console.log("Connection open ...");

  ws.send("Hello WebSockets!");

};

 

ws.onmessage = function(evt) {

  console.log( "Received Message: " + evt.data);

  ws.close();

};

 

ws.onclose = function(evt) {

  console.log("Connection closed.");

}; 

 

 

 

Ref:

1. https://github.com/TooTallNate/Java-WebSocket  

2. https://github.com/TooTallNate/Java-WebSocket/releases  

3. http://www.ruanyifeng.com/blog/2017/05/websocket.html

4. Java后端WebSocket的Tomcat实现

5. java中websocket的应用

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!