Клиент не получил сообщение от сокета js server - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю над установлением обмена сообщениями между приложением UWP на рабочем столе и Hololens 1.

В соответствии с реализацией Websockets из документации Microsoft Реализация Websocket Я мог бы реализовать сигнализациючасть к Nodejs с socket.io Server

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendFile(__dirname + '/index.html');
});


var PORT = 3000;
var userId = 0;

http.listen(PORT, function () {
  console.log('listening on *: ' + PORT);
});

io.on('connection', function(socket){
    socket.userId = userId++;
    console.log('a user connected, user id: ' + socket.userId);

    socket.on('mess', function (msg) {
    console.log('message from user#' + socket.userId + ": " + msg);
    // Send message with emit"mess" to all client
    io.emit('mess', msg);
  });

  socket.on('disconnect', function(){
    console.log('user disconnected');
  });
});

Оба клиента (приложение uwp и hololens могут установить на сервер. На компьютере я могу отправить некоторые данные на сервер. Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, чточто Hololens не получает сообщение от сервера.

Для коммуникационной части я использую класс-обертку, который обеспечивает функции отправки и получения для 2 клиентов. Этот класс-обертка был создан для того, чтобы dll inorder ссылался на 2Разница в проекте (приложение uwp и приложение Unity для hololens)

// Declare "Using" part here...

namespace SocketWrapperNamespace
{

    public delegate void OnReceiveMessengerCallback(string msg);
    public delegate void OnDisconnectCallback(bool connect);

    public class SocketWrapper
    {
        public event OnReceiveMessengerCallback OnReceiveMessenger;
        public event OnDisconnectCallback onDisconnect;

#if !UNITY_EDITOR
        private Uri _uri;
        private MessageWebSocket messageWebSocket;
        private DataWriter dataWriter;
#endif
        // Client can call this function to connect
        public void Connect(string uri)
        {
#if !UNITY_EDITOR
            try
            {
                Connector(uri);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
#endif
        }

        private async void Connector(string uri)
        {
#if !UNITY_EDITOR
           // Code here look pretty much like in the example from microsoft documentation
#endif
        }

        // Function for client to send message to server
        public void SendMessage(string emiter, string message)
        {
#if !UNITY_EDITOR
            try
            {
                Emit(emiter, message);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
#endif
        }


        //Emitter
        private async void Emit(string emiter, string message)
        {
#if !UNITY_EDITOR
            try
            {
                if (messageWebSocket == null)
                {
                    return;
                }
                if (dataWriter == null)
                {
                    return;
                }

                string form = string.Format("42[\"{0}\",\"{1}\"]", emiter, message);

                dataWriter.WriteString(form);
                await dataWriter.StoreAsync();
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
#endif
        }

        //Disconnect
        public void Disconnect()
        {
#if !UNITY_EDITOR
          // Disconnecting server ...
#endif
        }

        //Message Arrived Handler
        private void WebSocket_MessageArrived(MessageWebSocket sender, MessageWebSocketMessageReceivedEventArgs args)
        {
#if !UNITY_EDITOR
            try
            {
                if (OnReceiveMessenger == null)
                {
                    return;
                }
                using (DataReader dataReader = args.GetDataReader())
                {
                    if (dataReader != null)
                    {
                        dataReader.UnicodeEncoding = UnicodeEncoding.Utf8;
                        string message = dataReader.ReadString(dataReader.UnconsumedBufferLength);
                        OnReceiveMessenger?.Invoke(message);
                    }
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
#endif
        }

        //Websocket Close Handler
        private void WebSocket_Closed(IWebSocket sender, WebSocketClosedEventArgs args)
        {
#if !UNITY_EDITOR
            // Close work here ...
#endif
    }
}

На Hololens я подготавливаю соединение с сервером и прослушиваю событие полученного сообщения.

// hololens client call this method to initialize the connection
public void OnStart()
    {
        socketWrapper = new SocketWrapper();
        uri = String.Concat("ws://",server,":3000/socket.io/?EIO=3&transport=websocket");
#if !UNITY_EDITOR
        socketWrapper.Connect(uri);
        socketWrapper.OnReceiveMessenger += OnMessageArrived_Handler;
        socketWrapper.onDisconnect += OnDisconnect_Handler;
#endif
    }

//Message Arrived Handler
    private void OnMessageArrived_Handler(string msg)
    {
// Here I do not received any message from server
}

Какую ошибку я сделал ей? Интересно, что хотя яn подключиться к серверу от hololens, но кажется, что часть подписки не работает?Учтите, что 2 проекта находятся в разных местах, и то же самое происходит с dll.

Я думаю, что мне нужно настроить класс SocketWrapper как Singleton, потому что часть hololens создает новый объект Object, поэтому подписка может не работатьздесь

Любое лучшее предложение для решения этой проблемы с другой реализацией было бы полезно.

Спасибо

1 Ответ

1 голос
/ 16 апреля 2019

Я думаю, что лучшим решением для использования WebSocket в среде C # и Unity является библиотека WebSocketSharp .Он имеет отличную реализацию и обновляется в течение 6 лет до сих пор.Также есть 3 примера того, как использовать его в различных сценариях.

...