Non-blocking connections i Java
Tuesday, April 27th, 2010Jeg 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.