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

时间:2017-01-06 13:30:18

标签: c# node.js websocket socket.io

我目前正在尝试向我的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");
            }
        }

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

1 个答案:

答案 0 :(得分:1)

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

的网址

端口号是我们选择的。

设置完成后,我通过以下代码行连接到node.js socket 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;
        }
    }

`

此时你的“连接”上的套接字应该在你的服务器上启动

然后你可以像平常那样向它发射事件。除了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);
        }

    }

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