2014-01-31 42 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

相關問題