zoukankan      html  css  js  c++  java
  • WebSocket 的简单用例

      WebSoket 相较于 HTTP ,有以下优点:

      1、包头更短。在建立长连接等需要轮询发送请求确认连接状态的情况下,包头的减小使得服务端压力更小,节省服务端资源。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。

      2、全双工。虽然 HTTP 本身便是基于 TCP 协议的,但是 HTTP 的 请求-应答 机制先天限制了服务端主动向客户端发送数据。

      3、有状态连接。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息。  

      4、更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。

      5、可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。

      6、更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

      使用 JAVA 写一个服务端:

    package learning.websocket;
    
    import org.java_websocket.WebSocket;
    import org.java_websocket.handshake.ClientHandshake;
    import org.java_websocket.server.WebSocketServer;
    
    import java.net.InetSocketAddress;
    import java.net.UnknownHostException;
    
    public class MyWebSocketServer extends WebSocketServer {
        public MyWebSocketServer(int port) throws UnknownHostException {
            super(new InetSocketAddress(port));
            System.out.println("webSocketServer started at port: " + port);
        }
    
        @Override
        public void onOpen(WebSocket webSocket, ClientHandshake clientHandshake) {
            System.out.println("new connect with : " + webSocket.getRemoteSocketAddress().getAddress());
        }
    
        @Override
        public void onClose(WebSocket webSocket, int i, String s, boolean b) {
            System.out.println("connect closed : " + webSocket.getRemoteSocketAddress().getAddress());
        }
    
        @Override
        public void onMessage(WebSocket webSocket, String s) {
            System.out.println("new Message : " + s);
            webSocket.send(" server has recived message : " + s);
        }
    
        @Override
        public void onError(WebSocket webSocket, Exception e) {
    
        }
    
        @Override
        public void onStart() {
    
        }
    
        public static void main(String[] args) throws Exception {
            new MyWebSocketServer(9000).start();
        }
    }

      JS 写一个客户端:

    function WebSocketTest(msg) {
        if ("WebSocket" in window) {
            var ws = new WebSocket("ws://localhost:9000");
            ws.onopen = function () {
                ws.send(msg);
            };
            ws.onmessage = function (evt) {
                alert("recive message : " + evt.data);
            };
            ws.onclose = function () {
                alert("connection closed");
            };
            return ws;
        } else {
            alert("您的浏览器不支持 WebSocket!");
        }
    }
    
    var ws = WebSocketTest('build connect');
    if (ws.readyState == 1) {
        ws.send("斯巴达!");
    } else {
        setTimeout('ws.send("斯巴达!")', 500);
    }

  • 相关阅读:
    uni-app中使用Echarts绘画图表
    css设置Overflow实现隐藏滚动条的同时又可以滚动
    JS判断在哪一端浏览器打开
    ElementUI分页Pagination自动到第一页
    第203场周赛
    TreeSet使用
    155 最小栈
    234 回文链表
    141 环形链表
    2 两数相加
  • 原文地址:https://www.cnblogs.com/niuyourou/p/14070380.html
Copyright © 2011-2022 走看看