使用WebSocket-sharp server向客户端OnMessage发送数据

Send data to client OnMessage with WebSocket-sharp server

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

在我的 NetworkClass 我有 someData 我想在收到消息时发送给客户端。问题是 OnMessage 事件在另一个 class 中触发,我不知道如何访问此 class.

的实例

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");

    }

}

我没有任何使用 WebSocketSharp 的经验,但文档说您可以为 AddWebSocketService<>

提供替代的 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");

    }

}

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

当您继承 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 作为附加参数传入即可。

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

server.AddWebSocketService<IndexRoute>("/", () => 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");

    }

}