Socket'y stream'y i thread'y

0

Witam,
chce teraz napisać aplikacje odbierającą wiele połączeń na jednym porcie.
Problem jest przy przesyłaniu wiadomości między maszynami, bo pomimo realnego połączenia nigdy nie moge otworzyć streamów w sockecie żeby coś wysłać... zawsze są zamknięte.. Jak to rozwiazac?

Dodatkowo wszystkie jakieś poradniki/tutoriale o socketach i wielu klientach implementują to tak, że zawsze przydzielają nowy wątek do socketa. Ja mam zgrupowane wszystkie polaczenia nawiązane w jednym procesie i nie wiem czy to moze przeszkadzac, czy jestem zmuszony z jakiegoś powodu rozpasać wątki?

Tak więc pytania są dwa.

przykladowa funkcja:

public static void sendMessage(String msg){
    OutputStream out = null;
    try {
        if (msg == null) {
            return;
        }
        out = connection.getOutputStream();
        out.write(msg.getBytes());
    } catch (IOException ex) {
        Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        try {
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}
0

.:bump:.

nikt sie nie spotkal z takim problemem?

0

Do wysyłania nie potrzebujesz odzielnych wątków...
I nie wiem czemu masz zamknięte strumienie na wstępie... za mało info.

0

Może ja ci pomogę, znam się nieco na gniazdkach :)

  1. Tak jak kolega Keraj zauważył, żadne dane ci nie przejdą jeśli w bloku finally używasz instrukcji zamykającej strumień. W tym przypadku finally możesz sobie raczej odpuścić jeśli nie zamierzasz zamieszczać w nim warunków zamknięcia strumienia. Blok finally wykona się zawsze jeśli tylko będzie wykonany blok try

  2. Możesz stworzyć serwer obsługujący dokładnie jednego klienta lub wielu.
    W tym drugim przypadku (jeden do wielu) musisz posłużyć się wątkami.

Aplikacja może wyglądać tak:

  1. start serwera (otwierasz serwerowy socket)
  2. oczekuj na połączenie (możesz to zrobić w pętli lub w wątku - polecam wątek)
  3. Nadeszło połączenie:
    • a. utwórz nowy wątek sesji przekazując mu socket.
    • b. dodaj nowo utworzony wątek do listy.
  4. Zadaniem wątku sesji jest stałe oczekiwanie na strumień danych
    (wątek zawsze zatrzyma się na instrukcji dane = in.read(); przechodząc do stanu I/O - nie zabiera wtedy czasu procesora)
    • a. jeśli dane nadejdą, wątek zacznie wykonywać kolejne instrukcje typu:
    • a. -a iteruj listę wątków sesyjnych
    • a. -a - a. wyciągasz taki obiekt wątku z listy i uruchamiasz w nim funkcję wysyłającą. (Oczywiście co najważniejsze każdy obiekt musi mieć zwoje strumienie na których operuje )

Podsumowując. Każde połączenie operuje na własnym gniazdku i na utworzonych na jego rzecz strumieniach in oraz out. Z tego wynika że musisz obsługiwać je równolegle. Oczywiście sposobów implementacji jest dużo, możesz zastosować dziedziczenie itp.
Potrzebujesz jednego wątku który będzie przyjmował połączenia, oraz wielu wątków, z których każdy odpowiedzialny jest za własną sesję - a właściwie nasłuchiwanie. Wysyłanie nie musi być wątkiem, mała funkcyjka która wywoływana jest na żądanie.

oczywiście wątki działają w pętli

do{ ... } while(!isEnd)

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