Witam wszystkich serdecznie ;) W końcu udało mi się zmobilizować i przysiadłem trochę do nauki programowania. Tak więc wziąłem się w końcu za programowanie sieciowe, na początek chcę napisać prosty chat tekstowy, gdzie będzie jeden serwer i każdy będzie mógł do niego dołączyć (w sensie, na serwerze będzie mogło znajdować się "nieskończenie wiele" klientów - przynajmniej w teorii). To co udało mi się do tej pory "sklecić":
Na wstępnie zaznaczam, że mało z tego rozumiem dlatego też pojawiają się te polskie komentarze. Po prostu szybciej się mi je pisze :P
Server:

namespace Chat2.ChatServer
{
    public class Server
    {
        public Server(string IP, int Port)
        {
            Console.WriteLine("Server started...");
            TcpListener listener = new TcpListener(IPAddress.Parse(IP), Port); // przypisuje adres nasłuchiwania jako X na porcie Y                  
            listener.Start();
            Console.WriteLine("Waiting for client...");
            TcpClient newClient = listener.AcceptTcpClient(); //oczekiwanie na klienta, po połączeniu akceptacja
            Console.WriteLine("Client has been connected\n Waiting for data...");
            BinaryReader reader = new BinaryReader(newClient.GetStream()); //czekaj na dane od klienta
            while (true)
            {
                Console.WriteLine(reader.ReadString()); //wyświatlamy odebrane dane...
            }
        }
    }
}

Client:

namespace Chat2.ChatClient
{
    public class Client
    {
        public Client(string IP, int Port)
        {
            TcpClient externalClient = new TcpClient(); //nowy klient
            Console.WriteLine("Trying to connect...");
            externalClient.Connect(IP, Port); // próba połączenia
            Console.WriteLine("Connected!");
            BinaryWriter writer = new BinaryWriter(externalClient.GetStream()); //do wysyłania
            while (true)
            {
                writer.Write(Console.ReadLine()); //wysyłamy dane
            }
        }
    }
}

Kod pozwala na połączenie się klienta z serwerem i ciągły odbiór danych przez serwer od klienta. Podłączyć się może tylko jeden klient, gdyż po wykonaniu tej linijki:

TcpClient newClient = listener.AcceptTcpClient();

z tego co widzę, inne połączenia nie są już akceptowane. Postawienie tego w pętli(na innym wątku) też jest bez sensu bo będę cały czas oczekiwał na nowego klienta i nawet ten który się połączy po chwili nie będzie mógł nadawać...
Myślałem nad tym trochę i w mojej głowie narodził się taki pomysł:

  1. Muszę stworzyć tablicę/listę obiektów typu:
TcpClient newClient = listener.AcceptTcpClient();

Przy czym każdy nowo połączony klient, będzie miał przydzielony obiekt "TcpClient" o innym indeksie. Od tego będzie osobna metoda, która będzie działała w osobnym wątku i po prostu czekała na kolejnych klientów i ich akceptowała. Dobrze kombinuję? Jedyny problem jaki przychodzi mi do głowy to... Jak ktoś rozłączy się 10x to za 10x będzie już miał index 10. Z czasem tablica/lista będzie niepotrzebnie się rozrastać....
2. Muszę stworzyć też listę obiektów typu:

BinaryReader reader = new BinaryReader(newClient.GetStream());

dla powyższych klientów, coby odbierać od każdego dane. To działoby się równolegle na innym wątku.

To jestem w stanie zrobić(tak mi się wydaje). Jednak pozostaje jeszcze problem tego, jak dane odebrane rozsyłać do wszystkich klientów? Tak przecież działa czat... Jedna osoba pisze, wszyscy odbierają wiadomość. Tak, więc serwer musi odebrane dane od jednego klienta wysyłać do wszystkich za wyjątkiem tego klienta, który te dane wysłał(bo po co ma odbierać to co już sam wysłał). Nie mam pojęcia jak to jakoś sensownie zrobić. W końcu trzymanie wszystkich danych w jakimś stringu i wysyłanie co jakiś czas tego samego, jest delikatnie mówiąc bez sensu...

Ufff... To chyba wszystko, niby prosty chat, a tyle kwestii do opisania...
Teraz moje pytanie do Was: Dobrze kombinuję, czy to wszystko da się osiągnąć jakoś inaczej, prościej? No i jak osiągnąć ostatni cel...

Pozdrawiam ;)