【问题标题】:XSockets Client Connecting But Not Receiving MessagesXSockets 客户端连接但不接收消息
【发布时间】:2014-05-27 03:20:58
【问题描述】:

我正在尝试设置一个特定的场景,但显然我遇到了问题。我的服务器是一个主要托管 WCF 服务的站点,但我也想在那里添加一个 XSockets 主机。根据 readme.txt 中的说明,我在引导代码文件中有标准代码。在客户端连接时,我正在启动一个工作线程,它基本上是客户端将监控的心跳。来自控制器的相关代码如下:

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”) ?

感谢您的帮助!

【问题讨论】:

    标签: c# xsockets.net


    【解决方案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);
        }        
    }
    

    自从我看到您发送的字符串实际上没有名为“消息”的属性。动作方法“AddMessage”希望您传入字符串类型的属性消息。所以你可以通过两种方式解决这个问题,它们都很简单。

    1. 只需将 AddMessage 中的字符串参数替换为 ITextArgs

      public void AddMessage(ITextArgs message)
      

      或者...

    2. 从你的工作线程传入一个对象,而不是像这样的字符串

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

    所以你需要做的就是改变这一行

    connection.Send(message, "addMessage");
    

    这一行

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

    编辑:顺便说一句,4.0 即将推出,客户端以及服务器端的东西都会得到很大改进。

    【讨论】:

    • 谢谢,@Uffe,这就像一个魅力!关于我的第二个问题有什么想法吗?我可以使用端口 80 进行 XSockets 通信吗?如果不是现在,那会不会是添加的东西?
    • 您可以在端口 80 上运行 XSockets,但如果您已经有 IIS 或其他网络服务器/服务使用该端口,则不能。我们即将发布 4.0,然后您将能够在 OWIN 中托管 XSocket,因此使用端口 80
    • 感谢您的更新。我会在 4.0 上街时去看看。