// This method is called when a request has been made to close a client connection public synchronized void disconnectClient(ClientConnection clientConnection) { // Ensures this connection exists (a necessary check when this is being called from outside of a // clientConnection) if (clientConnection != null && clientConnection.isConnected() && clientSocketList.get(clientSocketList.indexOf(clientConnection)) != null) { // Send the client a message telling it to close its socket clientConnection.xmitMessage(ClientConnection.QUIT); // Then close that socket...the user really doesn't have a choice. We're just asking to be // nice. clientSocketList.get(clientSocketList.indexOf(clientConnection)).closeSocket(); parent.updateStatusBox( clientSocketList.indexOf(clientConnection) + " " + "Forcing disconnection of client " + clientConnection.id + " on port " + port + "..."); } else { // If this thread is NOT connected, it may be stuck, so let's send an interrupt to wake it up clientThreadList.get(clientSocketList.indexOf(clientConnection)).interrupt(); parent.updateStatusBox("Closing listen socket on port " + port + "..."); } }
// THIS IS WHERE THE MAGIC HAPPENS -- on the server side at least // This method sends some given message to ALL connected clients by creating an iterator from // clientSocketList // and executing the xmitMessage method for each element in that iterator public synchronized void broadcastMsg(String message) { Iterator<ClientConnection> clientIterator = clientSocketList.iterator(); ClientConnection clientConnection; while (clientIterator.hasNext()) { clientConnection = clientIterator.next(); clientConnection.xmitMessage(message); } }
// This method is called as a part of the client handshake -- the client makes a request to join // the server // and this method runs to check for information that should be sent back before they're // ready to operate // NOTE: In the original chat server implementation, this also sent the client information about // the connected // users and that kind of thing -- a handshake method like this is helpful when you want to // provide some // kind of immediate functionality to users who connect in the middle of something already in // progress // (like a vote or chat already in progress) public synchronized void clientJoined(ClientConnection clientConnection) { // If voting is already in progress, send the user the question list and allow them to start // voting if (voting) { clientConnection.xmitMessage("/numq" + numQuestions); for (int x = 0; x <= (numQuestions - 1); x++) { clientConnection.xmitMessage("/ques" + String.valueOf(x) + questions[x]); } clientConnection.xmitMessage("/stvt"); } else { // As a part of the handshake, the client is expecting some form of reply. This is // placeholder for // something actually useful clientConnection.xmitMessage("You're connected!"); } }