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

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

  1. 我点击一个按钮 (TrySocket) 我向服务器发送一条消息,然后收到答案。
  2. 之后,在服务器上对 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();
        }
    }
}

【问题讨论】:

    标签: c# node.js websocket


    【解决方案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# 客户端代码,以便我可以测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      • 2018-08-23
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      相关资源
      最近更新 更多