Клиент XSockets подключается, но не получает сообщения

1

Я пытаюсь настроить конкретный сценарий, но, очевидно, у меня проблемы. Мой сервер - это сайт, на котором в основном размещается служба 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.net

1 ответ

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);
    }        
}

Поскольку я тогда увидел, что вы отправляете строку, которая на самом деле не имела свойства с именем "сообщение". Actionmethod "AddMessage" ожидает, что вы передадите сообщение свойства строки типа. Таким образом, вы можете решить это двумя способами, оба они просты.

  1. Просто замените параметр строки в AddMessage на ITextArgs

    public void AddMessage(ITextArgs message)
    

    или...

  2. Передайте объект из рабочего потока вместо строки, подобной этой

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

Итак, все, что вам нужно сделать, чтобы заставить его работать, - это изменить эту строку

connection.Send(message, "addMessage");

с этой строкой

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

EDIT: Btw, 4.0 находится в пути, и клиент будет очень улучшен, а также серверный материал.

  • 0
    Спасибо, @Uffe, это сработало как шарм! Есть идеи по поводу моего второго вопроса? Могу ли я использовать порт 80 для связи с XSockets? Если не сейчас, это когда-нибудь будет добавлено?
  • 0
    Вы можете запускать XSockets на порту 80, но не в том случае, если у вас уже есть IIS или другой веб-сервер / служба, использующая этот порт. Мы собираемся выпустить 4.0, и тогда вы сможете разместить XSockets в OWIN и для этого использовать порт 80
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню