Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XSockets客户端正在连接但未接收消息_C#_Xsockets.net - Fatal编程技术网

C# XSockets客户端正在连接但未接收消息

C# XSockets客户端正在连接但未接收消息,c#,xsockets.net,C#,Xsockets.net,我试图设定一个特定的场景,但显然,我遇到了问题。我的服务器是一个主要承载WCF服务的站点,但我想在那里添加一个XSockets主机。根据readme.txt中的说明,我在引导代码文件中有标准代码。在客户端连接时,我启动一个工作线程,它基本上是客户端将监视的心跳。控制器的相关代码如下所示: public class HeartbeatController : XSocketController { public void AddMessage(string message) {

我试图设定一个特定的场景,但显然,我遇到了问题。我的服务器是一个主要承载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方法中放置断点,它会被命中,因此我认为它正在连接。但是泵的信息永远不会到达客户机

两个问题:

  • 我有什么明显的遗漏吗
  • (无关)由于许多企业确实不喜欢在防火墙上打孔,有没有办法在这种设置中使用端口80(以便客户端连接看起来像“ws://mywebsite/HeartbeatController”)

  • 谢谢你的帮助

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

    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类型的属性消息。所以你可以用两种方法来解决这个问题,两种方法都很简单

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

    public void AddMessage(ITextArgs message)
    
    或者

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

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

    connection.Send(message, "addMessage");
    
    在这一排

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

    编辑:顺便说一句,4.0即将推出,客户端和服务器端的功能都将得到极大的改进。

    谢谢,@Uffe,这真是太棒了!对我的第二个问题有什么想法吗?我可以使用端口80进行XSockets通信吗?如果现在还没有,还会添加什么吗?您可以在端口80上运行XSockets,但如果您已经有IIS或其他使用该端口的Web服务器/服务,则不能。我们即将发布4.0,然后您将能够在OWIN中托管XSockets,并因此使用端口80谢谢您的更新。我会在4.0上街时查看它。