2016-10-11 3 views
0

У меня проблема. Я пытаюсь прочитать через сокеты строку в приложении uwp с сервера node.js без каких-либо успехов. Я получил System.Runtime.InteropServices.COMException, и я не знаю, как это исправить. Мне удастся отправить с успехами от клиента uwp на сервер узла строку, но я не могу сделать наоборот. Вот мой код, что я делаю неправильно?Не удалось получить данные через сокеты от Node.js к приложению 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

Я проверил код, и я нашел, если нет больше данные могут быть прочитаны объектом DataReaderreader, кодовая строка 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 пожалуйста ссылаются на official sample.

+0

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