1. 程式人生 > >WebSocket全雙工通訊入門教程

WebSocket全雙工通訊入門教程

        1. 什麼是WebSocket
           WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duplex)。一開始的握手需要藉助HTTP請求完成。
                1. 傳統的web通訊方式
                        1. 工作模式:客戶端請求-服務端響應
                        2. 適用場景:資訊變化不是特別頻繁的場合,如網頁重新整理
                        3. 不適用場景:線上遊戲,實時監控
                        4. 問題

                          佔用網路傳輸頻寬:每次請求和應答都帶有完整的Http頭,這就增加了每次傳輸的資料量。
                          實時性差:在全雙工通訊時常採用輪詢進行。

                2. 改進版web通訊方式
                        1. 輪詢

                                1. 基於polling(輪詢)技術:以頻繁請求方式來保持客戶端和服務端的同步
                                2. 問題:客戶端的頻繁的請求,服務端的資料無變化,造成通訊低效

                        2. 長輪詢

                                1. 當服務端沒有資料更新的時候,連線會保持一段時間週期知道資料或者狀態改變或者過期,依次減少無效的客戶端和服務端的互動
                                2. 當服務端資料變更頻繁的話,這種機制和定時輪詢毫無區別
                        3. 流技術

                                1. 在客戶端頁面通過一個隱藏的視窗向服務端發出一個長連線請求。服務端接到這個請求後作出迴應並不斷更新連結狀態以保證客戶端和服務端的連線不過期。

                                2. 瀏覽器設計相容和併發處理問題。
                        4. websocket
                                1. 概念:是html5開始提供的一種在單個TCP連線上進行全雙工通訊協議。Websocket通訊協議與2011年倍IETF定為標準RFC 6455,Websocket API被W3C定為標準。
                                2. 原理和TCP一樣,只需做一個握手動作,就可以形成一條快速通道。

                                        1. 客戶端發起http請求,附加頭資訊為:“Upgrade Websocket”

                                        2. 服務端解析,並返回握手資訊,從而建立連線

                                        3. 傳輸資料(雙向)

                                        4. 斷開連線
                                3. 資料傳輸過程
                                        1. 以幀形式進行傳輸
                                                1. 大資料分片
                                                2. 支援邊生成資料,把你傳遞訊息
                                        2. 說明
                                                1. 客戶端到服務端的資料幀必須進行掩碼處理,服務端拖接收到未經掩碼處理的資料幀,須主動關閉連線
                                                2. 服務端到客戶端的資料一定不能加掩碼,客戶端接收到經過掩碼的實際幀,須主動關閉連線
                                                3. 發現錯誤的一方可以傳送close幀,關閉連線。
                                4. 優勢
                                        1. 資料傳輸量
                                        2. 穩定性
                                5. 支援瀏覽器
                                        1. Firefox 4、Chrome 4、Opera 10.70以及Safari 5等瀏覽器的支援

2. websocket案例說明
                1. 客戶端
                        1. 建立Websocket例項
ws = new WebSocket("ws://127.0.0.1:10000/Server_Test.php"); 
                                1. 伺服器IP:ws://127.0.0.1 
                                2. 伺服器埠:10000  
                                3. 服務程式:Server_Test.php
                        2. 建立連線後回撥函式
                           ws.onopen = function(event){}
                        3. 收到服務端訊息後回撥函式
                            ws.onmessage = function(event){}
                        4. 關閉連線後回撥函式
                           ws.onclose = function(event){}
                        5. 連線錯誤後回撥函式
ws.onerror = function(event)
                        6. 傳送資料
ws.send('伺服器,您好');
                        7. 檢視當前連線狀態
alert(ws.readyState)

                2. 服務端
                        1. 建立服務端WebSocket物件,等待客戶端接入
$master  = WebSocket("localhost",10000);
首先建立Websocket,然後服務端監聽相應埠,等待客戶端接入
   
function WebSocket($address,$port){
      
  $master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)     or die("socket_create() failed");
        
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1)  or die("socket_option() failed");
       
 socket_bind($master, $address, $port)                    or die("socket_bind() failed");
       
 socket_listen($master,20)                                or die("socket_listen() failed");
        
