WebSocketSharp .onMessage в главном потоке? / обработка в Unity?

#unity3d #websocket-sharp

#unity3d #websocket-sharp

Вопрос:

Мне очень сложно найти простую надежную библиотеку для использования в Unity для простого клиента websocket. WebSocketSharp (т.Е.https://github.com/sta/websocket-sharp ) кажется прекрасным, но многие элементы необъяснимы.

Когда поступают входящие сообщения,

     wssharp_connection.OnMessage  = (sender, e) =>
    {
        if (!e.IsText) { return; }
        Debug.Log(">> OnMessage, "   e.Data);
        Handle(e.Data);
        // but wait, not the main Unity thread??
    };

   void Handle(string msg)
   {
   .. your conventional Unity call, in a monobehavior
   }
  

Тестирование показывает, что он, похоже, поступает (всегда? иногда?) не основной поток Unity.

Кто-нибудь знает

  1. На самом деле это всегда не основной поток, или он может меняться?

  2. Если всегда другой поток, на самом деле это всегда один и тот же поток, или он варьируется / много?

Поскольку каждое отдельное приложение Unity, использующее клиент websocket, должно это делать, я удивлен, что нет 100 обсуждений о том, как обрабатывать входящие сообщения, в том числе на странице WebSocketSharp,

но вот что я бы сделал, просто обычным способом, которым вы обрабатываете «потоки» в движке на основе фреймов, таком как Unity:

     wssharp_connection.OnMessage  = (sender, e) =>
    {
        if (!e.IsText) { return; }
        incoming_messages.Enqueue(e.Data);
    };

// and ...

ConcurrentQueue<string> incoming_messages = new ConcurrentQueue<string>();
void Update()
{
    if (incoming_messages.TryDequeue(out var message))
    {
        Handle(message);
    }
}
  

Итак, тогда

  1. Действительно ли это обычный способ решения проблемы с потоками в WebSocketSharp при использовании внутри Unity?

Учитывая, сколько миллиардов приложений Unity существует с клиентами websockets, это должно быть довольно проторенный путь.

Комментарии:

1. привет @Fattie, не могу ответить на ваши вопросы так, как хочу, потому что я никогда не использую WebSocketSharp, но, возможно, это репозиторий, который я сделал давным-давно, мог бы помочь с простой обработкой сокета TCP: github.com/EricBatlle/SimpleUnityTCP . Мои соображения по поводу ваших вопросов таковы: 1. Ваши сообщения могут быть получены только в вашем основном потоке, поскольку в Unity больше нет потоков. 2. Каждый раз, когда мне нужно обрабатывать сокеты, я обнаруживаю, что создаю внешнее программное обеспечение для этого ^^’

2. Я искал, как обрабатывать сообщения с помощью этой библиотеки. Ваш вопрос решает мою проблему! ConcurrentQueue отлично работает для меня. Спасибо

3. @Willyan Надеюсь, это поможет. Действительно, я рекомендую github.com/Marfusios/websocket-client в наши дни. Желаю удачи.

4. Этот вопрос очень старый и вводящий в заблуждение. Он был отредактирован, и, поскольку есть ответ, я не могу его удалить. Упомянутая библиотека больше не работает. Фактически (2021) единственной рабочей библиотекой является github.com/Marfusios/websocket-client .. когда появится еще один, кто-нибудь, пожалуйста, упомяните об этом!

5. @Fattie Несмотря на то, что он платный, BestHTTP в хранилище ресурсов Unity является лучшей сетевой библиотекой, и я годами использую его в своих проектах без проблем. Я увидел этот вопрос, потому что я хотел бы предложить альтернативы с открытым исходным кодом для людей, которые предпочли бы использовать это вместо этого.