Websocket на C++ и Javascript не отвечает
Я хочу иметь простой широковещательный сервер C/C++, который будет принимать клиентские сообщения и отправлять их обратно всем другим подключенным частям, включая отправителя. У меня есть следующие коды:
Серверная часть (C++):
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <iostream>
#include <memory>
#include <set>
#include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp>
typedef websocketpp::server<websocketpp::config::asio> server;
using websocketpp::connection_hdl;
using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;
class broadcast_server {
public:
broadcast_server() {
m_server.init_asio();
m_server.set_open_handler(bind(&broadcast_server::on_open,this,::_1));
m_server.set_close_handler(bind(&broadcast_server::on_close,this,::_1));
m_server.set_message_handler(bind(&broadcast_server::on_message,this,::_1,::_2));
}
void on_open(connection_hdl hdl) {
m_connections.insert(hdl);
}
void on_close(connection_hdl hdl) {
m_connections.erase(hdl);
}
void on_message(connection_hdl hdl, server::message_ptr msg) {
for (auto it : m_connections) {
m_server.send(it,msg);
}
}
void run(uint16_t port) {
m_server.listen(port);
m_server.start_accept();
m_server.run();
}
private:
typedef std::set<connection_hdl,std::owner_less<connection_hdl>> con_list;
server m_server;
con_list m_connections;
};
int main() {
broadcast_server server;
server.run(xxxx);
}
Клиентская часть (Javascript):
<html>
<head>
<title>Websocket chat example</title>
<style type="text/css">
html, body {
font: normal 0.9em arial, helvetica;
}
#log {
width: 600px;
height: 300px;
border: 1px solid #7F9DB9;
overflow: auto;
}
#msg {
width: 400px;
}
</style>
<script type="text/javascript">
var socket;
function init() {
var host = "ws://xxx.xxx.xxx.xxx:xxxx/echobot";
try {
socket = new WebSocket(host);
log('WebSocket - status ' + socket.readyState);
socket.onopen = function(msg) {
log("Welcome - status " + this.readyState);
};
socket.onmessage = function(msg) {
log("Received: " + msg.data);
};
socket.onclose = function(msg) {
log("Disconnected - status " + this.readyState);
};
} catch (ex) {
log(ex);
}
$("msg").focus();
}
function send() {
var txt, msg;
txt = $("msg");
msg = txt.value;
if (!msg) {
alert("Message can not be empty");
return;
}
txt.value = "";
txt.focus();
try {
socket.send(msg);
log('Sent: ' + msg);
} catch (ex) {
log(ex);
}
}
function quit() {
if (socket != null) {
log("Goodbye!");
socket.close();
socket = null;
}
}
function reconnect() {
quit();
init();
}
// Utilities
function $(id) {
return document.getElementById(id);
}
function log(msg) {
$("log").innerHTML += "<br>" + msg;
}
function onkey(event) {
if (event.keyCode == 13) {
send();
}
}
</script>
</head>
<body onload="init()">
<h3>WebSocket v2.00</h3>
<div id="log"></div>
<input id="msg" type="textbox" onkeypress="onkey(event)" />
<button onclick="send()">Send</button>
<button onclick="quit()">Quit</button>
<button onclick="reconnect()">Reconnect</button>
</body>
</html>
Сообщения, отправленные клиентом, отлично достигают сервера, и он выдает следующее:
[2015-07-11 03:59:27] [frame_header] Dispatching write containing 1 message(s) containing 2 header bytes and 12 payload bytes
[2015-07-11 03:59:27] [frame_header] Header Bytes:
[0] (2) 81 0C
[2015-07-11 03:59:27] [frame_payload] Payload Bytes:
[0] (12) [1] Test_message
Во всяком случае, клиент не получает ничего от сервера вещания. Сервер может отлично обрабатывать несколько соединений, но просто клиенты не выводят свои ответы.