websocket - c++ - Linux
1、websocket下载安装地址:https://github.com/gorilla/websocket使用手册:WebSocket++: Main Pagewebsocketpp 不需要编译安装 直接将include文件拷贝至/usr/include/目录即可//1、进入websocketpp-0.8.2目录//2、将websocketpp文件夹拷贝至/usr/includegit clon
·
1、websocket下载安装
地址:https://github.com/gorilla/websocket
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>
更多推荐
已为社区贡献1条内容
所有评论(0)