Witam, napisałem w c# czat ale tylko 1:1 Server -> client na anynchronicznych TcpClient.
Chciałbym rozszerzyć program o możliwość konwersacji z wieloma osobami. Moja logika jest taka:
- Client wysyla wiadomosc do serwera
- Server odbiera i wysyła foreach każdego klienta tą wiadomosc ( rowniez do tego co wysłał, dubluje ale ułatwia to troche życie)
- TextBoxKażdegoKlienta.add(wiadomosc);
Otwieram aplikacje:
- Server start
- Client łączy się
- Wysyła wiadomosc, serwer zwraca
- Tylko jeden klient moze wysyłac wiadomosc do pozostałych, od innych wiadomosc nie dochodzi.foo
W następnym wysyłaniu z różnych chatów Client 1 / 2 wiadomości dochodzą ale nie od razu i nie w takich kolejnościach.
kody:
Server: http://pastebin.com/mBgEA8za
Clienci: http://pastebin.com/bEd5PqPv
Opis:
Wątki work 1-3
wątek 1 - nasłuchiwanie połączenia ( w whilu)
wątek 2 - wysyłanie
wątek 3 - *** TYLKO SERWER *** Wyszukiwanie nowych klientów.
kod:
private void backgroundWorker3_DoWork(object sender, DoWorkEventArgs e)
{
TcpListener listener = new TcpListener(IPAddress.Any, 13000);
//listaTcpListener.Add(new TcpListener(IPAddress.Any, 13000)); czy wystarczy 1 listener?
bool NieMaZadnegoKlienta = true;
int licznikClientow = 0;
while (true)
{
listener.Start(); // nasluchujemy
listaClientow.Add(new TcpClient()); // dodajemy nowego
listaClientow[licznikClientow] = listener.AcceptTcpClient(); //przypisujemy
listaSTR.Add(new StreamReader( listaClientow[licznikClientow].GetStream() ) ); // do czytania
listaSTW.Add(new StreamWriter( listaClientow[licznikClientow].GetStream() ) ); // do wysylania wiadomosci
listaSTW[licznikClientow].AutoFlush = true; //czysci bufor
if(listaClientow[0].Connected && NieMaZadnegoKlienta) // start watku nasluchiwania przez serwer
{
NieMaZadnegoKlienta = false;
worker1.RunWorkerAsync(); // ten nasluchuje
worker2.WorkerSupportsCancellation = true; //ten wysla
}
licznikClientow++;
}
}
Do tego stworzyłem 3 listy, chyba TcpListerner ma byc tylko jeden? wiec nie tworzyłem listy
private List<TcpClient> listaClientow = new List<TcpClient>();
private List<StreamReader> listaSTR = new List<StreamReader>();
private List<StreamWriter> listaSTW = new List<StreamWriter>();
Bardzo proszę o pomoc !