1、websocket下载安装

地址:https://github.com/gorilla/websocket

使用手册:WebSocket++: Main Page

websocketpp 不需要编译安装 直接将include文件拷贝至/usr/include/目录即可

//1、进入websocketpp-0.8.2目录
//2、将websocketpp文件夹拷贝至/usr/include
git clone https://github.com/gorilla/websocket.git
cd websocketpp-0.8.2
cp -r websocketpp /usr/include/

2、关键主要函数

// 绑定收到消息后的回调
echo_server.set_message_handler();
//当有客户端连接时触发的回调
echo_server.set_open_handler();
//关闭是触发
echo_server.set_close_handler();
// Listen on port 9002
echo_server.listen(9002);//监听端口
echo_server.run();
消息发送
echo_server->send();

3、完整代码

服务端

进入echo_server\echo_server.cpp

//examples目录是官方的一些例子 本次使用的是echo_server\echo_server.cpp
//该原程序只支持一对一发送后回复
//改造后可以通知所有连接上来的客户端。
//编译 g++ echo_server.cpp -lboost_system -lboost_chrono

#include <websocketpp/config/asio_no_tls.hpp>

#include <websocketpp/server.hpp>

#include <iostream>
#include <list>

#include <bits/std_function.h> //添加function头文件

typedef websocketpp::server<websocketpp::config::asio> server;

using websocketpp::lib::bind;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;

// pull out the type of messages sent by our config
typedef server::message_ptr message_ptr;

std::list<websocketpp::connection_hdl> vgdl;

// Define a callback to handle incoming messages
void on_message(server *s, websocketpp::connection_hdl hdl, message_ptr msg)
{
    // std::cout << "on_message called with hdl: " << hdl.lock().get()
    //           << " and message: " << msg->get_payload()
    //           << std::endl;

    // check for a special command to instruct the server to stop listening so
    // it can be cleanly exited.
    if (msg->get_payload() == "stop-listening")
    {
        s->stop_listening();
        return;
    }

    for (auto it = vgdl.begin(); it != vgdl.end(); it++)
    {
        if (it->expired())//移除连接断开的
        {
            it = vgdl.erase(it);
            continue;
        }
        if (it != vgdl.end())
            s->send(*it, msg->get_payload(), msg->get_opcode());
        // t.wait();
    }

    // try {
    //     s->send(hdl, msg->get_payload()+std::string("aaaaa"), msg->get_opcode());
    // } catch (websocketpp::exception const & e) {
    //     std::cout << "Echo failed because: "
    //               << "(" << e.what() << ")" << std::endl;
    // }
}
//将每个连接存入容器
void on_open(websocketpp::connection_hdl hdl)
{
    std::string msg = "link OK";
    printf("%s\n", msg.c_str());
    // printf("fd %d\n",(int)hdl._M_ptr());
    vgdl.push_back(hdl);
}

void on_close(websocketpp::connection_hdl hdl)
{
    std::string msg = "close OK";
    printf("%s\n", msg.c_str());
}
int main()
{
    // Create a server endpoint
    server echo_server;

    try
    {
        // Set logging settings 设置log
        echo_server.set_access_channels(websocketpp::log::alevel::all);
        echo_server.clear_access_channels(websocketpp::log::alevel::frame_payload);

        // Initialize Asio 初始化asio
        echo_server.init_asio();

        // Register our message handler
        // 绑定收到消息后的回调
        echo_server.set_message_handler(bind(&on_message, &echo_server, ::_1, ::_2));
        //当有客户端连接时触发的回调
        std::function<void(websocketpp::connection_hdl)> f_open;
        f_open = on_open;
        echo_server.set_open_handler(websocketpp::open_handler(f_open));
        //关闭是触发
        std::function<void(websocketpp::connection_hdl)> f_close(on_close);
        echo_server.set_close_handler(f_close);
        // Listen on port 9002
        echo_server.listen(9002);//监听端口

        // Start the server accept loop
        echo_server.start_accept();

        // Start the ASIO io_service run loop
        echo_server.run();
    }
    catch (websocketpp::exception const &e)
    {
        std::cout << e.what() << std::endl;
    }
    catch (...)
    {
        std::cout << "other exception" << std::endl;
    }
}

前端代码

更改网络地址后可以使用浏览器直接打开

//在本地创建test.html 将以下内容拷贝

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webSocketTest客户端</title>
</head>

<body>
    
        <h4>客户端输入:</h4>
        <textarea id = "message" name="message" style="width: 200px;height: 100px"></textarea>
        <br/>
        <input type="button" value="发送到服务器" onclick="sendMessage()" />
    
 
        <h4>服务器返回消息:</h4>
        <textarea id = "responseText" name="message" style="width: 1100px;height: 100px"></textarea>
        <br/>
        <input type="button" οnclick="javascript:document.getElementById('responseText').value=''" value="clear data">
 <script type="text/javascript">
    function send(){
        alert(2);
    }
    var webSocket;
    if(window.WebSocket){
        //更改此处地址,websocket是ws开头
        webSocket = new WebSocket("ws://192.168.137.2:9002");
        //客户端收到服务器的方法,这个方法就会被回调
        webSocket.onmessage = function (ev) {
		
        
            var contents = document.getElementById("responseText");
			console.log(ev.data);
            contents.value = contents.value +"\n"+ ev.data;
        }
 
        webSocket.onopen = function (ev) {
            var contents = document.getElementById("responseText");
            contents.value = "与服务器端的websocket连接建立";
            
            var data = '{"method":"init","identifier":"11VKF7M0020199"}';
            
            //webSocket.send(data);
        }
        webSocket.onclose = function (ev) {
            
            var contents = document.getElementById("responseText");
            contents.value =  contents.value +"\n"+ "与服务器端的websocket连接断开";
        }
    }else{
        alert("该环境不支持websocket")
    }
 
    function sendMessage() {
        //alert(document.getElementById("message").value);
        if(window.webSocket){
            if(webSocket.readyState == WebSocket.OPEN){
                var data2 = '{"method":"video","serialNumber":"yjdp"}';
                var data= '{"method":"video","identifier":"11VKF7M0020199","toIdentifier":"yjdp","status":"'+document.getElementById("message").value+'","url":"http://127.0.0.1:8081/UAV_FILES/FILES/0UYKG7K002001F.mp4"}';
                webSocket.send(data);
            }else{
                alert("与服务器连接尚未建立")
            }
        }
    }
    
    
</script>   
</body>
</html>

Logo

更多推荐