18. august 2003 - 15:55Der er
2 kommentarer og 1 løsning
NIO: SelectionKey.interestOps(int) blokkerer i minutter
Jeg har lavet en multiplayer-server, der håndtere en hel del klienter på samme tid. Indtil fornyelig kørte jeg kun serveren på Linux, men blev nødt til at hoste på Windows 2K Server - et underligt og kritisk problem dukkede op.
java.nio anvendes til håndtering af klient-kommunikationen. Serveren har én Selector og når en SelectionKey er klar til skrive eller læse tager Selector'en en Worker fra en pool og overrækker den aktuelle SelectionKey, hvorefter worker'en tager sig af læsningen eller skrivningen.
Når serveren sender data til en klient køres denne metode (Client.sendMessage):
public void sendMessage(Message m) throws CancelledKeyException { sendQueue.add(m); if (connected && key.isValid()) { key.interestOps(key.interestOps() | SelectionKey.OP_WRITE); key.selector().wakeup(); } }
Næhhh NIO er en ny ting, men mange fejl er blevet rettet også i den seneste JVM 1.4.2. I øvrigt er der mange tråde i Sun's forum der ligger til grund for at folk ikke ved nok om NIO. Jeg har haft rigtig mange problemer, men de er alle blevet løst henad vejen som jeg har arbejdet med tingene.
Jeg er nået til et punkt hvor min NIO-server fungerer perfekt og har en kanon performance under Linux, men under Windows er der som sagt problemer.
Hvis man kun vil køre Linux er NIO klart at foretrække!
Løsningen bliver nok under Windows at sende data gennem en output-stream. Så skal nævnte problem-metode ikke kaldes og der blokkeres ikke. Det vigtigste er at der kan læses fra klienterne ved brug af en Selector, så vi kan have en dynamisk worker-pool og dermed en skalérbar server :)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.