Не удалось получить данные через сокеты из Node.js в приложение UWP

#node.js #sockets #networking #windows-store-apps #uwp

#node.js #сокеты #сеть #windows-store-приложения #uwp

Вопрос:

У меня проблема, я пытаюсь прочитать через сокеты строку в приложении uwp из node.js сервер безрезультатно. Я получил System.Runtime.Службы взаимодействия.COMException и я не знаю, как это исправить. Мне удается успешно отправить с клиента uwp на сервер узла строку, но я не могу сделать наоборот. Вот мой код, что я делаю неправильно?

Это мой node.js Серверный код

 var _HOST = '192.168.1.67';
    var _PORT = 1337;
    var _address;

    var net = require('net');

    var server = net.createServer(function(socket) {
        socket.on('connect', (e) => {
            console.log('client connected '  
                socket.remoteAddress   ':'  
                socket.remotePort);
        });

        socket.on('data', function(data) {
            console.log('clients says'   ': '   data);

            var send = "hello client"
            console.log('Server says'   ': '   send);
            socket.write(send   'n');


        });

        socket.on('error', function(data) {
            console.log('client on error', data);

        });

        socket.on('close', (e) => {
            console.log('client disconnected');
            socket.end;
        });

    });
  

Это мой код UWP

   public async Task connect()
        {


            try
            {
                HostName hostName;

                hostName = new HostName(SocksParameters.Host);
                socket.Control.NoDelay = false;
                var cts = new CancellationTokenSource();
                cts.CancelAfter(SampleConfiguration.timeout);

                // Connect to the server
                var connectAsync = socket.ConnectAsync(hostName, SocksParameters.Port);
                var connectTask = connectAsync.AsTask(cts.Token);
                await connectTask;
            }
            catch (Exception e)
            {
                Debug.WriteLine(e.ToString());
                await new MessageDialog("Make sure your Server is open and make sure you follow Instructions To connect localhost").ShowAsync();
                Application.Current.Exit();
            }

        }

public async Task<String> read()
        {
            DataReader reader;
            StringBuilder strBuilder;



            using (reader = new DataReader(socket.InputStream))
            {

                try
                {
                    strBuilder = new StringBuilder();
                    reader.InputStreamOptions = Windows.Storage.Streams.InputStreamOptions.Partial;

                    reader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                    reader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;

                    await reader.LoadAsync(256);
                    while (reader.UnconsumedBufferLength > 0)
                    {
                        strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength));
                        await reader.LoadAsync(256);//System.Runtime.InteropServices.COMException Exception caught
                    }

                    reader.DetachStream();
                    return strBuilder.ToString();
                }
                catch (Exception e)
                {    
                    return (e.ToString());

                }
            }

        }
  

   Activated Event   Time    Duration    Thread
    Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll ("The I/O operation has been aborted because of either a thread exit or an application request.

The I/O operation has been aborted because of either a thread exit or an application request.
")  0.55s       [18700] <No Name> 
  

Ответ №1:

Я протестировал код и обнаружил, что если объект больше не может считывать данные DataReader reader , строка кода await reader.LoadAsync(256); всегда будет ждать там, пока с сервера не будут отправлены новые сообщения, и DataReader сможет их прочитать. В вашем коде, если размер поступающих данных с сервера меньше 256, при втором вызове LoadAsync метода могут возникнуть проблемы.

  await reader.LoadAsync(256);
 while (reader.UnconsumedBufferLength > 0)
 {
     strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength));     
     await reader.LoadAsync(256);
      //System.Runtime.InteropServices.COMException Exception caught
 }
  

Обходной путь, который я предоставил здесь, заключается в том, чтобы определить, можно ли прочитать оставшиеся данные. Обновленный код следующим образом:

  var loadsize = await reader.LoadAsync(256);
 while (loadsize >= 256)
 {
     loadsize = await reader.LoadAsync(256);
 }
 if (reader.UnconsumedBufferLength > 0)
 {
     strBuilder.Append(reader.ReadString(reader.UnconsumedBufferLength));
 }
  

На мой взгляд, похоже, что вы можете использовать StreamReader , что также подходит для вашего сценария, а DataReader не потому, что его проще использовать. Код выглядит следующим образом:

 Stream streamIn = socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();
return response;
  

Более подробная информация о StreamSocket в uwp, пожалуйста, обратитесь к официальному образцу.

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

1. ваш ответ был очень полезен. По некоторым неизвестным причинам я не могу проголосовать за вас. Отличный ответ!!!