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.
May 22nd, 2010 at 12:21
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.