WebSocketServer MSDN 示例

3
我写了一个简单的WebSocket服务器,是从MSDN网站上找到的。但是它不能工作。你能向我解释一下如何运行这个简单项目吗?因为我启动它却没有任何反应。
服务器
namespace WebSocketServer
{
class Program
{
    static void Main(string[] args)
    {
        var task1 = Run();
       // Console.ReadLine();
    }
    public static async Task Run()
    {
        HttpListener s = new HttpListener();
        s.Prefixes.Add("http://localhost:8000/ws");
        s.Start();

        var hc = await s.GetContextAsync();
        if (!hc.Request.IsWebSocketRequest)
        {
            hc.Response.StatusCode = 400;
            hc.Response.Close();
            return;
        }
        var wsc = await hc.AcceptWebSocketAsync(null);
        var ws = wsc.WebSocket;

        for (int i = 0; i != 10; ++i)
        {
           // await Task.Delay(20);
            var time = DateTime.Now.ToLongTimeString();
            var buffer = Encoding.UTF8.GetBytes(time);
            var segment = new ArraySegment<byte>(buffer);
            await ws.SendAsync(segment, System.Net.WebSockets.WebSocketMessageType.Text, true, CancellationToken.None);
        }
        await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Done", CancellationToken.None);
    }
}

}

客户端

namespace WebSocketClient
{
class Program
{
    static void Main(string[] args)
    {
        var clientTask1 = Client();
      Console.ReadLine();
    }

   static async Task Client()
    {
        ClientWebSocket ws = new ClientWebSocket();
        var uri = new Uri("ws://localhost:8000/ws/");

        await ws.ConnectAsync(uri, CancellationToken.None);
        var buffer = new byte[1024];
        while (true)
        {
            var segment = new ArraySegment<byte>(buffer);

            var result = await ws.ReceiveAsync(segment, CancellationToken.None);

            if (result.MessageType == WebSocketMessageType.Close)
            {
                await ws.CloseAsync(WebSocketCloseStatus.InvalidMessageType, "I don't do binary", CancellationToken.None);
                return;
            }

            int count = result.Count;
            while (!result.EndOfMessage)
            {
                if (count >= buffer.Length)
                {
                    await ws.CloseAsync(WebSocketCloseStatus.InvalidPayloadData, "That's too long", CancellationToken.None);
                    return;
                }

                segment = new ArraySegment<byte>(buffer, count, buffer.Length - count);
                result = await ws.ReceiveAsync(segment, CancellationToken.None);
                count += result.Count;
            }

            var message = Encoding.UTF8.GetString(buffer, 0, count);
            Console.WriteLine(">" + message);
        }

    }
}
}

我需要创建一个简单的网站,从WebSocketServer获取一些数据(例如时间),并在该页面上显示。我写了一些代码,但是没有任何反应。

<html>
<body>
<script type ="text/javascript">

var ws = new WebSocket("ws://localhost:8000/ws/");
ws.onmessage = function (args)
{
  var time = args.data;
};

</script>
</body>
</html>

1
你使用的是哪个操作系统?(HTTP.SYS需要WebSockets在Win-8及更高版本和类似的服务器版本中运行)另外:你是否以管理员身份运行?(注意:你不需要以管理员身份运行这样的服务器,但这是一种快速检查它是否是端口访问ACL问题的方法,因为管理员帐户自动具有访问权限) - Marc Gravell
我正在使用 Windows 7,我能在这个系统上使用 WebSockets 吗? - Mikhail Valuyskiy
是的,你可以 - 这只是TCP;但是,遗憾的是不能使用MS实现: “然而,客户端和服务器WebSockets的唯一公共实现仅支持Windows 8和Windows Server 2012。” - Marc Gravell
我确实有一个完整的WebSockets库,我一直想开源它已经很久了;然而,已经有一些其他的开源客户端/服务器可用。 - Marc Gravell
1个回答

8
在服务器端,Run是一个async方法;只要它到达第一个未完成结果的await,就会立即返回给调用者。这意味着您的服务器将退出Main,并且在没有任何其他主线程的情况下,您的服务器将终止Console.ReadLine存在有其意义。请将其添加回去:
static void Main(string[] args)
{
    var task1 = Run();
    Console.WriteLine("Press return to exit the server");
    Console.ReadLine();
}

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