echo "Server Started : ".date('Y-m-d H:i:s')."\n";
     
   echo "Master socket  : ".$master."\n";
       
 echo "Listening on   : ".$address." port ".$port."\n\n";
      
  return $master;
   
 }
                        2. 從WebSocket中讀取資料
$buffer = socket_read($socket,2048);
                        3. 當收到客戶端首次連線請求後,生成握手資訊並回復
$return_str = dohandshake($buffer);
socket_write($socket,$return_str,strlen($return_str));
                        4. 連線後,即可接收並解析出客戶端的資料
$buffer = socket_read($socket,2048);
$data_str = decode($buffer);
                        5. 接收到使用者資料後,直接回復客戶端
socket_write($socket,$return_str,strlen($return_str));
                        6. 斷開連線
socket_close($socket);
                        7. 以上6步完成全雙工通訊
  3. 本案例說明

                        1. 目前只可傳文字,byte傳輸還需進一步研究

   3. 案例執行流程
首先需要安裝PHP study,然後將服務端程式碼放到PHP study可執行目錄下,最後使用瀏覽器開啟客戶端程式碼去訪問伺服器即可進行通訊。

                1. 安裝PHP study,然後將PHP檔案放到 D:\phpStudy\WWW 

                2. 設定PHP study埠:

                3. 在客戶端程式中通過url去訪問伺服器:


        4. 除錯說明

                1. 客戶端程式碼
                        1. html程式碼使用Hbuilder編輯完成
                        2. 列印資訊使用
console.log("已經與伺服器建立了連線rn當前連線狀態:" + this.readyState);
                        3. 列印資訊可以實時輸出到控制檯
                2. 服務端程式碼
                        1. 服務端程式碼編輯同樣在Hbuilder中完成
                        2. 服務端程式碼除錯工具推薦使用Xdebug,我們目前使用的是列印錯誤日誌方式進行除錯
   6. 原始碼
                        請到 http://www.dingwave.com/bbs/forum.php?mod=viewthread&tid=372&extra=page%3D1 下載

相關推薦

WebSocket通訊入門教程

        1. 什麼是WebSocket           WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duplex)。一開始的握手需要藉助HTTP請求完成。                1. 傳統

網路通訊-----使用瀏覽器進行通訊WebSocket

    利用 Ajax 和 Comet 技術進行通訊可以提升 Web 的瀏覽速度。 但問題在於通訊若使用 HTTP 協議, 就無法徹底解決瓶頸問題。 WebSocket網路技術正是為解決這些問題而實現的一套新協議及 API。當時籌劃將 WebSocket 作為 HTML5 標

讓C/S進行通訊WebSocket協議

超文字傳輸協議(HTTP)作為一種簡單的協議,在面對功能日益豐富的 Web應用時,遇到了如下瓶頸: 1、在客戶端請求時,會建立一個TCP連線,然後傳送請求,服務端給出響應,然後連線就關閉了。(現在的HTTP1.1支援消除了這個瓶頸) 2、客戶端和伺服器之間的互

Java網路程式設計,socket實現一對一通訊聊天功能

本文使用socket的長連線,進行訊息的傳送和接受。 1、兩端 client 端,server端 2、兩執行緒 客戶端、伺服器端,各開兩個執行緒,實現讀寫,可以全雙工通訊,非同步傳送,非同步接受。 3、兩注意 程式等待輸入和一直處於等待訊息發來,所以,用到死迴圈。

python寫基於c/s框架的即時聊天——(一)基於udp的通訊

前面已經介紹過了基於udp協議的半雙工通訊了,這裡介紹一下全雙工通訊。 伺服器端: from socket import * from time import ctime host = '' #預設監聽所有訪問本機伺服器的ip主機 port = 12345

USART串列埠與SPI通訊的區別!

目錄 1.背景知識 背景知識 首先我們先來區分一下單工、半雙工、全雙工模式。 單工:資料傳輸只支援資料在一個方向上傳輸 半雙工:允許資料傳輸在兩個方向傳輸,但是,在某一時刻,只允許資料在一個方向上傳輸,它實際上是一種切換方向的單工通訊。 全雙工:允許資

Python socket實現多對多通訊

