Я пытаюсь настроить конкретный сценарий, но, очевидно, у меня проблемы. Мой сервер - это сайт, на котором в основном размещается служба 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, он попадает, поэтому я думаю, что он подключается. Но сообщение насоса никогда не делает его клиенту.
Два вопроса:
Спасибо за любую помощь!
Поэтому, чтобы увидеть, что ваш насос действительно отправлял на сервер, я добавил собственный конвейер.
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);
}
}
Поскольку я тогда увидел, что вы отправляете строку, которая на самом деле не имела свойства с именем "сообщение". Actionmethod "AddMessage" ожидает, что вы передадите сообщение свойства строки типа. Таким образом, вы можете решить это двумя способами, оба они просты.
Просто замените параметр строки в AddMessage на ITextArgs
public void AddMessage(ITextArgs message)
или...
Передайте объект из рабочего потока вместо строки, подобной этой
connection.Send(new {message}, "addMessage");
Итак, все, что вам нужно сделать, чтобы заставить его работать, - это изменить эту строку
connection.Send(message, "addMessage");
с этой строкой
connection.Send(new {message}, "addMessage");
EDIT: Btw, 4.0 находится в пути, и клиент будет очень улучшен, а также серверный материал.