Non-blocking connections i Java

Jeg sidder lidt her og arbejder på en multitrådet chat-server der basalt minder lidt om IRC-protokollen. Da IRC i sit design mere bygger på stabilitet, og ikke så meget på hastighed, kan jeg ikke bare kopiere en typisk IRC-servers design.

Min første approach på at lave en multitrådet server gik med at bruge java.net.Socket, men der stødte jeg hurtigt på lidt problemer. På server-siden samler jeg alle mine klienter i forskellige rum, og broadcaster beskeder fra andre klienter til klienter i samme rum. java.net.Socket er en blocking-connection, dette kan nemt forklares ved følgende eksempel: (OBS! Pseudocode, skal du have det til at virke skal du bruge Outputstream på din socket)

class Room
{
    ArrayList clients = new ArrayList();
    public void broadCastToAll(String msg)
    {
        foreach(Socket s : clients)
        {
            s.out.write(msg);
        }
    }
}

Denne kode er lidt dum i et multi-trådet miljø, men det jeg vil fokusere på er s.out.write(), denne metode terminerer ikke før beskeden er sendt til klienten.

Det betyder at en langsom klient kan blokere for beskeder til de næste klienter i listen, derfor kaldes det blocking I/O. For at komme udenom dette bliver man nødt til at benytte java.nio.* hvilket virker nogenlunde ens, bare uden at blokere.

Tags: , , , , ,

One Response to “Non-blocking connections i Java”

  1. Winarski Says:

    Thank you for taking the time to talk about  this, I feel  fervently  about it and I enjoy learning about this topic.  Please, as you gain data, please add to  this blog with more information.  I have found it extremely useful.

Leave a Reply