У меня есть два приложения для 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)
Что я делаю неправильно? Может быть, я должен сказать, что я относительно новичок в программировании сетевых подключений, разъемов и т. Д.
Спасибо за любую помощь!
Вы изменили имя хоста что-то дельное? Вы проверили правила брандмауэра? –
Я также пробовал с выключенным брандмауэром. Я пробовал «127.0.0.1» в качестве имени хоста, я также пробовал «minwinpc» (имя RPi в локальной сети), но ничего не работало. – drummercrm
Вы пробовали с IP-адресом своего Pi? –