赞
踩
前端为客户端(Client),后端为服务端(Server)
具体操作步骤为:
1.运行 Server 目录下的 --> WebsocketServerWss_Ws.exe
2.打开浏览器输入 --> https://localhost:8282 会提示此连接不受信任
3.点击 我已充分了解可能的风险 --> 添加例外 --> 确认安全例外
4.运行 Client 目录下的 --> WebsocketClient.html
5.在消息框里面写入消息 点击发送就可以在 Server\Log里面查看收到的消息了
WebsocketClient.html
WebsocketServerWss_Ws.exe
1. WebsocketClient.html
<!DOCTYPE html> <html> <title>---WebscoketClient---</title> <meta charset="utf-8"> <style> .parent{ #background:red; #height:100px; } .child{ background:blue; position:relative; z-index:-1; } </style> <div class="parent"> <label>IP地址</label> <input id="serverurl1" value="ws://localhost" /> <label>端口</label> <input id="port1" value="8686" /> <br/> <br/> <label>消息</label> <input type = "text" id = "mes1"> <button id = "clab1" type = "button" onclick = "sendMsg1()">WS_发送</button> <br/> <br/> <label>IP地址</label> <input id="serverurl2" value="wss://localhost" /> <label>端口</label> <input id="port2" value="8282" /> <br/> <br/> <label>消息</label> <input type = "text" id = "mes2"> <button id = "clab2" type = "button" onclick = "sendMsg2()">WSS_发送</button> </div> <script src="./websocket.js"></script></html>
2. Websocket.cpp
#include "stdafx.h" #include "Websocket.h" #include "NetilerLog.h" #include "NetilerIni.h" #include "StringUtil.h" #include "json.h" #include <ShellAPI.h> #include <stdio.h> #include <websocketpp/config/asio.hpp> #include <websocketpp/server.hpp> #include <iostream> typedef websocketpp::server<websocketpp::config::asio> server_plain; typedef websocketpp::server<websocketpp::config::asio_tls> server_tls; using websocketpp::lib::placeholders::_1; using websocketpp::lib::placeholders::_2; using websocketpp::lib::bind; typedef websocketpp::lib::shared_ptr<boost::asio::ssl::context> context_ptr; server_plain endpoint_plain; // ws server_tls endpoint_tls; // wss boost::asio::io_service ioserver; CWebsocket::CWebsocket(HWND hwnd) { m_hwnd = hwnd; } CWebsocket::~CWebsocket(void) { } // 连接成功 template <typename EndpointType> void OnOpen(EndpointType* s, websocketpp::connection_hdl hdl) { websocketpp::lib::error_code errorCode; s->send(hdl, "Receive from Client message...", websocketpp::frame::opcode::TEXT, errorCode); if (!errorCode) { NETILER_DEBUG_FMT("发送数据到客户端成功!"); } else { NETILER_ERROR_FMT("发送数据到客户端失败, 【%s】", errorCode.message().c_str()); } } // 收到消息 template <typename EndpointType> void OnMessage(EndpointType* s, websocketpp::connection_hdl hdl, typename EndpointType::message_ptr msg) { NETILER_INFO_FMT("Websocket收到来自客户端的消息..."); char str_message[1024] = ""; const char * pszmsg = (const char *)(msg->get_payload().c_str()); std::string strmsg = StringUtil::UTF82GBK(pszmsg); NETILER_DEBUG_FMT("消息为 = 【%s】", strmsg.c_str()); } // 获取密码 std::string GetPassword() { return "test"; } // TLS初始化 context_ptr OnTlsInit(websocketpp::connection_hdl hdl) { std::cout << "on_tls_init called with hdl: " << hdl.lock().get() << std::endl; context_ptr ctx(new boost::asio::ssl::context(boost::asio::ssl::context::tlsv1)); try { ctx->set_options(boost::asio::ssl::context::default_workarounds | boost::asio::ssl::context::no_sslv2 | boost::asio::ssl::context::no_sslv3 | boost::asio::ssl::context::single_dh_use); ctx->set_password_callback(bind(&GetPassword)); ctx->use_certificate_chain_file("server.pem"); ctx->use_private_key_file("server.pem", boost::asio::ssl::context::pem); } catch (std::exception& e) { std::cout << e.what() << std::endl; } return ctx; } // 打开 websocket BOOL CWebsocket::OpenWebsocket() { /* ws协议 */ int WsPort = NetilerIni::GetSectionKeyUint("Websocket_WS", "port"); endpoint_plain.init_asio(&ioserver); endpoint_plain.set_message_handler(bind(&OnMessage<server_plain>,&endpoint_plain,::_1,::_2)); endpoint_plain.listen(WsPort); endpoint_plain.start_accept(); NETILER_INFO_FMT("Websocket_WS 启动成功 --> 端口为:【%d】", WsPort); /* wss协议 */ int WssPort = NetilerIni::GetSectionKeyUint("Websocket_WSS", "port"); endpoint_tls.init_asio(&ioserver); endpoint_tls.set_tls_init_handler(bind(&OnTlsInit,::_1)); endpoint_tls.listen(WssPort); endpoint_tls.set_open_handler(bind(&OnOpen<server_tls>, &endpoint_tls, ::_1)); endpoint_tls.set_message_handler(bind(&OnMessage<server_tls>, &endpoint_tls, ::_1, ::_2)); endpoint_tls.start_accept(); NETILER_INFO_FMT("Websocket_WSS 启动成功 --> 端口为:【%d】", WssPort); // Start the ASIO io_service run loop running both endpoints ioserver.run(); return 0; } void CWebsocket::CloseWebsocket() { NETILER_INFO_FMT("Websocket 服务关闭!"); if (endpoint_plain.is_listening()) { endpoint_plain.stop_listening(); } if (endpoint_tls.is_listening()) { endpoint_tls.stop_listening(); } ioserver.stop(); }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。