Alchemy Websocket多线程消息

时间:2015-03-13 04:51:08

标签: multithreading websocket alchemy-websockets

我正在使用Alchemy-Websockets作为服务器,我在服务器上的自己的线程中发送和接收来自外部客户端的消息。这很好用,但现在我还想在不同的线程中发送源自服务器的消息。这是我的主要设置:

    public WebSocket(int port, IRedisClient _redis)
    {
        Console.WriteLine("Server at " + port);
        Redis = _redis;
        // instantiate a new server - acceptable port and IP range,
        // and set up your methods.
        //clients = new Dictionary<string, UserContext>();
        subscriber_list = new Dictionary<string, Dictionary<string, UserContext>>{ };

        var aServer = new WebSocketServer(port, System.Net.IPAddress.Any)
        {
            OnReceive = OnReceive,
            OnConnect = OnConnect,
            OnConnected = OnConnected,
            OnDisconnect = OnDisconnect,
            TimeOut = new TimeSpan(0, 5, 0)
        };
        aServer.Start();
    }

此代码位于自己的线程上启动的类中。问题是,如果我想将数据发送到此websocket的客户端,我该如何处理多线程?我是否只是添加一个锁定机制,以便在使用它的同时不使用特定的“UserContext”?我是否在aServer.Start()之后放置了一个while循环并阻止我正在等待的基于服务器的通信?像这样?:

    aServer.Start();
    while(true){
      // block on messages from my other thread (not from the websocket)
      // get lock for a user context
      UserContext.Send(myMessage);
      Thread.Sleep(1000);
    }

Thread.Sleep并不意味着使websocket睡眠并错过套接字上的消息。看看其他例子我认为这不应该发生,因为炼金术服务器也在它自己的线程中。

1 个答案:

答案 0 :(得分:1)

Alchemy在内部是异步的,但是如果你使用while(true) + Thread.Sleep来阻止处理程序,你可能会阻止连接并阻塞执行线程对等连接。

您应该在某处注册UserContext,例如clientID或userID或userId + connectionID关联的当前连接列表。每当您想要向用户发送内容时,您都会浏览该列表,找到连接并发送内容。您必须小心并确保不要从同一UserContext中的两个线程写入,因此请考虑使用Producer / Consumer模式。

有很多方法可以做到这一点。但是你不能只用无限循环来阻止一个事件处理程序。