C# tcp csak egy klienst fogad a szerver, miért?

C# tcp csak egy klienst fogad a szerver, miért?
2017-12-30T22:01:56+01:00
2018-01-02T15:33:04+01:00
2022-10-15T21:31:11+02:00
CorrectName
Sziasztok! 
Van egy szerverem, elvileg mindenhol lefut, csak ha két console-t indítok el egymás után(klienst), akkor a 2.-at nem érzékeli, csak egy ip címet dob vissza a listából, pedig akkor 2 kéne benne legyen.. Mik blokkolják egymást?

class Program { static TcpListener szerver; static TcpClient client; static string ipcim; static NetworkStream stream; static List<string> helyilista = new List<string>(); static void Main(string[] args) { szerver = new TcpListener(IPAddress.Parse("127.0.0.1"), 1001); szerver.Start(); Console.WriteLine("szerver started!"); while (true) { client = szerver.AcceptTcpClient(); ipcim = ((IPEndPoint)client.Client.RemoteEndPoint).Address.ToString();//convertálom az ipjét helyilista.Add(ipcim);//hozzáadjuk a listához az ipjét Uzenetetkap();//megvizsgáljuk van e üzenet a szerveren } } public static void Uzenetetkap() { while (true) { stream = client.GetStream(); //bevonom a hálózatba for (int i = 0; i < helyilista.Count; i++) { Console.WriteLine(helyilista[i]);//kiiratjuk az összes ipt } byte[] data = new byte[1024]; int hossz = stream.Read(data, 0, data.Length); string uzenet = Encoding.ASCII.GetString(data, 0, hossz); Console.WriteLine(uzenet); //kiiratjuk az üzenetet for(int i = 0; i < helyilista.Count; i++) //vegigfutunk a helylistán, h keressünk ip-t { if (uzenet.Contains(ipcim))//megnézzük tartalmaz-e ipt { if(ipcim == helyilista[i])//megnézzük, hogy benne van e az ip a helyilistában { string cimzett = ipcim; Kliensek kli = new Kliensek(ipcim, client); kli.PrivatUzenetKuldes(cimzett, uzenet, new List<Kliensek>());//elküldjük az üzenetet,ha benne van Console.WriteLine("elküldve"); } } } } }
Szerintem a másik class nem zavar be,de ha szerintetek igen, akkor bemásolhatom azt is..
Lefut amikor az első connectelt kliensnél beírom, hogy "oke, 127.0.0.1 okeoke" akkor visszakapom a szerveren, hogy elküldve.
De egyszerűen a 2. klienst nem látja a szeró.. Vagy nem tudom mi a baja...
Mutasd a teljes hozzászólást!
Szerintem a probléma az, hogy mindent a főszálon akarsz megoldani. Ez egy kliensig még jó, viszont amikor több kliens is van, akkor egyszerre kellene figyelni a bejövő új kliensekre (szerver.AcceptTcpClient) és a kliens(ek)től jövő üzenetekre (client.GetStream). Létre kellene hozni minden klienshez egy-egy külön szálat és ezekben a szálakban figyelni az új üzenetekre, így a főszál csak az új kliensekre tudna figyelni. Most azért nem ír ki semmit a második kliensnél, mert amikor csatlakozik, akkor a programod éppen azon van, hogy az első kliens üzenetét várja (client.GetStream) és nem az új bejövő klienseket fogadja.

Ha rákeresel a c# server multiple client-re a kedvenc keresődben, akkor találhatsz sok kódot. A megoldás valami ilyesmi lehet: Multi-Threaded TCP Server in C# - de vedd figyelembe azt, hogy ez 2012-es cikk és lehet, hogy azóta már van jobb megoldás erre.
Mutasd a teljes hozzászólást!

Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd