3

У меня есть два приложения для Windows UWP. Один из них («сервер») работает на малине Pi 2 в Windows IoT (10586.0). Другой («клиент») работает на любом устройстве Windows 10 в той же сети.Сетевое соединение с приложениями UWP

Я хочу, чтобы приложения «разговаривали» друг с другом. На данный момент я просто хочу отправить простую строку из клиента на сервер. Позже сериализованные данные должны передаваться через сеть.

Это код сервера приложения:

namespace LCARSHomeAutomation 
{ 
/// <summary> 
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann. 
/// </summary> 
public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 

     try { 
      EstablishNetworking(); 
      txb_Events.Text += "Server Running"; 
     }catch (Exception ex) 
     { 
      txb_Events.Text += ex.Message; 
     } 


    } 

    private async void EstablishNetworking() 
    { 
     await StartListener(); 
    } 

    public async Task StartListener() 
    { 
     StreamSocketListener listener = new StreamSocketListener(); 
     listener.ConnectionReceived += OnConnection; 

     listener.Control.KeepAlive = true; 

     try 
     { 
      await listener.BindServiceNameAsync("5463"); 

     } 
     catch (Exception ex) 
     { 
      if (SocketError.GetStatus(ex.HResult) == SocketErrorStatus.Unknown) 
      { 
       throw; 
      } 
      //Logs.Add(ex.Message); 
      txb_Events.Text += ex.Message; 
     } 

    } 

    private async void OnConnection(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args) 
    { 
     Stream inStream = args.Socket.InputStream.AsStreamForRead(); 
     StreamReader reader = new StreamReader(inStream); 
     string request = await reader.ReadLineAsync(); 

     await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, 
            () => 
            { 
             // Your UI update code goes here! 
             txb_Events.Text += (String)request; 
            }); 


    } 

    private async Task ConnectSocket() 
    { 
     StreamSocket socket = new StreamSocket(); 

     socket.Control.KeepAlive = false; 

     HostName host = new HostName("localhost"); 

     try 
     { 
      await socket.ConnectAsync(host, "5463"); 

      Stream streamOut = socket.OutputStream.AsStreamForWrite(); 
      StreamWriter writer = new StreamWriter(streamOut); 
      string request = "Test Self App \n"; 
      await writer.WriteLineAsync(request); 
      await writer.FlushAsync(); 

      socket.Dispose(); 
     } 
     catch (Exception ex) 
     { 
      txb_Events.Text += ex.Message; 
      //Logs.Add(ex.Message) 
     } 


    } 

    private async void btn_Send_Click(object sender, RoutedEventArgs e) 
    { 
     await ConnectSocket(); 
    } 

} 
} 

Как вы можете видеть, я установления сетевого соединения с одного приложения на том же хосте и отправить строку «Самотестирование приложения». Это отлично работает в течение некоторого времени, но через некоторое время я получаю ошибку:

Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll

WinRT information: No connection could be made because the target machine actively refused it.

Итак, это мой первый вопрос: Что это за ошибки и как я могу это исправить?

Другое дело: я не могу установить сеть. Соединение между сервером и клиентом. Я не знаю, что я делаю неправильно. Это код "Клиент":

namespace LCARSRemote 
{ 
/// <summary> 
/// Eine leere Seite, die eigenständig verwendet oder zu der innerhalb eines Rahmens navigiert werden kann. 
/// </summary> 
public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private async void btn_Send_Click(object sender, RoutedEventArgs e) 
    { 
     StreamSocket socket = new StreamSocket(); 

     HostName host = new HostName("localhost"); //Replace with coorect hostname when running on RPi 

     try 
     { 
      try { 
       await socket.ConnectAsync(host, "5463"); 
      } 
      catch(Exception ex) 
      { 
       txb_Events.Text += ex.Message; 
      } 

      Stream streamOut = socket.OutputStream.AsStreamForWrite(); 
      StreamWriter writer = new StreamWriter(streamOut); 
      string request = "Remote App Test"; 
      await writer.WriteLineAsync(request); 
      await writer.FlushAsync(); 

      socket.Dispose(); 

     } 
     catch (Exception ex) 
     { 
      txb_Events.Text += ex.Message; 
      //Logs.Add(ex.Message) 
     } 

    } 
} 
} 

Когда я нажимаю на btn_Send, я получаю сообщение об ошибке

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

и

A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

Что я делаю неправильно? Может быть, я должен сказать, что я относительно новичок в программировании сетевых подключений, разъемов и т. Д.

Спасибо за любую помощь!

+0

Вы изменили имя хоста что-то дельное? Вы проверили правила брандмауэра? –

+0

Я также пробовал с выключенным брандмауэром. Я пробовал «127.0.0.1» в качестве имени хоста, я также пробовал «minwinpc» (имя RPi в локальной сети), но ничего не работало. – drummercrm

+0

Вы пробовали с IP-адресом своего Pi? –

ответ

1

Вы должны попробовать использовать API StreamSocket в UWP. В этом примере содержание Репо как сервер и код клиента: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/StreamSocket

A method was called at an unexpected time. (Exception from HRESULT: 0x8000000E)

Эта ошибка произошла со мной, когда я пытаюсь вызвать ConnectAsync два раза подряд, я думаю, что вы можете проверить свою логику и отладки для подтверждения в вашем случае.

+0

Я взглянул на эти примеры, но они не были очень полезными. Ошибки все еще существуют. Я также попытался использовать DataWriter/DataWriter вместо StreamReader/-Writer (как в приведенном выше примере), но он также не работал. – drummercrm

0

В зависимости от того, сколько данных вы говорите и что такое конечный вариант использования, платформа AWS IoT платформы Amazon может быть чем-то интересным. Это довольно круто по ряду причин. В частности, мне нравится, что целевое устройство может находиться в автономном режиме во время передачи.

Это бесплатно (250 000 сообщений) в течение первого года и 5 долларов за миллион сообщений после этого. Каждый 512-байтовый блок подсчитывает 1 сообщение.

+0

Это не возможное решение для меня, потому что я хочу, чтобы приложения разговаривали друг с другом, даже когда нет подключения к Интернету. – drummercrm

1

Первая ошибка

Exception thrown: 'System.Runtime.InteropServices.COMException' in mscorlib.ni.dll

WinRT information: No connection could be made because the target machine actively refused it.

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

A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.

Это происходит потому, что клиент и сервер находятся на одной машине, я бегущий в эту же проблему, мол, вы можете запустить из командной строки с повышенными

checknetisolation loopbackexempt -d -n= {package family} 

разрешить его.

Это решение не сработало для меня. Таким образом, ваш сервер должен работать на pi, а клиент должен запускаться на вашем настольном ПК для Windows 10 UWP, чтобы иметь возможность подключиться к нему. Windows 10 не разрешает шлейфовое соединение для приложений UWP, насколько я могу судить.

Если вы действительно хотите запустить сервер/веб-сервер сокет node.js окна универсальные приложения могут быть хорошим подходом

https://ms-iot.github.io/content/en-US/win10/samples/NodejsWU.htm 

или

RestUP https://github.com/tomkuijsten/restup 
Смежные вопросы