WebSocket广播无法正常工作

4
我有一个websocket的问题。我最近从PHP转向c++端,并使用了POCO库,我精确地使用了这个脚本: WebSocketServer.cpp 对于在c++中的单个客户端,我使用了我在stackoverflow上找到的代码片段: 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++ 应用的日志中可以看到连接消息已被发送并接收成功,但是我没有收到来自 JavaScript 客户端的消息:

[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

我无法重现环境,但我在使用Python和IOS Web Sockets时遇到了类似的问题。我们使用的其他技术都可以与Python Sockets无缝配合,但IOS Web Socket存在问题。几天后,我们发现IOS Web Socket没有发送通信结束符(EOM),这是Python无法处理的。因此,我们必须处理不同的IOS sockets。

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

可能是javascript WebSocket没有理解消息结束符的问题。如果您在开发人员工具中看到数据hello,则很容易处理该情况。但是,如果您没有看到任何消息,则问题很可能来自C++代码。

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

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

如果不能,请使用tcpdump或类似的软件深入了解,以确保它们确实被双方发送和接收。


我曾经使用过那个开发工具。C++服务器直接将其发送回来,所以我得到了一个答案。但是对于C++客户端来说不是这样的... - Michael Schneider
对于 C++ 客户端,请尝试使用 tcpdump。 - Ugur DOKMECI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接