3.6 Implement the same electronic chatroom application that you did for exercise
3.5 above, but this time using Java's non-blocking I/O on the server. You may
very well be able to make use of your original client program, but have the cli-
ent close its socket only after it has received (and displayed) its own 'Bye'
message sent back from the server. You can also now get rid of the code dealing
with any NoSuchElementException .
At the server end, you will probably fi nd it useful to maintain two Vector s,
the fi rst of these holding references to all SocketChannel s of newly-connected
clients for which no data has been processed and the second holding references
to instances/objects of class ChatUser . Each instance of this class should hold
references to the SocketChannel and chatname (a String ) associated with an
individual chatroom user, with appropriate 'get' methods to retrieve these ref-
erences. As the fi rst message from a given user (the one holding the user's
chatroom nickname) is processed, the user's SocketChannel reference should
be removed from the fi rst Vector and a ChatUser instance created and added to
the second Vector .
It will probably be desirable to have separate methods to deal with the following:
(i) a user's entry into the chatroom;
(ii) a normal message;
(iii) a user's exit from the chatroom (after sending 'Bye').
Signatures for the fi rst and last of these are shown below.
public static void announceNewUser(
public static void announceExit(String name)
The method for processing an ordinary message has been done for you and
is shown below.
public static void broadcastMessage(String chatName,
String messagePrefi x = chatName + ": ";
byte messagePrefi xBytes = messagePrefi x.getBytes();
fi nal byte CR = "\n".getBytes();//Carriage return.
int messageSize = buffer.position();
byte messageBytes = buffer.array();
byte messageBytesCopy = new byte[messageSize];
for (int i=0; i<messageSize; i++)
messageBytesCopy[i] = messageBytes[i];