【问题标题】:Websocket broadcasting not workingWebsocket广播不起作用
【发布时间】:2015-03-03 08:38:31
【问题描述】:

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

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

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

我用我的主应用程序中的更新功能包装了整个事情,我可以不断地接收消息:

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

为什么会这样? 不是sn-p形式的servercode直接将消息发送回所有客户端吗?

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);

代码有什么问题吗?

【问题讨论】:

    标签: c++ websocket poco server broadcast


    【解决方案1】:

    我无法重现该环境,但我在使用 Python 和 IOS Web 套接字时遇到了类似的问题。我们使用的所有其他技术都可以完美地使用 Python 套接字,但 IOS Web 套接字存在问题。很多天后,我们发现 IOS web socket 没有发送 Python 可以处理的通信 ender (EOM)。所以我们不得不对不同的 IOS 套接字进行不同的处理。

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

    我可能是 javascript WebSocket 不理解 End of Message 的问题。如果您在开发人员工具上看到数据 hello ,那么情况将很容易处理。但是,如果您没有看到任何消息,那么问题很可能来自 C++ 代码。

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

    希望对你有帮助。

    如果没有更深入地使用 tcpdump 或类似的软件来确定它们是否真的从两侧发送和接收。

    【讨论】:

    • 我曾经使用过那个开发工具。 C++ 服务器已经直接发回了这个,所以我得到了一个答案。但是对于 C++ 客户端来说不是...
    • 对于 C++ 客户端尝试 tcpdump
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多