Klient TCP parę pytań

0

Męczę się z napisaniem prostego telnetu.
Wkleiłem kod na pastebin i proszę o powiedzenie, co się Wam nie podoba w kodzie (bo chciałbym to napisać porządnie). http://4programmers.net/Pastebin/1578

I mam też kilka pytań.

  1. jak rozwiązać sprawę kodowania, w odbieranych i wysyłanych wiadomościach, bo gdy łączę się np z serwerem IRC to widać dziwne znaczki. W odbieraniu odbieram po jednym bajcie i daje to do StringBuildera a może powinienem do tablicy bajtów, potem przekodować na (no właśnie, na co? bo w wysyłanych to na to, czego wymaga serwer)
  2. może skrobnąć to w konsoli? chyba robienie tego w windowsformsach nie jest najlepszym wyjściem? przez to ciągłe dodawanie do richtextboxu
  3. odbieranie. wyświetlam coś dopiero gdy dostane (char)10 bo wcześniej dodaje do StringBuildera. Czy to jest dobre?
  4. kwestia połączenia: dobrze? wątki - słusznie użyte? czy może poszukać jakiegoś asynccallbacku?

Projekt jest troche roztrzepany i będę go pewnie pisał od nowa, bo ten zacząłem rok temu, ale chciałbym już wiedzieć jak się do tego zabrać na poważnie.

Z góry dziękuje za odpowiedzi

1

Witaj.

Ad 1) Nie dodawaj po bajcie. Zbierz wiadomość do kupy (tj. całą linię) i dopiero jako całość przetwarzaj na string. Masz do tego klasę Encoding i dla odpowiedniego kodowania masz metodę GetString(). Skąd masz wiedzieć co to za kodowanie? Możesz zaufać użytkownikowi, który to ustawi, lub szukać informacji od serwera jakie akceptuje kodowanie (skoro akceptuje to istnieje szansa, że takie też dostaniesz). Istnieje jeszcze możliwość analizowania string'a pod względem użytego kodowania (co w 100% nie daje dobrych wyników)

Ad 2) Winforms'y czy WPF czy konsola - rób tak jak dla Ciebie jest lepiej i jaką masz "wizję". Jeżeli korzystając z danego rozwiązania uczysz się czegoś nowego to dobrze. Ogólnie każda metoda prezentacji informacji będzie miała swoje plusy i minusy. Dodam, że winforms'y są rozsądnym wyborem acz już delikatnie przestarzałym. Windows Presentation Foundation (WPF) lepiej rokuje.

Ad 3) Wiadomości IRC'a z tego co pamiętam powinno się przetwarzać jako całość czyli do znak(ów) końca linii (i ew. przejścia do nowej linii) więc jest ok. Co do odbierania po bajcie - słabe rozwiązanie: stosuj bufor stałej długości raz, a dobrze zadeklarowany i na nim przetwarzaj dane. W ten sposób odciążysz Garbage Collector i przyśpieszysz pracę kodu.

Ad 4) Asynchroniczne Socket'y (przynajmniej dla mnie) to ból w d. Mają niewątpliwe zalety, ale wadą jest dość toporna obsługa. Jeżeli masz samozaparcie do nauki to ucz się - na pewno wiedza ta nie zmarnuje się. Wątków nie oceniam - pobieżnie tylko obejrzałem kod. Jeżeli działa, nie ma deadlock'ów, nie tworzysz 100 wątków różnych to raczej jest ok.

Pozdrawiam.

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