我可以在一个连接上有多个“类别”吗?

Posted

技术标签:

【中文标题】我可以在一个连接上有多个“类别”吗?【英文标题】:Can I have multiple "categories" on one connection? 【发布时间】:2018-08-02 13:34:53 【问题描述】:

我将设计一个使用 Angular 6 和 .netcore 2 作为后端 API 的 SPA。我将需要一个用于实时数据流和图表目的的套接字实现。

我有一个需要 3 种不同数据类型“实时流式传输”的页面,我的问题是 - 我可以使用一个 websocket 连接来做到这一点吗?据我所知,我认为有一种方法可以在连接中创建某种队列或类似子流的东西,所以我可以有以下内容:

socket = new WebSocket(url);
socket.on('dataOne', () =>  // proccess here 
socket.on('dataTwo', () =>  // proccess here 
socket.on('dataThree', () =>  // proccess here 

我想知道这是否可行,如果可行,您能否就可用于客户端和 API 的库向我提供建议?

我研究过 SignalR for C# 和 Substream 等库,但我并不完全确定。各种建议和解释表示赞赏!

【问题讨论】:

【参考方案1】:

javascript C#都有现有的 SignalR 客户端。你应该使用那些。除此之外,我不确定你在说什么。如果这就是您的意思,您不需要单独的集线器。归根结底,SignalR 非常简单:您只需发送一条消息,客户端就会绑定到该消息类型,并在收到它时执行一些操作。逆向过程大致相同:客户端只需“调用”在您的集线器上定义的某个方法,然后它会执行一些操作。

因此,您可以绑定到几乎任何东西客户端,而服务器只需要发送该特定消息即可导致某些事情发生。例如:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/myhub")
    .build();
connection.on("dataOne", data =>  ... );
connection.on("dataTwo", data =>  ... );
connection.on("dataThree", data =>  ... );
connection.start().catch(err => console.error(err.toString()));

然后,服务器端:

 await _hub.Clients.All.SendAsync("dataOne", data);

【讨论】:

【参考方案2】:

您应该只与一个连接并为您的类别使用多个代理。 像这样的

var contosoChatHubProxy = connection.createHubProxy('ContosoChatHub');
contosoChatHubProxy.on('addContosoChatMessageToPage', function(userName, message) 
    console.log(userName + ' ' + message);
);

var categoryOneHubProxy = connection.createHubProxy('categoryOne');
var categoryTwoHubProxy = connection.createHubProxy('categoryTwo');

详情refer

【讨论】:

以上是关于我可以在一个连接上有多个“类别”吗?的主要内容,如果未能解决你的问题,请参考以下文章

requests.post 可以在慢速(但不是死)连接上超时吗? [复制]

mysql和eclipse已经连接上但是没有创建表回出现异常吗?

MultipleActiveResultSets=True 还是多个连接?

Oracle的连接与会话

指纹打卡机数据线怎么和电脑连接上

一个客户端可以开两个websocket连接吗?