[ RMAN @ 14.05.2010. 00:00 ] @
Imam jedan program koji super radi samo meni nije bas najjasnije kako.

Problem je sledeci:

Server prima podatke od klijenta i pokrece novu nit za opsluzivanje tog klijenta. I sada ta nit prima podatke od tog odredjenog klijenta i obradjuje ih.

Meni sad nije jasno kako Server zna kad da pokrene novu nit? Odnosno, pokrene je kada ja run-ujem klijenta. Ako ja dobro kontam kada preko accept primi podatak tada kreira novu nit.
E sad, klijent posalje podatak serveru i zasto se sad ne kreira nit vec se podatak salje u vec kreiranu nit, odnosno server uopste ne reaguje na poslat podatak. A nit i server osluskuju isti port. I kada kreiram jos 5 klijenata kreirace se jos 5 niti?

Moje pitanje je kako server zna kad treba da kreira nit a kad ne?
[ RMAN @ 14.05.2010. 00:18 ] @
Sad sam nesto citao o accept metodi.
Ako sam dobro razumeo accept prima podatak samo kada se kreira novi objekat klase Socket odnosno kada se uspostavi konekcija?

Znaci posle ove linije koda se aktivira accept na serveru?
Code (java):
Socket sock = new Socket(address, TCP_PORT);


Da li sam u pravu?
[ bantu @ 14.05.2010. 07:24 ] @
Za razliku od nekih drugih protokola TCP/IP je sinhroni nacin komunikacije i svaki paket je vezan za jednu sesiji ili konekciju kako hoces. Procitaj malo o tome. Metoda accept ceka prvi paket konekcije mislim da on nosi flag syn i odgovara sa syn-ack, nakon cega klijent odgovara sa ack i onda je konekcija uspostavljena, to je neki 3-way handshakeing. (nisam više siguran, ne zamjerite ako griješim) Prvi paket sadrzi inicijali sequence no.
Nakon "rukovanja" on kreira socket i nastavlja se izvrsavanje programa a ti onda kreiras novu nit koja obradjuje ono sto dolazi na taj socket.
Mozda sam malo konfuzno i ne do u detalje tacno objasnio, ali mislim da ce ti pomoci da shvatis kako radi TCP protokol a onda i implementacija istog u javi.
[ karas @ 14.05.2010. 13:50 ] @
Evo jednog prostog eho servera koji cim prihvati klijenta (sa accept()) kreira novu nit u kojoj se odvija komunikacija sa tim klijentom. Dakle, slanje i primanje podataka su nezavisni od prihvatanja klijenta, a to moze da se radi u posebnoj niti za svakog klijenta.
Code:

/*

ServerThreaded.java
-------------------

Multithreaded server listens custom port and echoes requests.

Compile with
    javac ServerThreaded.java

*/


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.Executors;


// main class accepts clients and gives them to a thread
class ServerThreaded
{
    public static void main(String args[])
    {
        java.util.concurrent.Executor threadPool = Executors.newFixedThreadPool(3);
        
        try
        {
            ServerSocket server = new ServerSocket(9000);
            if (server.isBound())
            {
                System.out.println("main():listening...");
                while (true)
                {
                    Socket client = server.accept();
                    threadPool.execute(new Run(client));
                }
            }
        }
        catch (IOException e)
        {
            System.out.println("ServerThreaded.main():e=" + e);
        }
    }
}


// talks with a single client
class Run implements Runnable
{
    public Run(Socket client)
    {
        this.client = client;
    }
    
    public void run()
    {
        try
        {
            System.out.println("this.client.getRemoteSocketAddress()=" + this.client.getRemoteSocketAddress());

            // read client request
            byte request[] = new byte[100];
            this.client.getInputStream().read(request, 0, 100);
            System.out.println("Run.run():request=" + new String(request));

            // send response same as request
            System.out.println("Run.run():this.client.isClosed()=" + this.client.isClosed() + ",this.client.isConnected()=" + this.client.isConnected());
            this.client.getOutputStream().write(request);

            this.client.close();
        }
        catch (IOException e)
        {
            System.out.println("Run.run():e=" + e);
        }
    }
    
    private Socket client;
}

Valjda ce ti razresiti neke nedoumice...