Panowie, dziękuję za poprzednią pomoc, ale nadal walczę i zaraz chyba oszaleję. Czy początkujący zawsze mają takie chwile, że myślą już o odpuszczeniu sobie?
Najpierw mój kod:
tcpListener = new TcpListener(serverAdd, 10); //w konstruktorze
watekNasluchiwanie = new Thread(nasluchujKlientow);
watekOdbieranie = new Thread(odbierajWiadomosci);
watekNasluchiwanie.Start();
private void nasluchujKlientow()
{
while (true)
{
if (tcpListener.Pending())
{
lock (listaKlientow)
{
listaKlientow.Add(new Klient(tcpListener.AcceptSocket()));
txtListaOsobPolaczonych.Text += "Nowy \r\n";
}
}
txtWczytaneAukcje.Text += "+"; //żebym tylko widział jak się to dzieje, tymczasowo
Thread.Sleep(500);
}
}
private void odbierajWiadomosci()
{
string s;
while (true)
{
lock (listaKlientow)
{
foreach (Klient klient in listaKlientow)
{
networkStream = new NetworkStream(klient.Socket);
streamReader = new StreamReader(networkStream);
try
{
s = streamReader.ReadLine();
MessageBox.Show(s);
}
catch
{
break;
}
}
}
txtWczytaneAukcje.Text += "*"; //również tylko informacja dla mnie tymczasowa
Thread.Sleep(500);
}
}
Uruchamiam serwer, wszystko ładnie idzie - pojawiają się gwiazdki i plusiki. Dołączam pierwszego klienta - wątek do odbierania wiadomości przestaje chodzić (stawiałem breakpointa na while, nawet się tam nie pojawia)... dołączam drugiego - wątek do nasłuchiwania przestaje chodzić i się nie dołącza do listy. Panowie, co robię źle? Już mi ten program sen z powiek spędza.
Jeśli zakomentuję włączenie wątku do odbierania wiadomości, to mogę połączyć ile chce klientów i wszystko jest dobrze. W czym problem?
Domyślam się, że to jakieś podstawy i pewnie takie pytania w dziale Newbie powinny lądować, ale wydaje mi się, że tutaj szybciej otrzymam pomoc.
Zapomniałbym dopisać - czy wpływ na to może mieć:
CheckForIllegalCrossThreadCalls = false;
?
Jest to tymczasowe rozwiązanie, jak dojdą mi pierwsze wiadomości od kilku klientów, to od razu robię to jak należy - tylko chciałbym mieć na początek jakiś punkt zaczepienia. Z tym lockiem to też tak wymyśliłem na poczekaniu, ale chyba jest to jest okej. Proszę o rady.
@Edit
Doszedłem do wniosku, że to ta linia powoduje problemy:
s = streamReader.ReadLine();
Ale co tutaj jest źle?
@edit2
Moje kolejne wnioski - metoda ReadLine() czeka aż coś przyjdzie... dopiero puszcza dalej. Ale to nie rozwiązuje mojego problemu... przecież ja chcę wyświetlić o ile coś dojdzie - może się okazać, że od tego klienta nie będę chciał nic otrzymać, co wtedy? Można ustawić "coś", co np. po kilku milisekundach puści metodę dalej?
Dlaczego:
MessageBox.Show(streamReader.Peek().ToString());
Przechodzi (na jeden raz, bo wysłaniu komunikatu)
A już
string s = streamReader.ReadLine();
MessageBox.Show(s);
ten kod nie?