/* * Constructor used by servers. */ public SocketClientConnection( SocketServer parentServer, SocketPipe clientPipe, ThreadGroup threadGroup) throws CommunicationException { super(threadGroup, clientPipe.toString()); this.clientPipe = clientPipe; this.parentServer = parentServer; serverConnection = true; connectedToServer = false; // Find out who we're connected to, only if we are a server. // Because, if we are a client, we must be connected to a server. ConnectMessage connectMsg = (ConnectMessage) clientPipe.read(); if (connectMsg.getSourceType() == HostType.CLIENT) { clientDestination = connectMsg.getSourceDestination(); notifyConnectionListeners(clientDestination); } else if (connectMsg.getSourceType() == HostType.SERVER) { connectedToServer = true; } else { throw new CommunicationException( "Incorrected HostType transmitted through the wire:" + connectMsg.getSourceType() + ". Communication Layer exception."); } // reply to the connect request with broker ID clientPipe.write(new ConnectReplyMessage(parentServer.getServerURI())); }
/** * The main thread execution method. Performs part of the connection protocol, and then loops, * listening for messages. */ public void run() { try { SocketMessage socketMsg; // Receive until client closes connection, indicated by -1 return while ((socketMsg = clientPipe.read()) != null && !this.isInterrupted()) { /* * If the received message is a string, it must be the messageID of a message that * was just sent. If we are on the client side, inform the senderCallback * MessageSender of the new messageID. * * This will only ever occur when we are a client. */ if (socketMsg.getMessageType() == SocketMessageType.PUB_SUB_REPLY) { senderCallBack.messageIDReceived(((PubSubReplyMessage) socketMsg).getMessageID()); continue; } /* * Otherwise, we have received a Message. Handle it appropriately. */ // Receive subsequent messages, after the initial ID String if (socketMsg.getMessageType() == SocketMessageType.PUB_SUB) { PubSubMessage pubSubSocketMsg = (PubSubMessage) socketMsg; Message pubSubMsg = pubSubSocketMsg.getMessage(); notifyMessageListeners(pubSubMsg, pubSubSocketMsg.getHostType()); // Send back the messageID if we are a server and connected to a client if (serverConnection && !connectedToServer && !(pubSubMsg instanceof PublicationMessage)) { clientPipe.write(new PubSubReplyMessage(pubSubMsg.getMessageID())); } pubSubSocketMsg.setTimeofReceiving(System.currentTimeMillis()); System.out.println( "number of clients = " + ++counter + " and totalTime is " + pubSubSocketMsg.getTotalTime() + " time of sending : " + pubSubSocketMsg.getTimeOfSending() + " time of receiving :" + pubSubSocketMsg.getTimeOfReceiving()); System.out.println("======================================================"); } } // Close the socket. We are done with this client! clientPipe.close(); } catch (CommunicationException e) { if (clientDestination != null) { disconnect(clientDestination); } } }