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 之间进行通信