websocket

作者: Vinson武 | 来源:发表于2020-04-28 18:07 被阅读0次
    websocket 和socket区别
    1. websocket是应用层的协议,而socket是传输控制层的协议.  
    
    websocket 和http区别

    相同点:

    1. 都是应用层的协议

    2. 都是基于tcp,并且都是可靠的协议

    不同点:

    1 .websocket是持久连接的协议,而http是非持久连接的协议.
    
    2. websocket是双向通信协议,模拟socket协议,可以双向发送消息,而http是单向的.
    
    3 . websocket的服务端可以主动向客服端发送信息,而http的服务端只有在客户端发起请求时才能发送数据,无法主动向客户端发送信息.
    

    什么是WebSocket?

    一个WebSocket是通过一个独立的TCP连接实现的、异步的、双向的、全双工的消息传递实现机制。WebSockets不是一个HTTP连接,却使用HTTP来引导一个WebSocket连接。一个全双工的系统允许同时进行双向的通讯。陆地线路电话是一个全双工设施的例子,因为它们允许两个通话者同时讲话并被对方听到。最初WebSocket被提议作为HTML5规范的一部分,HTML5承诺给现代的交互式的web应用带来开发上的便利和网络效率,但是随后WebSocket被移到一个仅用来存放WebSockets规范的独立的标准文档里。它包含两件事情 -- WebSocket协议规范,即2011年12月发布的RFC 6455,和WebSocket JavaScript API。

    WebSocket是如何工作的?

    每一个WebSocket连接的生命都是从一个HTTP请求开始的。HTTP请求跟其他请求很类似,除了它拥有一个Upgrade头信息。Upgrade头信息表示一个客户端希望把连接升级为不同的协议。对WebSockets来说,它希望升级为WebSocket协议。当客户端和服务器通过底层连接第一次握手时,WebSocket连接通过把HTTP协议转换升级为WebSockets协议而得以建立。一旦WebSocket连接成功建立,消息就可以在客户端和服务器之间进行双向发送

    public class WsServer extends WebSocketServer {
        public WsServer(int port) {
            super(new InetSocketAddress(port));
        }
    
        public WsServer(InetSocketAddress address) {
            super(address);
        }
    
        @Override
        public void onOpen(WebSocket conn, ClientHandshake handshake) {
            // ws连接的时候触发的代码,onOpen中我们不做任何操作
    
        }
    
        @Override
        public void onClose(WebSocket conn, int code, String reason, boolean remote) {
            //断开连接时候触发代码
            userLeave(conn);
            System.out.println(reason);
        }
    
        @Override
        public void onMessage(WebSocket conn, String message) {
            System.out.println(message);
            if(null != message &&message.startsWith("online")){
                String userName=message.replaceFirst("online", message);//用户名
                userJoin(conn,userName);//用户加入
            }else if(null != message && message.startsWith("offline")){
                userLeave(conn);
            }
    
        }
    
        @Override
        public void onError(WebSocket conn, Exception ex) {
            //错误时候触发的代码
            System.out.println("on error");
            ex.printStackTrace();
        }
        /**
         * 去除掉失效的websocket链接
         * @param conn
         */
        private void userLeave(WebSocket conn){
            WsPool.removeUser(conn);
        }
        /**
         * 将websocket加入用户池
         * @param conn
         * @param userName
         */
        private void userJoin(WebSocket conn,String userName){
            WsPool.addUser(userName, conn);
        }
    
    }
    

    相关文章

      网友评论

          本文标题:websocket

          本文链接:https://www.haomeiwen.com/subject/lgybwhtx.html