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

时间:2018-04-20 09:31:47

标签: c# websocket

有人正在为我们构建本机聊天应用程序,而Websockets似乎是应用程序与我们的服务器(使用Web API)之间同步的方式。

我们调查了SignalR,但它似乎需要jQuery,因此在本机应用程序中会很麻烦。

在C#中使用可扩展的Websockets是否有“纯粹”且简单的方法?通过“简单”我的意思就像开始使用Web API一样简单(我已经看到了必须创建TCP侦听器并遵守最新RFC规范等的示例 - 在我看来并不简单),以及“可扩展”我的意思是不阻止线程。

编辑:重命名问题标题以扩大实施websocket服务器的重要性

2 个答案:

答案 0 :(得分:2)

但这并未完全解决您的问题

  

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

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

  

有人正在为我们构建本机聊天应用,而Websockets似乎也是如此   是应用程序和我们的服务器之间的同步性的方式   (使用Web API)。

SignalR and WebSocket

  

SignalR在可用的情况下使用新的WebSocket传输   必要时回到旧的运输工具。虽然你当然可以   使用SignalR方法直接使用WebSocket编写应用程序   您需要实现的许多额外功能   已经为你完成了。最重要的是,这意味着你   可以编写您的应用程序以利用WebSocket而无需   不必担心为旧客户创建单独的代码路径。   SignalR还可以防止您不必担心更新   WebSocket,因为SignalR将继续更新以支持   基础传输的变化,为您的应用程序提供一个   跨WebSocket版本的一致界面。

虽然只是最后一个想法,但SignalR并不是人类的救星,但它非常轻巧健壮,适合它的本质。但是,您提到过您想要一个针对10000次使用的聊天设置。您可能应首先权衡所有选项,包括第三方解决方案以及WCF等传统服务。

进一步阅读

SignalR Console app example

ASP.NET SignalR Hubs API Guide - .NET Client (C#)

答案 1 :(得分:2)

SignalR适用于以下情况:

1)如果没有网页套件,你需要一个后备支持

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)创建一个处理websocket请求的Web API控制器。例:

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://次请求。