#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. ваш ответ был очень полезен. По некоторым неизвестным причинам я не могу проголосовать за вас. Отличный ответ!!!