伺服器:#server.py#!/usr/bin/env python #-*-coding:utf-8-*- import sys import struct#將字串打包為二進位制流進行網路傳輸 import select# import signal#用於捕獲中斷訊號

18 11 11 網路通訊 相互互動 單

---恢復內容開始--- 單工  如 收音機 半雙工 對講機 只能接 或 發 全雙工  如  手機是可以同時接或發   socket 的套接字 是全雙工  ---恢復內容結束---   網路 通訊   tcp

資料傳輸方式(並行/序列通訊;同步/非同步;單、半

資料傳輸主要有三種不同的劃分方式。 並行/序列通訊; 同步/非同步傳輸; 按資料的不同傳輸方向可分為單工、半雙工、全雙工。 1.並行通訊和序列通訊 (1)並行通訊 並行通訊是同時傳送資料的各個位進行傳送or接收的通訊方式。 傳輸率比序列介面快8倍,理論值為1Mbits/s. 傳輸的資訊不

JAVA入門到精通-第86講-半/

--伺服器端 // 先接收客戶端發來的資訊  Reader  BufferedReader -------------------------- InputStreamReader isr=

通訊傳輸,、半、單向

CAN匯流排是半雙工通訊方式,CAN是控制器區域網絡(Controller Area NetWork)。目的是位了節省接線的工作量。CAN協議也遵循ISO/OSI模型,採用了其中的物理層、資料鏈路層與應用層。CAN採用多主工作方式,節點之間不分主從,但節點之間有優先順序之分,通訊方式靈活,可實現點對點、一點

兩片STM32使用HAL完成SPI主從通訊

SPI是一種非常簡單易用的全雙工主從式通訊協議。 本文使用兩片STM32F429,一個作為主機,一個作為從機完成SPI的全雙工通訊測試。 在STM32的HAL庫中簡化了SPI主機端的傳送接收,但是HAL庫沒有提供一個簡單的SPI從機程式碼介面,這樣就需要自己拼接介面來完成

共享內存:匿名管道

pid 共享內存 sign 全雙工 -1 clean clu .cpp child //main.cpp #include <iostream> #include <string.h> #include <stdlib.h> #inc

長連接和短連接,單、半

服務 報文 span 用戶 ket 報文頭 用兩個 div 連續 1、長連接與短連接 所謂長連接,指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做在線維持。 短連接是指通信雙方有數據交互

Python實現多用戶聊天(一對一)

nobody mes nec 分開 ctrl ces connect rgs welcome 多用戶全雙工聊天簡陋版 簡單實現了兩個客戶端之間的通信,客戶端發送消息,先由服務器接收,然後服務器轉發到另一客戶端。 該版本功能非常簡陋,僅僅實現了最簡單的聊天,有很多地方需要註意

發生 都是 環境 主機 實現 兩個 一個 註意 pos 半雙工 使用一個線對 會發生沖突 速率只有以太網的30-40% 全雙工 使用兩個線對 不會發生沖突 速率理論上可以達到以太網的200% 全雙工應用在以下典型環境中: 交換機和主機之間的連接 交換機和交換機之間的鏈

、半的區別

--------------------------------------------- -- 時間:2018-11-06 -- 建立人:Ruo_Xiao -- 郵箱:[email protected] ----------------------------------------

Linux 檢視網絡卡 還是半 以及設定網絡卡為半

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

、半和單

一,單工、半雙工和全雙工的區別:   在序列通訊中,資料通常是在兩個終端(如電腦和外設)之間進行傳送,根據資料流的傳輸方向可分為3種基本傳送方式:單工、半雙工和全雙工。這3種傳輸方式的示意圖和區別如下圖所示: 單工通訊的傳輸方向只有一個方向

MT7688 坑爹的 SPI Master 半問題

MTK的東西便宜是真的便宜,好用也相對比較好用,但是總有那麼幾個地方,讓人用著心裡就窩火,就MT76x8來說,第一個窩火的地方就是啟動跳線選擇,非得把串列埠用作啟動跳線,導致除錯起來非常麻煩,第二個就是本文要說的SPI問題,此問題分析和測試了很久,主要是關於spi 半雙工和全