2014-01-31 37 views
2

发送消息到客户端我有启动服务器的类:XSocket.net。如何从一个对象,它是不是一个控制器

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

这是正确的做法还是我做错了什么?

谢谢!

回答

0

Uffe,你说得对所涉及的ClientPool对我来说是正确的选择,我跑了你的问题代码,因为一些你所提出的映射不工作,这是你提出的解决方案稍作修改,使其运行:

用于发送消息到控制器
//Get a pool client 
ClientPool poolClient = XSockets.Client.ClientPool.GetInstance("ws://127.0.0.1:4502/MyController", "*"); 

方法。 ITextArgs在这种情况下需要

public void SendEventMessageToClient(Guid clientId, string message) 
{ 
    ITextArgs textargs = new TextArgs(mess, "SendEventMessageToClient");   
    poolClient.Send(new {clientId = guid, message = "Hello to one client"}, "SendEventMessageToClient"); 
} 

在这里,我不需要TextArgs,它可以使用,但字符串也适用。看来,转换到ITextArgs在这里工作正常。

public void SendEventMessageToAllClients(string message) 
{ 
    poolClient.Send("hello all", "SendEventMessageToAllClients");  
} 

控制器:只映射ITextArgs消息。使用字符串将不起作用。

public void SendEventMessageToClient(Guid clientId, ITextArgs message) 
{ 
    c.SendTo(p => p.ClientId == clientId, message.data, "events"); 
} 


public void SendEventMessageToAllClients(ITextArgs message) 
{ 
    c.SendToAll(message.data, "events"); 
} 

非常感谢你的帮助!

7

我不会推荐这种方法,我甚至没有测试过这种方法是否有效。

您每次创建一个新的控制器只是为了能够访问扩展方法。 我猜测,既然你在启动服务器的类上有这个,你只能用它作为发布者?

如果是正确的方法是安装XSockets.Client包,并使用客户端库发布消息:client pool documentation

实例与客户端池

有关客户端池的好处是,你不需要每次都创建一个实例。该池将重新使用与控制器的连接。 使用客户端池(或实际客户端连接)将确保消息通过管道和所有拦截器(如果有)。直接使用控制器实例永远不会到达管线,拦截器等。

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

例与控制器的实例

如果您决定使用你做了你应该至少在控制器使用中的一个实例创建方式服务器类。

重要提示:直接使用控制器实例不会到达pipline,拦截等

//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类,因为它可能是在编译时未引用的单独程序集中。那么接下来你接近甚至不会有可能和去那么的方式是客户端或clientpool

/Uffe

+0

嗨弗费,再次感谢我会在星期一尝试它。我提出的解决方案工作正常,但对我来说,创建每一个新控制器也是不对的。谢谢! – Rafa

+0

嗨!感谢您的回答,我选择了选项1,对我来说也是更好的选择,它符合我的需求(是的,我的初学者班是出版商)。我给了你一个投票,但是我不能将你的回答标记为正确,因为如果你不使用ITextArgs,绑定不能正常工作。请看我的答案作为澄清。 – Rafa

+0

你不应该使用ITextArgs,我发现你在你的答案中声明了一个,但是你从不使用它。而且你也不应该使用它。我怀疑你的答案中的代码会起作用。 ITextArgs是从您发送到服务器的任何内容创建的。只有在您不关心内容并且希望将数据传递给订阅者时才使用,无论它是什么。 – Uffe

相关问题