我使用websocketpp库设置了一个简单的广播服务器,用于个人HTML + Javascript聊天。到目前为止,一切都很完美,只有一个例外。此聊天仅适用于两个人同时进行。如果第三个试图进来,他或她必须关上门。所以,逻辑是:
1 - >服务器在听。
2 - >爱丽丝连接。
3 - >鲍勃连接。
4 - >服务器停止收听。广播给Alice + Bob。
5 - >卡洛斯试图连接,但关闭了一个端口。
6 - >鲍勃断开连接。
7 - >卡洛斯连接。
8 - >服务器停止收听。广播给Alice + Carlos。
起初我认为这会很简单,但在经过多次错误和阅读之后我就会陷入困境。我可以让我的服务器在握手过程之后停止监听,但在此之后服务器端的message_handler
停止工作,即使客户端保持完美连接,我也无法从客户端获得任何消息。我知道set_validate_handler
并且我已经设置为同时只允许两个连接,但是这样服务器仍在监听。我需要的是一种让服务器停止侦听端口的方法。
我正在尝试关闭收听并以这种方式保持已经建立的连接:
void on_open( connection_hdl hdl )
{
// Insert
m_connections.insert( hdl );
// Stop listening
m_server.stop_listening();
}
但是,它给了我以下输出:
[2015-07-12 17:06:47] [connect] WebSocket Connection [::1]:58589 v13 "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.132 Safari/537.36" / 101
[2015-07-12 17:06:47] [fail] WebSocket Connection Unknown - "" - 0 websocketpp:26 Operation canceled[2015-07-12 17:06:47] [info] Error getting remote endpoint: system:10009 (The file handle supplied is not valid)
[2015-07-12 17:06:47] [info] asio async_shutdown error: system:10009 (The file handle supplied is not valid)
remote_endpoint: The file handle supplied is not valid
客户端甚至无法连接。如果,否则,我在建立连接后使用m_server.stop_listening();
,客户端保持完美连接,但服务器停止接收其消息,或者至少我无法在void on_message( connection_hdl hdl, server::message_ptr msg )
上获取它们。
答案 0 :(得分:0)
虽然我建议重新考虑聊天应用程序的设计(也许最好有两个参与者的聊天室,而不是两个连接的整个应用程序?),我认为你可以写一个简单的& #39;脏'溶液...
...为什么不拥有"全球"如果数字太高,反驳并简单地拒绝连接?
如果要从你的代码借用,也许它看起来像这样(我不知道这是否有效,这只是一个大纲):
int connections_count = 0
void on_open( connection_hdl hdl )
{
connections_count += 1
if(connections_count >= 2) { return connection_hdl.close}
// Insert
m_connections.insert( hdl );
}
void on_close ( connection_hdl hdl )
{
connections_count -= 1
}
因为我的C ++编码很糟糕,我将使用Plezi framework在Ruby中编写一个快速服务器示例...将其视为可以在irb
中运行的伪代码(Ruby& #39;终端翻译):
require 'plezi'
class ChatCtrl
def pre_connect
return self.class.add_client
end
def on_message data
broadcast :_post_data, data
end
def on_disconnect
self.class.remove_client
end
def _post_data data
response << data
end
# these are class methods, designated by adding `self.` to the name
# they hold the global number of connected clients.
# they also handle the multi-threading security, because Plezi is multi-threaded.
def self.add_client
@locker ||= Mutex.new # multi-thread security
@clients ||= 0
return false if @clients >= 2
@locker.synchronize { @clients += 1 }
end
def self.remove_client
@locker.synchronize { @clients -= 1 }
end
end
listen
route '*', ChatCtrl
exit
我添加了一些多线程安全性,但如果您的应用是单线程的,可能不需要它。
这很难看,但它应该有效。
古德勒克!