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 client 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 find it useful to maintain two Vectors, the first of these holding references to all SocketChannels 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 references. As the first message from a given user (the one
holding the user's chatroom nickname) is processed, the user's SocketChannelreference should be removed from the first 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 first and last of these are shown below.
public static void announceNewUser(
SocketChannel userSocketChannel,
ByteBuffer buffer)
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, ByteBuffer buffer) {
String messagePrefix = chatName + “: “; byte[] messagePrefixBytes = messagePrefix.getBytes();
final byte[] CR = “n”.getBytes();//Carriage return. try
{ int messageSize = buffer.position(); 90 An Introduction to Network Programming with Javabyte[] messageBytes = buffer.array();
byte[] messageBytesCopy = new byte[messageSize]; for (int i=0; i
buffer.clear(); //Concatenate message text onto message prefix…buffer.put(messagePrefixBytes);
for (int i=0; i
{ buffer.put(messageBytesCopy[i]); } buffer.put(CR);
SocketChannel chatSocketChannel; for (ChatUser chatUser:allUsers)
{ chatSocketChannel =
chatUser.getSocketChannel(); buffer.flip();
//Write full message (with user's name)… chatSocketChannel.write(buffer); } } catch (IOException ioEx) { ioEx.printStackTrace(); } }
Delivering a high-quality product at a reasonable price is not enough anymore.
That’s why we have developed 5 beneficial guarantees that will make your experience with our service enjoyable, easy, and safe.
You have to be 100% sure of the quality of your product to give a money-back guarantee. This describes us perfectly. Make sure that this guarantee is totally transparent.
Read moreEach paper is composed from scratch, according to your instructions. It is then checked by our plagiarism-detection software. There is no gap where plagiarism could squeeze in.
Read moreThanks to our free revisions, there is no way for you to be unsatisfied. We will work on your paper until you are completely happy with the result.
Read moreYour email is safe, as we store it according to international data protection rules. Your bank details are secure, as we use only reliable payment systems.
Read moreBy sending us your money, you buy the service we provide. Check out our terms and conditions if you prefer business talks to be laid out in official language.
Read more