Problem z przesyłaniem komunikatów poprzez StreamWriter

0

Witam,

Piszę komunikator sieciowy oparty na centralnym serwerze. Moje rozwiązanie polega na tym, że serwer nasłuchuje połączenia klientów. Kiedy podłącza się klient, tworzone są dla niego strumienie:


TcpClient tcpClient = serwer.AcceptTcpClient();
NetworkStream netStream = tcpClient.GetStream();
StreamReader strReader = new StreamReader(netStream);
StreamWriter strWriter = new StreamWriter(netStream);

Następnie dodawane są one do HashTables przechowujących powyższe strumienie dla każdego klienta:

strWriters.Add(client, strWriter);
strReaders.Add(client, strReader);

Po tym kroku tworzony jest nowy wątek obsługujący podłączającego się klienta. Do tego wątku przekazywane są referencje do powyższych tablic strumieni po to, żeby dany klient miał też dostęp do strumieni klientów podłączających się po nim.

Wątek nasłuchuje komunikatów i w zależności od prefixu podejmuje odpowiednią akcje np. dla prefixu "$$M" wysyła wiadomość do adresata.

if (prefix.Equals("$$M"))
{
    message = "$$M#" + trescWiadmosci;
    ((StreamWriter)streamWriters[adresat]).WriteLine(message);
    ((StreamWriter)streamWriters[adresat]).Flush();      
 }
 

Taką wiadomość odbiera adresat i też na podstawie prefixu decyduje co z takim komunikatem zrobić.
Podobnie działa np. wyswietlanie profilu użytkownika (prefix ""$$P).

Mój problemem jest następujący. Zdarza się tak, że:

  • klient wysyła komunikat
  • serwer odbiera go i na podstawie odpowiednich danych wysyła go dalej przez StreamWriter do odpowiedniego adresata

jednak ta wiadomość nie dochodzi już niego.

Czy ktoś wie może, o co tu chodzi?

0

Czytając ten post doszedłem do wniosku że Ty za każdym nowym klientem podłączony tworzysz nową tablice hash?? prawda??

Ja jak pamiętam jak bawiłem się komunikatorem(którego jeszcze nie skończyłem) to robiłem classe z danymi gdzie był jeden hashtable i który był tylko raz wywoływany potem robiłem sesje też klase obsługującą kpobrane z tej classy z hashtable i w każdym momencie była aktualna sprawdzałem też czy klient jest dostępny przed wysłaniem komunikatu i wszystko szło ładnie pięknie

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