2014-05-21 2 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"); 

현재 I는 다음과 같습니다 콘솔 클라이언트를 사용하여이 테스트 해요 :

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. (관련 없음) 많은 기업들이 실제로 방화벽에서 구멍을 뚫는 것을 좋아하지 않으므로 클라이언트 연결이 "ws : // mywebsite/HeartbeatController"처럼 보이도록이 설정에서 포트 80을 사용할 수있는 방법이 있습니까? ?

어떤 도움을 주셔서 감사합니다!

답변

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) 
    

    또는 함께

  2. 패스를 AddMessage의 문자열 매개 변수를 교체

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

그래서 당신이 작동하도록하기 위해 수행해야 할 모든이 행과이 행

connection.Send(message, "addMessage"); 

에게

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

편집을 변경하는 것입니다, BTW 4.0는 길에 있고 클라이언트는 매우 될 것입니다 개선뿐만 아니라 serverside 물건.

+0

감사합니다. @Uffe, 매력처럼 작동했습니다! 내 두 번째 질문에 대한 아이디어가 있습니까? XSockets 통신에 포트 80을 사용할 수 있습니까? 지금이 아니라면, 그것이 추가 될 무언가가 될 것입니까? – Chuck

+0

포트 80에서 XSocket을 실행할 수 있지만 이미 IIS 또는 포트를 사용하는 다른 웹 서버/서비스가있는 경우에는 실행할 수 없습니다. 우리는 4.0 버전을 출시하려고합니다. 그러면 OWIN에서 XSocket을 호스트 할 수있게 될 것이고 따라서 포트 80을 사용하십시오. – Uffe

+0

업데이트 해 주셔서 감사합니다. 나는 4.0이 거리를 때릴 때 그것을 조사 할 것이다. – Chuck