如何实现一次只为 1 个客户端提供服务的 WebSocket 服务器

Posted

技术标签:

【中文标题】如何实现一次只为 1 个客户端提供服务的 WebSocket 服务器【英文标题】:How to implement a WebSocket server serving only 1 client at a time 【发布时间】:2015-05-31 14:45:22 【问题描述】:

我正在使用 WebSocket++ 库来实现 WebSocket 服务器。

由于我的服务器的特性,我希望它一次只为 1 个客户端提供服务。也就是说,一旦客户端连接到我的服务器,我希望它停止监听其他潜在客户端,直到已经连接的客户端断开连接。

目前我的服务器看起来像:

typedef websocketpp::server<websocketpp::config::asio> server;
static void onReceiveData(server *s, websocketpp::connection_hdl hdl, server::message_ptr msg)

    std::string payload(msg->get_payload());
    // process inside payload
    websocketpp::lib::error_code ec;
    s->send(hdl, payload, websocketpp::frame::opcode::BINARY, ec);


int main(void)

    server myServer;
    myServer.init_asio();
    myServer.set_message_handler(websocketpp::lib::bind(&onReceiveData, &myServer, websocketpp::lib::placeholders::_1, websocketpp::lib::placeholders::_2));
    myServer.listen(9002);
    myServer.start_accept();
    myServer.run();

我应该如何暂停和恢复监听,或者有没有限制并发客户端数量的参数?

【问题讨论】:

当前处理不同的连接时,您可以拒绝额外的接受(只是不要调用它),而不是 停止收听 【参考方案1】:

使用validate 决定何时接受或拒绝连接:

static bool accept_new_connections = true;

bool validate(server *, websocketpp::connection_hdl) 
    return accept_new_connections;


void on_open(server *, websocketpp::connection_hdl hdl) 
    accept_new_connections = false;


void on_close(server *, websocketpp::connection_hdl hdl) 
    accept_new_connections = true;

显然,要完成上述工作,您需要为打开、关闭和验证设置额外的处理程序:

myServer.set_open_handler(bind(&on_open, &echo_server, ::_1));
myServer.set_close_handler(bind(&on_close, &echo_server, ::_1));
myServer.set_validate_handler(bind(&validate, &echo_server, ::_1));

【讨论】:

以上是关于如何实现一次只为 1 个客户端提供服务的 WebSocket 服务器的主要内容,如果未能解决你的问题,请参考以下文章

如何确保一次只打开/展开 1 个面板?

为啥我的 WCF 服务一次只处理 3 个并行请求?

UITableview如何一次只显示一个单元格

如何实现像 iOS MAIL 应用程序这样的平移手势,以便一次只打开一个单元格?

Zapier:如何确保我只为轮询触发器返回一次项目

IIS7 - 一次只提供一页。这让我发疯!