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方法中放置一个断点,它会被击中,所以我认为它正在连接。但是泵消息永远不会到达客户端。
两个问题:
- 有什么明显的我错过了吗?
- (无关)由于许多企业真的不喜欢在他们的防火墙打孔,有没有办法使用端口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);
}
}
因为我看到你在发送一个字符串,实际上没有一个名为"消息"的属性。动作方法"AddMessage"期望你传入一个字符串类型的属性消息。所以你可以用两种方法来解决这个问题,它们都很简单。
只需将AddMessage中的字符串参数替换为ITextArgs
public void AddMessage(ITextArgs message)
或…
从工作线程传入一个对象,而不是像这样的字符串
connection.Send(new {message}, "addMessage");
所以你需要做的就是改变这一行
connection.Send(message, "addMessage");
与这行
connection.Send(new {message}, "addMessage");
编辑:顺便说一句,4.0就在路上,客户端和服务器端的东西都会得到很大的改进。