WebSocketServer MSDN 示例

Posted

技术标签:

【中文标题】WebSocketServer MSDN 示例【英文标题】:WebSocketServer MSDN Example 【发布时间】:2013-11-18 10:02:49 【问题描述】:

我写了一个简单的 WebSocketServer,我在 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>

【问题讨论】:

您使用的是什么操作系统? (web-sockets 所需的 HTTP.SYS 是 win-8 以上和类似的服务器版本)并且:您是否以管理员身份运行? (注意:您不需要以管理员身份运行这样的服务器,但这是一种快速检查它不是端口访问 ACL 问题的方法,因为管理员帐户自动拥有访问权限) 我正在使用 7 (((我可以在 Windows 7 上使用 WebSockets 吗? 是的,你可以——它只是 TCP;但是,遗憾的是,没有使用 MS 实现:“但是,Windows 8 和 Windows Server 2012 支持客户端和服务器 WebSocket 的唯一公共实现。” 我确实有一个完整的 web-sockets 库,多年来我一直想开源;但是,还有一些其他开源客户端/服务器已经可用 【参考方案1】:

在服务器端,Run 是一个async 方法; 一旦到达结果尚未完成的第一个await,它将返回给调用者。这意味着您的服务器将退出Main,并且在没有任何其他主(非工作)线程的情况下,您的服务器将终止Console.ReadLine 的存在是有原因的。放回去:

static void Main(string[] args)

    var task1 = Run();
    Console.WriteLine("Press return to exit the server");
    Console.ReadLine();

【讨论】:

以上是关于WebSocketServer MSDN 示例的主要内容,如果未能解决你的问题,请参考以下文章

MSDN打开对话框示例代码

用于 GDI 打印的 MSDN 示例中缺少文件

在 NodeJS 中将 WebSocket 连接到 WebSocketServer

React Native UnhandledPromiseRejectionWarning:TypeError:无法读取WebSocketServer上未定义的属性'url'

Python websocket 客户端 - 从 python 代码向 WebSocketServer 发送消息

C# WebSocketServer wss:// 连接失败