XSockets客户端连接但未接收消息

时间:2014-05-21 02:32:16

标签: c# xsockets.net

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

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”) ?
  3. 感谢您的帮助!

1 个答案:

答案 0 :(得分: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"的属性的字符串。动作方法" AddMessage"希望您传入一个string类型的属性消息。所以你可以通过两种方式解决这个问题,两者都很简单。

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

    即可
    public void AddMessage(ITextArgs message)
    

    ...或

  2. 传入工作线程中的对象而不是像这样的字符串

    connection.Send(new {message}, "addMessage");
    
  3. 所以你需要做的就是改变这一行

    connection.Send(message, "addMessage");
    

    这一行

    connection.Send(new {message}, "addMessage");
    
    编辑:顺便说一下,4.0正在推出,客户端将得到很大的改进以及服务器端的东西。