HTTP WS 区别

HTTP是单向的,客户端发送请求,服务器发送响应。举例来说,当客户端向服务器发送请求时,该请求以HTTPHTTPS的形式发送,在接收到请求后,服务器会将响应发送给客户端。每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭。每个HTTPHTTPS请求每次都会新建与服务器的连接,并且在获得响应后,连接将自行终止。 HTTP是在TCP之上运行的无状态协议,TCP是一种面向连接的协议,它使用三向握手方法保证数据包传输的传递并重新传输丢失的数据包。

WebSocket是双向的,在客户端-服务器通信的场景中使用的全双工协议,与HTTP不同,它以ws://wss://开头。它是一个有状态协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被任何一方(客户端或服务器)终止。在通过客户端和服务器中的任何一方关闭连接之后,连接将从两端终止。

何时使用WebSocket

  • 即时Web应用程序:即时Web应用程序使用一个Web套接字在客户端显示数据,这些数据由后端服务器连续发送。在WebSocket中,数据被连续推送/传输到已经打开的同一连接中,这就是为什么WebSocket更快并提高了应用程序性能的原因。 例如在交易网站或比特币交易中,这是最不稳定的事情,它用于显示价格波动,数据被后端服务器使用Web套接字通道连续推送到客户端。
  • 游戏应用程序:在游戏应用程序中,你可能会注意到,服务器会持续接收数据,而不会刷新用户界面。屏幕上的用户界面会自动刷新,而且不需要建立新的连接,因此在WebSocket游戏应用程序中非常有帮助。
  • 聊天应用程序:聊天应用程序仅使用WebSocket建立一次连接,便能在订阅户之间交换,发布和广播消息。它重复使用相同的WebSocket连接,用于发送和接收消息以及一对一的消息传输

何时使用HTTP

 如果我们要获取旧数据,或者只想获取一次数据供应用程序使用,则应该使用HTTP协议,不需要很频繁或仅获取一次的数据可以通过简单的HTTP请求查询

    public static void linkSocket(String url) {
        try {
            WebSocketClient client = new WebSocketClient(new URI(url)) {
                @Override
                public void onOpen(ServerHandshake handshakedata) {
                    Log.e("iffy", "onOpen:" + "------连接成功!!!");
                    System.out.println("onOpen:" + "------连接成功!!!");
                }

                @Override
                public void onMessage(String message) {
                    Log.e("iffy", "onMessage:" + message);
                    System.out.println("onMessage:" + message);

                }

                @Override
                public void onClose(int code, String reason, boolean remote) {
                    Log.e("iffy", "onClose:" + "------连接关闭!!!" + reason);
                    System.out.println("onClose:" + "------连接关闭!!!" + reason);
                }

                @Override
                public void onError(Exception ex) {
                    Log.e("iffy", "onError:" + ex.toString());
                    System.out.println("onError:" + ex.toString());
                }
            };
            // wss需添加
            // 获取一个 SSLContext 实例
            SSLContext sslContext = SSLContext.getInstance("TLS");


            // 返回受信任的X509证书数组。
            X509TrustManager x509m = new X509TrustManager() {
                //该方法检查客户端的证书,若不信任该证书则抛出异常。由于我们不需要对客户端进行认证,
                //因此我们只需要执行默认的信任管理器的这个方法。JSSE中,默认的信任管理器类为TrustManager。
                @Override
                public void checkClientTrusted(X509Certificate[] chain,
                                               String authType) {
                    Log.e("iffy", "checkClientTrusted:" + authType);

                }

                //该方法检查服务器的证书,若不信任该证书同样抛出异常。通过自己实现该方法,可以使之信任我们指定的任何证书。
                //在实现该方法时,也可以简单的不做任何处理,即一个空的函数体,由于不会抛出异常,它就会信任任何证书
                @Override
                public void checkServerTrusted(X509Certificate[] chain,
                                               String authType) {
                    Log.e("iffy", "checkServerTrusted:" + authType);

                }

                //返回受信任的X509证书数组。
                @Override
                public X509Certificate[] getAcceptedIssuers() {
                    Log.e("iffy", "getAcceptedIssuers:");
                    return new X509Certificate[0];
                }
            };

            // 初始化 SSLContext 实例 并使用我们指定的信任管理器初始化
            sslContext.init(null, new TrustManager[]{x509m}, new SecureRandom());


            SSLSocketFactory factory = sslContext.getSocketFactory();

            client.setSocket(factory.createSocket());

            client.connect();
        } catch (URISyntaxException | NoSuchAlgorithmException | KeyManagementException | IOException e) {
            e.printStackTrace();
        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值