TCP Klien-Serwer

0

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:
272d41af03.png

0

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 :)

0

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";
            }

        }
    }
}
 
0

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1