websocket-sharp 如何使用 socketio 服务器并发送“emit”请求

Posted

技术标签:

【中文标题】websocket-sharp 如何使用 socketio 服务器并发送“emit”请求【英文标题】:websocket-sharp how to work with socketio server and send "emit" request 【发布时间】:2017-01-29 10:59:30 【问题描述】:

我可以连接到我的 socketio 服务器,但是如何发送带参数的请求?

我的 socketio 服务器监听事件

socket.on('init', ( data ) => 
    console.log('init', data);
);

在客户端我尝试这样做

 _socket.OnMessage += (sender, e) =>

    Console.WriteLine("message: 0 1", e.IsBinary, e.Data);
    _socket.Send(MakePacket("init", new Init
        
            key = "1",
            room = "eq",
            type = "s"
        .ToJson())
    );
;

private string MakePacket(string e, string data)

    return new[] e, data.ToJson();

所以我将 json 发送到服务器 ["init", "type":"s","key":"1","room":"eq"]

但是服务器不会对这个数据包做出反应。服务器工作正常,我只有在 C# 调用此事件时遇到问题。我做错了什么?

【问题讨论】:

【参考方案1】:

问题在于socket.io 不是普通的 websocket,而是 websocket 之上的自定义协议(或者也作为后备和初始化的 HTTP 长轮询之上)。这意味着要与 socket.io 服务器对话,您必须像 socket.io 那样对数据和消息进行编码。 Here 似乎是一些关于它如何工作的文档。

替代方案:

在客户端使用 socket.io 库 - 但我不知道是否存在 在服务器端使用原始 websockets

【讨论】:

【参考方案2】:

C# 有 socketio 库,但我有一些我无法找到答案的问题,并且根本没有支持。所以我切换到 websocket-sharp。

在对来自 socketio 服务器的调试信息进行了一些研究后,我找到了答案。如果我发送这个字符串一切正常

42["init", "type":"s","key":"1","room":"eq"]

只需在 json 之前添加 42 就可以了。魔法。 我认为这个 42 数字就像您当前的连接状态或类似的东西。因为当你刚刚连接到 socketio 服务器时,它会在 json 之前发送带有 0 的字符串。

【讨论】:

为了理解这些代码可以参考:github.com/socketio/engine.io-protocol。此外,为了连接到 Socket.IO 服务器,人们应该知道他们需要以下后缀:“wss://BaseUrl/socket.io/?EIO=2&transport=websocket”

以上是关于websocket-sharp 如何使用 socketio 服务器并发送“emit”请求的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket-Sharp 不响应公共 IP 地址

如何解决WebSocket-Sharp在Unity3d中无法跨与访问不同网断服务器

使用 WebSocket-Sharp 和 IBM Watson TTS 时出现“接收二进制数据之前需要 JSON 标头消息”错误

Websocket-Sharp获取客户端IP地址和端口号

C#实现WebSocket协议客户端和服务器Websocket-Sharp组件解析

WinInet如何使用sock代理