通过套接字从 c# 向节点 socket.io 服务器发送数据

Posted

技术标签:

【中文标题】通过套接字从 c# 向节点 socket.io 服务器发送数据【英文标题】:Sending data via sockets from c# to a node socket.io server 【发布时间】:2017-01-06 13:30:17 【问题描述】:

我目前正在尝试向我的 socket.io 服务器提供来自我的 C# 客户端的数据。但是我不确定如何在服务器上接收消息。

我的服务器代码:

const io = require('socket.io')(9000);

io.on('connection', (socket) => 
     console.log('Connected');

首先我不知道我必须听哪个事件,但是我无法使用以下客户端(使用 Websocket-sharp)代码向我的服务器发送数据:

private void init()
        
            // start socket connection
            using (var ws = new WebSocket("ws://localhost:9000/socket.io/?EIO=2&transport=websocket"))
            
                ws.OnMessage += (sender, e) =>
                    API.consoleOutput("Message: " + e.Data);

                ws.OnError += (sender, e) =>
                    API.consoleOutput("Error: " + e.Message);

                ws.Connect();
                ws.Send("server");
            
        

连接正常,但我如何接收服务器的消息?发送不会引发错误,因此我认为它确实有效。

【问题讨论】:

我认为,您的连接不工作,因为socket.io 不完全使用websocket 协议。所以,c#websocket客户端无法与node.jssocket.io服务器通信。或许,你可以试试github.com/Quobject/SocketIoClientDotNet c# socket.io 客户端。 还没有找到那个。只有一个过时的。稍后会尝试。 我不确定SocketIoClientDotNet的维护,但我可以肯定地说websocket-sharp不能直接用于与socket.io服务器通信。 github.com/sta/websocket-sharp/issues/81#issuecomment-104650660 SocketIoClientDotNet 不断重新连接并且不会触发本地 Socket.EVENT_CONNECT 事件。似乎也不起作用。 【参考方案1】:

我已经为连接到 node.js 服务器的 UWP 应用程序工作。基本上我所做的是连接到一个看起来像 ws://localhost:4200/socket.io/?EIO=3&transport=websocket

的 URL

我们选择的端口号。

设置完成后,我通过以下代码行连接到 node.js 套接字 io 库。

private async Task ConnectWebsocket() 
        websocket = new MessageWebSocket();
        Uri server = new Uri(WebSocketURI); //like ws://localhost:4300/socket.io/?EIO=3&transport=websocket

        websocket.Control.MessageType = SocketMessageType.Utf8;
        websocket.MessageReceived += Websocket_MessageReceived;
        websocket.Closed += Websocket_Closed;
        try 
            await websocket.ConnectAsync(server);
            isConnected = true;
            writer = new DataWriter(websocket.OutputStream);
        
        catch ( Exception ex ) // For debugging
        
            // Error happened during connect operation.
            websocket.Dispose();
            websocket = null;
            Debug.Log("[SocketIOComponent] " + ex.Message);

            if ( ex is COMException ) 
                Debug.Log("Send Event to User To tell them we are unable to connect to Pi");
            
            return;
        
    

`

此时您的“连接”上的套接字 io 应该在您的服务器上触发

然后你可以像往常一样向它发出事件。除了 C# 套接字代码并区分各种通道,因此您必须自己这样做。下面是我们的做法(又名 SocketData 和 SocketIOEvent 是我们定义的类)

private void Websocket_MessageReceived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args) 
        try 
            using ( DataReader reader = args.GetDataReader() ) 
                reader.UnicodeEncoding = UnicodeEncoding.Utf8;

                try 
                    string read = reader.ReadString(reader.UnconsumedBufferLength);
                    //read = Regex.Unescape(read);
                    SocketData socc = SocketData.ParseFromString(read);
                    if (socc != null ) 
                        Debug.Log(socc.ToString());
                        SocketIOEvent e = new SocketIOEvent(socc.channel, new JSONObject( socc.jsonPayload));
                        lock ( eventQueueLock )  eventQueue.Enqueue(e); 
                    
                
                catch ( Exception ex ) 
                    Debug.Log(ex.Message);
                
            
         catch (Exception ex ) 
            Debug.Log(ex.Message);
        

    

在我们的特定应用程序中,我们不需要向我们的服务器发送消息,因此我没有一个好的答案。

【讨论】:

以上是关于通过套接字从 c# 向节点 socket.io 服务器发送数据的主要内容,如果未能解决你的问题,请参考以下文章

c# SocketIoClientDotNet, node js socket.IO

节点(套接字)实时音频流/广播

如何在 Express 4 路由中使用 socket.io 向连接的套接字发出事件?

向每个客户端广播的套接字IO及其套接字ID

节点 Js 无法将消息发送到在线特定套接字

节点 Js 无法将消息发送到在线特定套接字