在c#中创建Websocket服务器的最简单方法是什么?

5
有人正在为我们构建一款本地聊天应用程序,Websockets似乎是实现应用程序与服务器同步的最佳方式(服务器使用Web API)。
我们研究了SignalR,但它似乎需要jQuery,因此在本地应用程序中将会很麻烦。
是否有一种“纯净”且简单的方法来使用C#中的Websockets,并且具有可扩展性?所谓“简单”,是指像使用Web API一样简单(我看过一些例子,你必须创建一个TCP侦听器并遵守最新的RFC规范等,这并不简单),而所谓“可扩展”,是指不会阻塞线程。
编辑:问题标题更改以突出websocket服务器实现的重要性。

如果“某人”正在为您构建本机聊天应用程序,请让他们自己去做,因为这些内容与您无关。 - BugFinder
2
我们研究了SignalR,但似乎需要jQuery,这是不正确的。 - TheGeneral
1
你为什么认为在本地应用程序中使用SignalR会很麻烦?我已经在移动应用程序(Xamarin)、MVC和WinForms中使用过它,集成起来非常容易。 - Frauke
1
@Scarabas,有很多文档可供参考,https://dev59.com/3Ggu5IYBdhLWcg3ws5BC 或 https://learn.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/hubs-api-guide-net-client。 - TheGeneral
1
你可以在几分钟内创建一个简单的SignalR聊天应用程序。它相当可扩展,但在某些方面也有限制。这确实取决于有多少人使用它以及用途是什么。你也可以快速设置一个简单的WCF双工和可靠的消息传递系统。然而,如果你想创建下一个Skype或Flock,那么你需要开始明确你的需求和领域,并进行大量的研究。 - TheGeneral
显示剩余4条评论
2个回答

5

SignalR非常适用于以下情况:

1)当您需要在Websockets不可用时有备选方案

并且

2)您可以控制客户端的实现(客户端必须遵循特定的协议)

根据您提供的项目信息(只能受限地控制客户端的实现、仅实现了websocket服务器和Web API),我能想到的最简单的方法是使用Microsoft.WebSockets

您可以从NuGet安装Microsoft.WebSockets,并在几分钟内开始运行websocket服务器。虽然有一些教程(例如:https://dejanstojanovic.net/aspnet/2014/june/database-change-notifications-in-aspnet-using-websocket/),但基本上:

1)确保您的IIS已启用Websockets

2)创建一个Web API控制器来处理websocket请求。例如:

using System;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using Microsoft.Web.WebSockets;

public class SomeController : ApiController
{
    // Has to be called something starting with "Get"
    public HttpResponseMessage Get()
    {
        HttpContext.Current.AcceptWebSocketRequest(new SomeWebSocketHandler());
        return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
    }

    class SomeWebSocketHandler : WebSocketHandler
    {
        public SomeWebSocketHandler() { SetupNotifier(); }
        protected void SetupNotifier()
        {
            // Call a method to handle whichever change you want to broadcast
            var messageToBroadcast = "Hello world";
            broadcast(messageToBroadcast);
        }

        private static WebSocketCollection _someClients = new WebSocketCollection();

        public override void OnOpen()
        {
            _someClients.Add(this);
        }

        public override void OnMessage(string message)
        {

        }

        private void broadcast(string message)
        {
            _someClients.Broadcast(msg);
            SetupNotifier();
        }
    }

}
SetupNotifier()方法应该包含可以捕获所需反应的逻辑。 broadcast(string message)(当然可以重命名)包含“返回”数据到客户端的逻辑 - 该示例向所有客户端发送相同的消息。
请确保使用正确的Websocket客户端进行测试(如果您想要易于使用,则可以使用Chrome扩展程序)- 您不能在浏览器中直接进行ws://请求。

运行得非常好,只用了两分钟!完美!我发现在所有的SignalR提及和教程中很难找到Microsoft.WebSockets。我想我的情况有点奇怪。 - Scarabas

3

这并没有完全回答您的问题,但是

我们研究了SignalR,但它似乎需要jQuery,因此在原生应用程序中将会很麻烦。

这是不正确的,实际上它支持自托管和各种平台的客户端。

有人正在为我们构建本地聊天应用程序,Websockets似乎是在应用程序和我们的服务器之间实现同步的最佳方法(服务器使用Web API)。

SignalR 和 WebSocket

SignalR在可用的情况下使用新的WebSocket传输方式,并在必要时回退到旧的传输方式。虽然您当然可以直接使用WebSocket编写应用程序,但是使用SignalR意味着许多您需要实现的额外功能已经为您完成。最重要的是,这意味着您可以编写应用程序以利用WebSocket,而不必担心为旧客户端创建单独的代码路径。SignalR还使您免于担心WebSocket的更新,因为SignalR将继续更新以支持底层传输的更改,为您的应用程序提供跨WebSocket版本的一致界面。
虽然只是最后的想法,但SignalR并非人类的救世主,但它非常轻巧且强大,非常适合其所用途。不过,您已经提到您想要设置一个针对10000个用户的聊天系统。您应该先权衡所有选项,包括第三方解决方案以及像WCF这样的传统服务。
进一步阅读: SignalR控制台应用程序示例

ASP.NET SignalR Hubs API指南 - .NET客户端(C#)


我已经查看了文档和许多示例,但仍然找不到如何将SignalR用作纯WebSocket服务器的示例,该服务器可以与不知道SignalR的客户端一起使用。你能指导我正确的方向吗? - Scarabas
@Scarabas,你不能仅将其用作Websocket。客户端需要使用SignalR进行通信,不过有C#、Java和JavaScript示例作为客户端。 - TheGeneral
3
这意味着我的评论“客户端只需要使用websocket协议,而不必处理我们选择SignalR的事实”使得SignalR在这种情况下无效,我们又回到了使用其他东西 - 因此问题仍然存在。 - Scarabas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接