Web Sockets API

WebSockets通信

Web Sockets是H5提供的在web應(yīng)用程序中客戶端與服務(wù)器端之間進行的非HTTP的通信機制。
??使用Web Sockets API可以在服務(wù)器與客戶端之間建立一個非HTTP的雙向連接。這個連接是實時的,也是永久的,除非被顯示關(guān)閉。這意味著當服務(wù)器想向客戶端發(fā)送數(shù)據(jù)時,可以立即將數(shù)據(jù)推送到客戶端的瀏覽器中,無需重新建立連接。只要客戶端有一個被打開的socket(套接字)并且與服務(wù)器建立了連接,服務(wù)器就可以把數(shù)據(jù)推送到這個socket上,服務(wù)器不再需要輪詢客戶端的請求,從被動轉(zhuǎn)為了主動。

API的基本用法

要連接通信端點,只需要創(chuàng)建一個新的WebSocket實例,并提供希望連接的對端URL字符串。ws://wss://前綴分別表示W(wǎng)ebSocket連接和安全的WebSocket連接。

if(window.WebSocket){ //進行檢測,確保瀏覽器支持WebSocket
    var webSocket=new WebSocket("ws://localhost:8005/socket");
}

打開socket后只需要等待事件發(fā)生,而不需要主動向服務(wù)器輪詢,所以需要在WebSocket對象中添加回調(diào)函數(shù)來監(jiān)聽事件。
??WebSocket對象有三個事件:open、closemessage。當連接建立時觸發(fā)open事件,當收到消息時觸發(fā)message事件,當WebSocket連接關(guān)閉時觸發(fā)close事件。

webSocket.onopen=function(event)
{
    //開始通信時的處理
    webSocket.send("Hello WebSocket!");
}
webSocket.onmessage=function(event)
{
    var data=event.data;
}
webSocket.onclose=function(event)
{
    //結(jié)束通信時的處理
}

當socket處于打開狀態(tài)(即調(diào)用onopen監(jiān)聽程序之后,調(diào)用onclose監(jiān)聽程序之間前),可以采用send方法來向服務(wù)器發(fā)送數(shù)據(jù)。只能發(fā)送文本數(shù)據(jù),但是可以使用JSON對象把任何JS對象轉(zhuǎn)換成文本數(shù)據(jù)后進行發(fā)送。

document.getElementById("sendBtn").onclick=function(){
    webSocket.send("data");
}

消息發(fā)送完成后,可以通過close方法來關(guān)閉socket,切斷通信連接。

webSocket.close();

另外,還可以通過讀取readyState的屬性值來獲取WebSocket對象的狀態(tài)。readyState屬性存在以下幾種屬性值:

  • CONNECTING(數(shù)字值為0),表示正在連接。
  • OPEN(數(shù)字值為1),表示已建立連接。
  • CLOSING(數(shù)字值為2),表示正在關(guān)閉連接。
  • CLOSED(數(shù)字值為2),表示已關(guān)閉連接。

實例

在運行前,首先要在服務(wù)器端指定好它的socket(套接字)應(yīng)用程序,并在服務(wù)器的配置文件中指定好運行該socket應(yīng)用程序的主機與端口,然后再運行配置好的服務(wù)器。

<html>  
<meta charset="UTF-8"></meta>
<head>  
<title>WebSockets客戶端示例</title> 
</head> 
<script>
var webSocket;
function connect()
{
    try
    {
        var readyState=new Array("正在連接","已建立連接","正在關(guān)閉連接","已關(guān)閉連接");
        var host="ws://localhost:8005/socket";
        webSocket=new WebSocket(host);
        var message=document.getElementById("message");
        message.innerHTML+="<p>Socket狀態(tài):"+readyState[webSocket.readyState]+"</p>";
        webSocket.onopen=function()
        {
            message.innerHTML+="<p>Socket狀態(tài):"+readyState[webSocket.readyState]+"</p>";
        }
        webSocket.onmessage=function(msg)
        {
            message.innerHTML+="<p>接收信息:"+msg.data+"</p>";
        }
        webSocket.onclose=function()
        {
            message.innerHTML+="<p>Socket狀態(tài):"+readyState[webSocket.readyState]+"</p>";
        }
    }
    catch(exception)
    {
    message.innerHTML+="<p>有錯誤發(fā)生</p>";
    }
}
function send()
{
    var text=document.getElementById("text").value;
    var message=document.getElementById("message");
    if(text=="")
    {
    message.innerHTML+="<p>請輸入一些文字</p>";
        return;
    }
    try
    {
        webSocket.send(text);
        message.innerHTML+="<p>發(fā)送數(shù)據(jù):"+text+"</p>";
    }
    catch(exception)
    {
    message.innerHTML+="<p>發(fā)送數(shù)據(jù)出錯</p>";
    }
    document.getElementById("text").value="";
}
function disconnect()
{
    webSocket.close();
}
</script> 
<body>  
    <h1>WebSockets客戶端示例</h1>  
    <div id="message"></div>
    <p>請輸入一些文字</p>  
    <input id="text" type="text"></input>
    <button id="connect" onclick="connect();">建立連接</button>  
    <button id="send" onclick="send();">發(fā)送數(shù)據(jù)</button> 
    <button id="disconnect" onclick="disconnect();">斷開連接</button>  
</body>  
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 點擊查看原文 Web SDK 開發(fā)手冊 SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個完善的 IM 系統(tǒng)...
    layjoy閱讀 14,315評論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評論 19 139
  • 我是駐扎在上海音樂學院的一名小兵,今天想要去本校的圖書館借本叫《夢溪筆談》的書,原本認為會很順利,然而接下來發(fā)現(xiàn)的...
    小牦牛閱讀 214評論 0 1
  • 這兩天溫度突降,盛夏的溽熱暫時遠離,我坐在學校操場邊上,夾雜著樟樹香氣的風不斷吹過,一時間整個人都放松了下來...
    左岸7102閱讀 433評論 0 1
  • 疲憊至極,甚感空虛。 長大了慢慢感覺時間的列車提速了 從十八邁指數(shù)爆炸到八十邁 瑣事盡顯,摯友相伴。 至少每一刻都...
    轱轆圈五哥閱讀 209評論 0 2

友情鏈接更多精彩內(nèi)容