XSockets客户端连接但没有接收消息

本文关键字:消息 客户端 连接 XSockets | 更新日期: 2023-09-27 18:04:15

我正在尝试设置一个特定的场景,但是,显然,我遇到了问题。我的服务器是一个主要托管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")?

谢谢你的帮助!

XSockets客户端连接但没有接收消息

因此,为了查看泵实际发送到服务器的内容,我添加了一个自定义管道。

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就在路上,客户端和服务器端的东西都会得到很大的改进。