2014-05-21 92 views
1

我試圖設置一個特定的場景,但顯然我遇到了問題。我的服務器是一個主要託管WCF服務的站點,但我也想在其中添加一個XSockets主機。根據readme.txt中的說明,我在引導代碼文件中有標準代碼。在客戶端連接時,我啓動了一個基本上是客戶端將監視的心跳線的工作線程。從控制器相關的代碼如下:XSockets客戶端連接但沒有收到消息

public class HeartbeatController : XSocketController 
{ 
    public void AddMessage(string message) 
    { 
     this.SendToAll(message, "addMessage"); 
    } 
} 

在我的工作線程我打電話這樣的:

string message = String.Format("pump", Math.Round(cpuCounter.NextValue()); 
ClientPool connection = ClientPool.GetInstance("ws://mywebsite:4502/HeartbeatController", "*"); 
connection.Send(message, "addMessage"); 

目前我有一個控制檯客戶端,它看起來像這樣測試這個:

class Program 
{ 
    static XSocketClient socketClient; 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Starting client..."); 

     string url = "ws://mywebsite:4502/HeartbeatController"; 

     socketClient = new XSocketClient(url, "*"); 
     socketClient.OnOpen += socketClient_OnOpen; 
     socketClient.Open(); 

     while (true) 
     { 
      // let it sit and display the "pump" messages 
      string input = Console.ReadLine(); 

      if (input.Equals("Q", StringComparison.Ordinal)) 
      { 
       break; 
      } 
     } 
    } 

    static void socketClient_OnOpen(object sender, EventArgs e) 
    { 
     Console.WriteLine("socketClient Opened"); 
     socketClient.Bind("addMessage", OnAddMessage); 
    } 

    private static void OnAddMessage(ITextArgs textArgs) 
    { 
     Console.WriteLine("AddMessage :: {0}", textArgs.data); 
    } 
} 

在客戶端上,如果我在socketClient_OnOpen方法中放置了一個斷點,它會被觸發,所以我認爲它是連接的。但泵信息從來不會傳達給客戶。

兩個問題:

  1. 有什麼明顯的是我失蹤?
  2. (無關)由於許多企業真的不喜歡在他們的防火牆上打孔,有沒有什麼辦法使用端口80這個設置(以便客戶端連接看起來像「ws:// mywebsite/HeartbeatController」) ?

感謝您的幫助!

回答

1

因此,看看你的泵實際發送到服務器,我添加了一個自定義管道。

public class MyPipeline : XSocketPipeline 
{ 
    //Incomming textmessage 
    public override void OnMessage(IXSocketController controller, ITextArgs e) 
    { 
     Console.WriteLine("IN " + e.data); 
     //Let the message continue into the server 
     base.OnMessage(controller, e); 
    } 

    //Outgoing textmessage 
    public override ITextArgs OnSend(IXSocketProtocol protocol, ITextArgs e) 
    { 
     Console.WriteLine("OUT " + e.data); 
     return base.OnSend(protocol, e); 
    }   
} 

因爲我看到您發送的字符串實際上沒有名爲「message」的屬性。 actionmethod「AddMessage」期望您傳入一個類型爲string的屬性消息。所以你可以用兩種方法解決這個問題,它們都很簡單。

  1. 只是ITextArgs

    public void AddMessage(ITextArgs message) 
    

    或從你的工作線程替換方法addMessage字符串參數...

  2. 通行證的對象,而不是字符串像這樣

    connection.Send(new {message}, "addMessage"); 
    

因此,所有你需要做的就是它的工作就是要改變此行

connection.Send(message, "addMessage"); 

與該行

connection.Send(new {message}, "addMessage"); 

編輯:順便說一句,4.0是在路上和客戶端會非常多改進以及服務器端的東西。

+0

謝謝你,@ Uffe,這就像一個魅力!關於第二個問題的任何想法?我可以使用端口80進行XSockets通信嗎?如果不是現在,是否會添加一些東西? – Chuck

+0

您可以在端口80上運行XSockets,但如果您已經擁有使用該端口的IIS或其他Web服務器/服務,則不能運行。我們即將發佈4.0,然後您將能夠在OWIN中託管XSockets,並因此使用端口80 – Uffe

+0

感謝您的更新。 4.0會在街上出現時我會檢查一下。 – Chuck

相關問題