windows下搭建websocketpp開發環境以及前端處理二進制流

搭建websocketpp開發環境以及前端處理二進制流

開發平臺

  • 本文主要在windows完成編譯開發任務

環境搭建

  • 在開發前要先搭建好開發環境,主要就是下載並安裝boost和webscoketpp這兩個

Boost C++ Libraries

Python 2: 2.7.17
Python 2: 2.7.17 amd64
Python 3: 3.8.0
Python 3: 3.8.0 amd64
zlib: 1.2.8
bzip2: 1.0.6


Microsoft Visual Studio 2005 - msvc-8.0 - Service Pack 1
Microsoft Visual Studio 2008 - msvc-9.0 - Service Pack 1
Microsoft Visual Studio 2010 - msvc-10.0 - Service Pack 1
Microsoft Visual Studio 2012 - msvc-11.0 - Update 4
Microsoft Visual Studio 2013 - msvc-12.0 - Update 5
Microsoft Visual Studio 2015 - msvc-14.0 - Update 3
Microsoft Visual Studio 2017 - msvc-14.1 - VS 15.9.17
Microsoft Visual Studio 2019 - msvc-14.2 - VS 16.3.6
  • 如果你的開發工具是vs2019,那麼就選擇boost_1_72_0-msvc-14.2-64.exe下載
  • 編譯過程:運行boostrap.bat,之後會生成b2.exe,再點擊b2.exe即可編譯完成,編譯時間有點長哦
  • 編譯完成後就可以看到根目錄多了stage文件夾,這個就是我們接下來需要用到的文件夾

WebSocket++

  • WebSocket++官網:https://docs.websocketpp.org/
  • 可直接在github上下載一個版本:https://github.com/zaphoyd/websocketpp/releases
  • 下載完之後解壓即可

開發工具

  • 環境搭建好之後,就需要選擇一個開發ide了,推薦visual studio,因此它相對方便些,如果使用vscode,還得安裝好mingw纔行,稍微麻煩些

visual studio

  • 這裏我舉例的是vistal studio 2017
  • 先從websocketpp源碼中找到examples/echo_server下的這兩個文件,拷貝進你的工程裏,如下圖
  • 在這裏插入圖片描述
  • 再配置下websocketpp和boost的包含目錄,如下圖
    在這裏插入圖片描述
  • 鏈接器這裏再配置下boost的庫,如下圖
    在這裏插入圖片描述
  • 以上路徑具體要看個人的實際安裝情況

vscode

  • 使用vscode的話還得安裝mingw,由於之前我已經安裝了msys2,並且在裏面已經安裝了mingw64,因此只需要將mingw64/bin配置進環境變量,之後打開cmd輸入gcc -v 測試下即可
  • 接下來還要安裝c/c++插件
  • 在這裏插入圖片描述
  • 接下來從websocketpp源碼中找到examples/echo_server下的這兩個文件,拷貝進你的工程裏,如圖
  • 在這裏插入圖片描述
  • 然後按住ctrl+shift+p,輸入edit,可以看到c/c++編輯配置,如下圖
  • 在這裏插入圖片描述
  • 這個配置其實就是c_cpp_properties.json這個文件,內容參考如下,主要就是includePath下增加了兩個庫的根目錄,以便能找到相關頭文件
{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/**",
                "F:/software/websocket/websocketpp-0.8.2",
                "D:/websocket/boost_1_72_0"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.16299.0",
            "compilerPath": "D:/visialstudio2017/VC/Tools/MSVC/14.13.26128/bin/Hostx64/x64/cl.exe",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "msvc-x64"
        }
    ],
    "version": 4
}
  • 接下來還是按住ctrl+shift+p,輸入tasks,生成一個tasks.json文件
  • 在這裏插入圖片描述
  • 內容參考如下:
{
    // See https://go.microsoft.com/fwlink/?LinkId=733558
    // for the documentation about the tasks.json format
    "version": "2.0.0",
    "tasks": [
        {
            "label": "g++",
            "type": "shell",
            "command": "g++",
            "args": [         
                "-o echo_server",
                "echo_server.cpp",
                "-IF:/software/websocket/websocketpp-0.8.2",
                "-ID:/websocket/boost_1_72_0",
                "-LD:/websocket/boost_1_72_0/stage/lib",
                "-lwsock32",
                "-lws2_32"

            ],
            "group": "build",
            "presentation": {
                // Reveal the output only if unrecognized errors occur.
                "reveal": "silent"
            },
            // Use the standard MS compiler pattern to detect errors, warnings and infos
            "problemMatcher": "$msCompile"
        }
    ]
}
  • 這個任務名稱定爲g++(可以隨便取,修改label即可)
  • command爲g++,這個指的是mingw中的g++.exe,需要我們提前配置好mingw的環境變量,否則就要寫爲g++.exe的完整路徑
  • args中的“-lwsock32”,“-lws2_32”這兩行很重要,沒有這兩行就會報類似undefined reference to `htonl@4’這樣的錯誤
  • 那麼怎麼運行這個任務呢,在終端選擇運行生成任務,然後會在頂部出現一個下拉項,選擇g++,這個g++就是我們在tasks.json裏配置的label的值
  • 在這裏插入圖片描述

在這裏插入圖片描述

  • 任務就會執行了,執行結果請查看終端的信息,如果沒有其他錯誤,最後就能看到生成的exe了
  • 在這裏插入圖片描述

測試

前端websocket

  • 前端websocket的使用可以查看以下文檔:WebSocket - Web API 接口參考 | MDN
  • 這裏主要說明下前端如何處理二進制流
  • 前端在接收二進制流時的類型是根據Websocket.binaryType屬性決定的,它有blob和arraybuffer兩個值可以設置,不管設置什麼,文本數據都是可以收到的,但二進制數據就會根據這個binaryType決定收到的數據類型
	this.websocket.binaryType="arraybuffer";//默認是blob,當爲blob時,服務端傳輸二進制流時前端收到Blob類型;當爲arraybuffer時,服務端傳輸二進制流時前端收到ArrayBuffer類型
 	// 接受到信息
    this.websocket.onmessage = function (e) {
        
        if(e.data instanceof Blob){
            let blob=e.data;
            console.log("Blob:size="+blob.size);
            //js中的blob沒有沒有直接讀出其數據的方法,通過FileReader來讀取相關數據
            let reader = new FileReader();
            reader.readAsArrayBuffer(blob);
            //  當讀取操作成功完成時調用.
            reader.onload = function(evt){  
                if(evt.target.readyState == FileReader.DONE){  
                    let buf = evt.target.result; 
                   console.log("byteLength="+buf.byteLength);//此處的長度會與blob.size一致
                    }
                    
                }
        }else if(e.data instanceof ArrayBuffer){
            console.log("ArrayBuffer:byteLength="+e.data.byteLength);

        }else{ 
        	//文本的話則直接進入這裏
            console.log("String:data="+e.data);
        }
       
    }

參考

  • (25條消息)搭建WebSocketpp環境_運維_xingxinmanong的博客-CSDN博客 https://blog.csdn.net/xingxinmanong/article/details/65447874

  • C++ websocket庫 websocketpp/websocket++例子編譯試用 - 碼農教程 http://www.manongjc.com/article/57236.html

  • C++報錯集合:undefined reference to `htonl@4_C/C++_ttguess的專欄-CSDN博客 https://blog.csdn.net/ttguess/article/details/7267631?utm_source=blogxgwz8

  • js中從blob提取二進制 - AndyDHG - 博客園 https://www.cnblogs.com/redlight/p/3905326.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章