Websocket广播不起作用

时间:2015-01-05 18:40:58

标签: c++ websocket poco server broadcast

我的websocket有问题。 我最近将服务器从PHP切换到了c ++端,并使用了POCO库,我使用了这个脚本: WebSocketServer.cpp

对于c ++中的一个客户端,我使用了一个在stackoverflow上找到的snipet: WebSocketClient.cpp

我稍微修改了客户端,首先它在连接到服务器后立即发送默认消息。

我用我的主应用程序中的Update函数包装了整个东西,我总是能够收到消息:

void CLeagueStats :: Update( ) {
        if(m_Connected) {
                string msg = Recv( );
                if(msg != "") {
                        //handleIncomingMsg( msg );
                }
        } else if(GetTime() - LastReconnectTime > 90 || LastReconnectTime == 0) {
                Connect( );
        }
}

string CLeagueStats :: Recv( ) {
        char receiveBuff[256];
        int flags=0;

        int rlen=m_psock->receiveFrame(receiveBuff,256,flags);
        CONSOLE_Print("Recv: "+string(receiveBuff));
        return string(receiveBuff);

}

我现在已经编写了一个非常简单的javascript客户端,它正在填写页面加载:

<script type="text/javascript">
var ip_port = 'localhost:9980';
var ohc;

if (typeof (MozWebSocket) == 'function')
        ohc = new MozWebSocket('ws://' + ip_port);
else
        ohc = new WebSocket('ws://' + ip_port);

var self = this;
setTimeout(function() {
self.ohc.send("hey");
}, 500);
</script>

服务器日志包含两条消息:

  

C ++应用    建立WebSocket连接。收到帧(长度= 5,标志= 0x81)。

     

使用Javascript:   建立WebSocket连接。收到帧(长度= 3,标志= 0x81)。

但是来自C ++应用程序的日志会发送连接消息并收回它,但我没有收到来自js-client的消息:

[Websocket] Connecting to websocket.
[Websocket] Send: hello
[Websocket] Recv: hello

为什么会这样? 服务器代码的代码片段是否直接将消息发送回所有客户端?

n = ws.receiveFrame(buffer, sizeof(buffer), flags);
app.logger().information(Poco::format("Frame received (length=%d, flags=0x%x).", n,unsigned(flags)));
ws.sendFrame(buffer, n, flags);

代码有什么问题吗?

1 个答案:

答案 0 :(得分:0)

我不是重现环境的情况,但我在使用Python和IOS网络套接字时遇到了类似的问题。我们使用的所有其他技术都完美地使用Python套接字,但IOS Web套接字存在问题。多天后,我们发现IOS Web套接字不会发送Python可以处理的通信程序(EOM)。所以我们不得不处理不同的IOS套接字。

我检查了WebSocket标志81,因此文本和框架已完成。但我建议您从浏览器的开发人员工具中查看,以查看通过网络选项卡通过套接字连接收到的内容。

我可能是javascript WebSocket无法理解消息结束的问题。如果您在开发人员工具上看到数据问候,则可以轻松处理情况。但是,如果您没有看到任何消息,则问题很可能来自C ++代码。

在附件中,您可以看到Chrome如何显示套接字数据交易。请记住,单击左侧列表中的连接将更新它们不存在的事务。

希望这可以帮助你。enter image description here

如果没有更深入地使用tcpdump或类似的sowftware来确定它们是否真的是由双方发送并获得。