【问题标题】:Send data to client OnMessage with WebSocket-sharp server使用 WebSocket-sharp 服务器向客户端 OnMessage 发送数据
【发布时间】:2022-01-17 15:12:23
【问题描述】:

我一直在尝试解决这个简单的问题,但我无法让它发挥作用。 我正在使用WebSocketSharp.Server。代码如下。

在我的NetworkClass 我有someData 我想在收到消息时发送给客户端。问题是OnMessage 事件在不同的类中被触发,我不知道如何访问这个类的实例。

NetworkClass 向所有客户端广播工作正常,从客户端接收消息也工作正常。

public class IndexRoute : WebSocketBehavior {

    protected override void OnMessage(MessageEventArgs e) {
       Console.WriteLine("Received message form client: "+e.Data);

       //TODO: send someData string to client

    }

}

public class NetworkClass {

    String someData = "TestData";
    WebSocketServer server = new WebSocketServer("ws://127.0.0.1:5000");

    public NetworkClass() {

        server.AddWebSocketService<IndexRoute>("/");
        server.Start();

        Console.WriteLine("Server started");
    }

    public void broadcastData() {

        server.WebSocketServices["/"].Sessions.Broadcast(someData);
        Console.WriteLine("Broadcast");

    }

}

【问题讨论】:

    标签: c# websocket-sharp


    【解决方案1】:

    我对 WebSocketSharp 没有任何经验,但文档说您可以为 AddWebSocketService&lt;&gt; 提供一个备用的 WebSocketBehavior 构造函数

    让我知道它是否有效:(否则我将删除它)

    public class IndexRoute : WebSocketBehavior {
        
        private string _someData;
        
        // define the constructor which accepts the someData
        // save it in a field.
        public IndexRoute(string someData)
        {
            _someData = someData;
        }
    
        protected override void OnMessage(MessageEventArgs e) {
           Console.WriteLine("Received message form client: "+e.Data);
    
           //TODO: send someData string to client
           // do something with _someData
        }
    
    }
    
    public class NetworkClass {
    
        String someData = "TestData";
        WebSocketServer server = new WebSocketServer("ws://127.0.0.1:5000");
    
        public NetworkClass() {
            // pass the construction function. 
            // (construct the IndexRoute and pass the someData to it.)
            server.AddWebSocketService<IndexRoute>("/", () => new IndexRoute(someData));
            server.Start();
    
            Console.WriteLine("Server started");
        }
    
        public void broadcastData() {
    
            server.WebSocketServices["/"].Sessions.Broadcast(someData);
            Console.WriteLine("Broadcast");
    
        }
    
    }
    

    我没有测试它,但它可能会让你朝着正确的方向迈出一步来解决它。

    【讨论】:

    • 感谢 Jeroen 的回答。我认为这段代码会起作用,但我想如果你改变NetworkClasssomeData 的值,IndexRoute 类中_someData 的值不会改变。 Jasper 建议将this 传递给IndexRoute 类。所以我把你的代码和 Jasper 的代码结合起来了。
    • 然后你需要传递一个数据持有者类(引用的东西),小心跨线程读/写..
    【解决方案2】:

    当您继承WebSocketBehavior 时,您将获得方法和属性,这些方法和属性可让您找出有关您当前正在与之通信的连接的信息。在这种情况下,只需使用Send 方法之一发送到发送消息的连接:

    protected override void OnMessage(MessageEventArgs e) {
        Console.WriteLine("Received message form client: "+e.Data);
        Send(/* pick one of the overloads to suit your needs */);
    }
    

    您还可以使用属性Context 获取带有连接信息的WebSocketContext,或使用ID 查找会话(连接)ID,您可以将其传递给另一个对象。如果问题是如何找到 NetworkClass 的实例,那么您已经在自己构建 IndexRoute,只需将 this 作为附加参数传入即可。

    【讨论】:

    • 谢谢@Jesper!传递this 是关键。
    【解决方案3】:

    我结合了 Jeroen van Langen 和 Jesper 的答案。关键是将NetworkClass 的实例传递给IndexRoute 类并从那里访问变量。

    server.AddWebSocketService&lt;IndexRoute&gt;("/", () =&gt; new IndexRoute(this)); 有效,但被标记为过时。

    public class IndexRoute : WebSocketBehavior {
    
        private NetworkClass _instanceOfNetworkClass;
    
        public IndexRoute(NetworkClass instanceOfNetworkClass)
        {
            _instanceOfNetworkClass = instanceOfNetworkClass;
        }
    
        protected override void OnMessage(MessageEventArgs e) {
           Console.WriteLine("Received message form client: "+e.Data);
    
           //Broadcast someData string to clients
           Sessions.Broadcast(_instanceOfNetworkClass.someData);
        }
    
    }
    
    public class NetworkClass {
    
        public String someData = "TestData";
        WebSocketServer server = new WebSocketServer("ws://127.0.0.1:5000");
    
        public NetworkClass() {
    
            server.AddWebSocketService<IndexRoute>("/", () => new IndexRoute(this));
            server.Start();
    
            Console.WriteLine("Server started");
        }
    
        public void broadcastData() {
    
            server.WebSocketServices["/"].Sessions.Broadcast(someData);
            Console.WriteLine("Broadcast");
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-25
      • 1970-01-01
      • 2015-02-10
      • 1970-01-01
      • 2014-09-07
      • 2016-07-21
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多