我有一个启动服务器的类:
public class SocketServer
{
private static IXSocketServerContainer server = null;
public SocketServer()
{
server = XSockets.Plugin.Framework.Composable
.GetExport<IXSocketServerContainer>();
}
public bool StartServers()
{
try
{
server.StartServers();
return true;
} catch
{
return false;
}
}
这个类有一个方法:
public void SendEventMessageToAllClients(string message)
{
XSockets.Core.XSocket.Helpers.XSocketHelper
.SendToAll<MyController>(new MyController(), message, "events");
}
其中
MyController
是我自己的控制器,已实现,服务器可以找到它,并且此方法有效。现在,我想使用新方法扩展功能,该方法允许我将事件发送到特定客户端:
public void SendEventMessageToClient(string clientId, string message)
{
XSockets.Core.XSocket.Helpers.XSocketHelper
.SendTo<MyController>(new MyController(),
p => p.ClientId == clientId, message, "events");
}
这是正确的方法还是我做错了什么?
谢谢!
最佳答案
我不会推荐这种方法,我什至都没有测试这种方法是否有效。
您每次都创建一个新的控制器只是为了能够访问扩展方法。
我猜想因为您在启动服务器的类中拥有此功能,因此只能将其用作发布者吗?
如果是这样,正确的方法是安装XSockets.Client软件包并使用客户端池来发布消息:client pool documentation
客户端池示例
关于客户端池的好处是您不需要每次都创建实例。该池将重用您与控制器的连接。
使用clientpool(或真实的客户端连接)将确保消息通过管道和所有拦截器(如果有)传递。直接使用控制器实例永远不会到达管线,拦截器等。
//Get a pool client
ClientPool poolClient =
XSockets.Client.ClientPool.GetInstance("ws://127.0.0.1:4502/MyController", "*");
向控制器发送消息的方法。
public void SendEventMessageToClient(Guid clientId, string message)
{
poolClient.Send(new {clientId, message}, "SendEventMessageToClient");
}
public void SendEventMessageToAllClients(string message)
{
poolClient.Send(message, "SendEventMessageToAllClients");
}
控制器
public void SendEventMessageToClient(Guid clientId, string message)
{
this.SendTo(p => p.ClientId == clientId, message, "SendEventMessageToClient");
}
public void SendEventMessageToAllClients(string message)
{
this.SendToAll(message, "SendEventMessageToAllClients");
}
控制器实例的例子
如果决定使用已完成的方法,则至少应在控制器的一个实例上创建才能在服务器类中使用。
重要提示:直接使用控制器实例将永远不会到达管线,拦截器等位置。
//Be aware of the fact that this controller NEVER will have a connection.
//It can only send to others, it can never receive messages!
MyController c = new MyController();
//You should probably have a Guid here instead of string
//Also note that the client have to subscribe for "events" to get the message
public void SendEventMessageToClient(Guid clientId, string message)
{
this.SendTo(p => p.ClientId == clientId, message, "SendEventMessageToClient");
}
public void SendEventMessageToAllClients(string message)
{
this.SendToAll(message, "SendEventMessageToAllClients");
}
由于我不知道您要完成什么,我不确定这是最好的方法,但是上述方法之一应该起作用。
编辑:而且,在实际的应用程序中,您可能无法访问MyController类,因为它可能在编译时未引用的单独程序集中。因此,您的方法甚至将无法实现,而解决方法就是客户端或客户端池
/乌菲
关于xsockets.net - XSocket.net。如何从不是 Controller 的对象向客户端发送消息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21483298/