HTTP WS 区别
HTTP是單向的,客戶端發(fā)送請(qǐng)求,服務(wù)器發(fā)送響應(yīng)。舉例來(lái)說(shuō),當(dāng)客戶端向服務(wù)器發(fā)送請(qǐng)求時(shí),該請(qǐng)求以HTTP或HTTPS的形式發(fā)送,在接收到請(qǐng)求后,服務(wù)器會(huì)將響應(yīng)發(fā)送給客戶端。每個(gè)請(qǐng)求都與一個(gè)對(duì)應(yīng)的響應(yīng)相關(guān)聯(lián),在發(fā)送響應(yīng)后客戶端與服務(wù)器的連接會(huì)被關(guān)閉。每個(gè)HTTP或HTTPS請(qǐng)求每次都會(huì)新建與服務(wù)器的連接,并且在獲得響應(yīng)后,連接將自行終止。 HTTP是在TCP之上運(yùn)行的無(wú)狀態(tài)協(xié)議,TCP是一種面向連接的協(xié)議,它使用三向握手方法保證數(shù)據(jù)包傳輸?shù)膫鬟f并重新傳輸丟失的數(shù)據(jù)包。
WebSocket是雙向的,在客戶端-服務(wù)器通信的場(chǎng)景中使用的全雙工協(xié)議,與HTTP不同,它以ws://或wss://開(kāi)頭。它是一個(gè)有狀態(tài)協(xié)議,這意味著客戶端和服務(wù)器之間的連接將保持活動(dòng)狀態(tài),直到被任何一方(客戶端或服務(wù)器)終止。在通過(guò)客戶端和服務(wù)器中的任何一方關(guān)閉連接之后,連接將從兩端終止。
何時(shí)使用WebSocket
- 即時(shí)Web應(yīng)用程序:即時(shí)Web應(yīng)用程序使用一個(gè)Web套接字在客戶端顯示數(shù)據(jù),這些數(shù)據(jù)由后端服務(wù)器連續(xù)發(fā)送。在WebSocket中,數(shù)據(jù)被連續(xù)推送/傳輸?shù)揭呀?jīng)打開(kāi)的同一連接中,這就是為什么WebSocket更快并提高了應(yīng)用程序性能的原因。 例如在交易網(wǎng)站或比特幣交易中,這是最不穩(wěn)定的事情,它用于顯示價(jià)格波動(dòng),數(shù)據(jù)被后端服務(wù)器使用Web套接字通道連續(xù)推送到客戶端。
- 游戲應(yīng)用程序:在游戲應(yīng)用程序中,你可能會(huì)注意到,服務(wù)器會(huì)持續(xù)接收數(shù)據(jù),而不會(huì)刷新用戶界面。屏幕上的用戶界面會(huì)自動(dòng)刷新,而且不需要建立新的連接,因此在WebSocket游戲應(yīng)用程序中非常有幫助。
- 聊天應(yīng)用程序:聊天應(yīng)用程序僅使用WebSocket建立一次連接,便能在訂閱戶之間交換,發(fā)布和廣播消息。它重復(fù)使用相同的WebSocket連接,用于發(fā)送和接收消息以及一對(duì)一的消息傳輸
何時(shí)使用HTTP
?如果我們要獲取舊數(shù)據(jù),或者只想獲取一次數(shù)據(jù)供應(yīng)用程序使用,則應(yīng)該使用HTTP協(xié)議,不需要很頻繁或僅獲取一次的數(shù)據(jù)可以通過(guò)簡(jiǎn)單的HTTP請(qǐng)求查詢
public static void linkSocket(String url) {try {WebSocketClient client = new WebSocketClient(new URI(url)) {@Overridepublic void onOpen(ServerHandshake handshakedata) {Log.e("iffy", "onOpen:" + "------連接成功!!!");System.out.println("onOpen:" + "------連接成功!!!");}@Overridepublic void onMessage(String message) {Log.e("iffy", "onMessage:" + message);System.out.println("onMessage:" + message);}@Overridepublic void onClose(int code, String reason, boolean remote) {Log.e("iffy", "onClose:" + "------連接關(guān)閉!!!" + reason);System.out.println("onClose:" + "------連接關(guān)閉!!!" + reason);}@Overridepublic void onError(Exception ex) {Log.e("iffy", "onError:" + ex.toString());System.out.println("onError:" + ex.toString());}};// wss需添加// 獲取一個(gè) SSLContext 實(shí)例SSLContext sslContext = SSLContext.getInstance("TLS");// 返回受信任的X509證書(shū)數(shù)組。X509TrustManager x509m = new X509TrustManager() {//該方法檢查客戶端的證書(shū),若不信任該證書(shū)則拋出異常。由于我們不需要對(duì)客戶端進(jìn)行認(rèn)證,//因此我們只需要執(zhí)行默認(rèn)的信任管理器的這個(gè)方法。JSSE中,默認(rèn)的信任管理器類為TrustManager。@Overridepublic void checkClientTrusted(X509Certificate[] chain,String authType) {Log.e("iffy", "checkClientTrusted:" + authType);}//該方法檢查服務(wù)器的證書(shū),若不信任該證書(shū)同樣拋出異常。通過(guò)自己實(shí)現(xiàn)該方法,可以使之信任我們指定的任何證書(shū)。//在實(shí)現(xiàn)該方法時(shí),也可以簡(jiǎn)單的不做任何處理,即一個(gè)空的函數(shù)體,由于不會(huì)拋出異常,它就會(huì)信任任何證書(shū)@Overridepublic void checkServerTrusted(X509Certificate[] chain,String authType) {Log.e("iffy", "checkServerTrusted:" + authType);}//返回受信任的X509證書(shū)數(shù)組。@Overridepublic X509Certificate[] getAcceptedIssuers() {Log.e("iffy", "getAcceptedIssuers:");return new X509Certificate[0];}};// 初始化 SSLContext 實(shí)例 并使用我們指定的信任管理器初始化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();}}總結(jié)
以上是生活随笔為你收集整理的HTTP WS 区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: leetcode刷题实录:4
- 下一篇: 吴恩达机器学习资源汇总帖