Websockets:从NodeJS websocket服务器到带有WebSocketSharp的C#客户端的多个响应

Posted

技术标签:

【中文标题】Websockets:从NodeJS websocket服务器到带有WebSocketSharp的C#客户端的多个响应【英文标题】:Websockets: multiple responses from NodeJS websocket server to C# client with WebSocketSharp fro 【发布时间】:2020-11-19 13:51:51 【问题描述】:

在 NodeJS 中,我创建了一个小型测试服务器,它在收到消息时发送响应。当我尝试从 C# 客户端发送消息时,没有收到回复。经过研究,我注意到它与可能已关闭的 websocket 连接有关。这就是我想要实现的目标:

    我点击一个按钮 (TrySocket) 我向服务器发送一条消息,然后收到答案。 之后,在服务器上对 api 进行轮询操作,大约需要 10 秒。从该 api 接收数据后,我想通过相同的 websocket 连接将其发送给我的客户端。

到目前为止,这是我的 C# 代码。

using System;
using WebSocketSharp;

namespace test_CS

    public partial class test : System.Web.UI.Page
    
        protected async void Page_Load(object sender, EventArgs e)
        
            
        

        protected void TrySocket(object sender, EventArgs e)
        
            var ws = new WebSocket("ws://localhost:8080");
            ws.OnOpen += (senders, d) =>
            
                Response.Write("CONNECTED<br />");
            ;
            ws.OnMessage += (senders, d) =>
            
                Response.Write(d.Data);
            ;
            ws.OnClose += (senders, d) =>
            
                Response.Write("DISCONNECTED<br />");
            ;

            ws.Connect();
            ws.Send("test message 1");
            ws.Close();
        
    

【问题讨论】:

【参考方案1】:

当然,这是我的 Node 代码。我用setTimeout 模拟了 api 调用 只有函数TrySocket在C#端被调用。

const express = require('express');
const http = require('http');
const WebSocket = require('ws');

const app = express();

const server = http.createServer(app);
const wss = new WebSocket.Server( server );

wss.on('connection', function connection(ws, req) 
    ws.on('message', function incoming(message) 
        console.log('received: %s', message)
        if (message == 'test message 1') 
            ws.send('this is answer 1<br />');
            //API call simulation with timeout
            setTimeout(() => 
                ws.send('2nd answer<br />');
            , 3000);
        
    ) 
)

server.listen(8080, function listening() 
    console.log('Listening on %d', server.address().port)
)

【讨论】:

【参考方案2】:

发送“测试消息 1”后,您的连接将关闭。从服务器收到消息后为什么不关闭它。即

protected void TrySocket(object sender, EventArgs e)

    var ws = new WebSocket("ws://localhost:8080");
    ws.OnOpen += (senders, d) =>
    
        Response.Write("CONNECTED<br />");
    ;
    ws.OnMessage += (senders, d) =>
    
        Response.Write(d.Data);
        // if message is close
        //  ws.Close(); close connection
    ;
    ws.OnClose += (senders, d) =>
    
        Response.Write("DISCONNECTED<br />");
    ;

    ws.Connect();
    ws.Send("test message 1");
    //ws.Close(); // Remove this.it causes you client to close after sending a message.
   

这个客户端没有运行。

using System;    
using System.Net;    
using System.Net.Sockets;
using System.Net.WebSockets;
using System.Text;    
using System.Threading;    


namespace node_pipe

    class Program
    
        static void Main(string[] args)
        
            Console.WriteLine("Hello World!");
        
        protected void TrySocket(object sender, EventArgs e)
        var ws = new WebSocket("ws://localhost:8080");
        ws.OnOpen += (senders, d) =>
        
            Response.Write("CONNECTED<br />");
        ;
        ws.OnMessage += (senders, d) =>
        
            Response.Write(d.Data);
            // if message is close
            //  ws.Close(); close connection
        ;
        ws.OnClose += (senders, d) =>
        
            Response.Write("DISCONNECTED<br />");
        ;

        ws.Connect();
        ws.Send("test message 1");
    //ws.Close(); // Remove this.it causes you client to close after sending a message.
   

    

【讨论】:

也试过了,但问题是我什至没有从 NodeJS 服务器收到答案。如果我输入System.Threading.Thread.Sleep(10000);,我会收到所有回复,但会在 10 秒后立即回复。我想发送到 NodeJS 服务器并接收响应,然后等待从 NodeJS 服务器发送第二个响应。 能否也添加节点代码。这是唯一在按钮单击时调用的函数吗? 看上面的回答,评论区太长了。 有什么新见解 kg99? 你能发布一个有效的 c# 客户端代码,以便我可以测试。

以上是关于Websockets:从NodeJS websocket服务器到带有WebSocketSharp的C#客户端的多个响应的主要内容,如果未能解决你的问题,请参考以下文章

TCP 配置的 Amazon Elastic Load Balancer 上的 Socket.io Websockets

Websockets:从NodeJS websocket服务器到带有WebSocketSharp的C#客户端的多个响应

通过 Websockets 在 Nodejs 和 Python 之间进行通信

使用 Websockets 和 Nodejs 上传文件

NodeJS中的Websockets。从服务器端WebSocket客户端调用WebSocketServer

Websockets 不能在至少一台机器上工作