Witam.
Napisałem sobie prostą wielowątkową aplikację klient serwer. Chciałbym teraz rozszerzyć możliwości klienta. Gdy uruchomi aplikację chcę aby miał możliwość wyboru serwera. No i tu tkwi problem jak w prosty sposób "pobrać" serwery? Aby zobrazować o co mi chodzi zrobiłem proste GUI:
Musi być w sieci jeden serwer, nazwijmy go rootem (lub rootami jeżeli jest ich kilka), do którego będą zgłaszały się wszystkie pozostałe serwery w momencie uruchomienia. Jeżeli klient będzie chciał użyć wyszukiwarki serwerów to zwróci się z zapytaniem do roota, a ten odpowie listą podłączonych i aktywnych serwerów. Oczywiście serwery muszą okresowo raportować rootowi swój stan żeby ten ni rozgłaszał do klientów niedziałających już maszyn.
PS: To wszystko bardzo ładnie da się napisać i zasymulować w domowych warunkach. Będzie potrzeba tylko trochę wirtualnych maszyn do testowania. VBox Twoim pomocnikiem :) ...i przygotuj się na równolegle otwarte trzy albo cztery "wiżułale" razem z tymi wirtualami :) ...SSD Twoim pomocnikiem :)
Pewnie tak ale mam inny problem nie wiem czemu mój klient nie łączy się z serwerem. Kod skopiowałem z msdn i jak jest w jednym pliku to działa, gdy rozdzielę go na serwer i klienta to przestaje. Tutaj kod może ktoś pomoże:
Klient:
using System;
using System.IO;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace Client
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void ConnectToServer_Click(object sender, RoutedEventArgs e)
{
try
{
Windows.Networking.Sockets.StreamSocket socket = new Windows.Networking.Sockets.StreamSocket();
Windows.Networking.HostName serverHost = new Windows.Networking.HostName("localhsot");
string serverPort = "1337";
await socket.ConnectAsync(serverHost, serverPort);
Stream streamOut = socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(streamOut);
string request = "test";
await writer.WriteLineAsync(request);
await writer.FlushAsync();
Stream streamIn = socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(streamIn);
string response = await reader.ReadLineAsync();
status.Text = "ok";
}
catch (Exception ex)
{
status.Text = ex.Message.ToString();
}
}
}
}
Serwer:
using System;
using System.IO;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
namespace Server
{
public sealed partial class MainPage : Page
{
public MainPage()
{
this.InitializeComponent();
}
private async void SocketListener_ConnectionReceived(Windows.Networking.Sockets.StreamSocketListener sender,
Windows.Networking.Sockets.StreamSocketListenerConnectionReceivedEventArgs args)
{
Stream inStream = args.Socket.InputStream.AsStreamForRead();
StreamReader reader = new StreamReader(inStream);
string request = await reader.ReadLineAsync();
Stream outStream = args.Socket.OutputStream.AsStreamForWrite();
StreamWriter writer = new StreamWriter(outStream);
await writer.WriteLineAsync(request);
await writer.FlushAsync();
}
private async void CreateServer_Click(object sender, RoutedEventArgs e)
{
try
{
Windows.Networking.Sockets.StreamSocketListener socketListener = new Windows.Networking.Sockets.StreamSocketListener();
socketListener.ConnectionReceived += SocketListener_ConnectionReceived;
await socketListener.BindServiceNameAsync("1337");
status.Text = "ok";
}
catch (Exception ex)
{
status.Text = "not ok";
}
}
}
}
Windows.Networking.HostName serverHost = new Windows.Networking.HostName("localhsot");
Literówka, powinno być "localhost". Nie wiem czy to to akurat powoduje błąd, ale może.