HTTP
是单向的,客户端发送请求,服务器发送响应。举例来说,当客户端向服务器发送请求时,该请求以HTTP
或HTTPS
的形式发送,在接收到请求后,服务器会将响应发送给客户端。每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭。每个HTTP
或HTTPS
请求每次都会新建与服务器的连接,并且在获得响应后,连接将自行终止。 HTTP
是在TCP
之上运行的无状态协议,TCP
是一种面向连接的协议,它使用三向握手方法保证数据包传输的传递并重新传输丢失的数据包。
WebSocket
是双向的,在客户端-服务器通信的场景中使用的全双工协议,与HTTP
不同,它以ws://
或wss://
开头。它是一个有状态协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被任何一方(客户端或服务器)终止。在通过客户端和服务器中的任何一方关闭连接之后,连接将从两端终止。
何时使用WebSocket
- 即时
Web
应用程序:即时Web
应用程序使用一个Web
套接字在客户端显示数据,这些数据由后端服务器连续发送。在WebSocke
t中,数据被连续推送/传输到已经打开的同一连接中,这就是为什么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();
}
}