Source of SocketMessageManager.java


  1: // Fig. 24.25: SocketMessageManager.java
  2: // SocketMessageManager communicates with a DeitelMessengerServer using 
  3: // Sockets and MulticastSockets.
  4: package com.deitel.messenger.sockets.client;

  6: import java.net.InetAddress;
  7: import java.net.Socket;
  8: import java.io.IOException;
  9: import java.util.concurrent.Executors;
 10: import java.util.concurrent.ExecutorService;
 11: import java.util.concurrent.ExecutionException;
 12: import java.util.concurrent.Future;

 14: import com.deitel.messenger.MessageListener;
 15: import com.deitel.messenger.MessageManager;
 16: import static com.deitel.messenger.sockets.SocketMessengerConstants.*;

 18: public class SocketMessageManager implements MessageManager
 19: {
 20:    private Socket clientSocket; // Socket for outgoing messages
 21:    private String serverAddress; // DeitelMessengerServer address
 22:    private PacketReceiver receiver; // receives multicast messages
 23:    private boolean connected = false; // connection status
 24:    private ExecutorService serverExecutor; // executor for server
 25:    
 26:    public SocketMessageManager( String address )
 27:    {
 28:       serverAddress = address; // store server address
 29:       serverExecutor = Executors.newCachedThreadPool();
 30:    } // end SocketMessageManager constructor
 31:    
 32:    // connect to server and send messages to given MessageListener
 33:    public void connect( MessageListener listener ) 
 34:    {
 35:       if ( connected )
 36:          return; // if already connected, return immediately

 38:       try // open Socket connection to DeitelMessengerServer
 39:       {
 40:          clientSocket = new Socket( 
 41:             InetAddress.getByName( serverAddress ), SERVER_PORT );

 43:          // create runnable for receiving incoming messages
 44:          receiver = new PacketReceiver( listener );
 45:          serverExecutor.execute( receiver ); // execute runnable
 46:          connected = true; // update connected flag
 47:       } // end try
 48:       catch ( IOException ioException ) 
 49:       {
 50:          ioException.printStackTrace();
 51:       } // end catch
 52:    } // end method connect
 53:    
 54:    // disconnect from server and unregister given MessageListener
 55:    public void disconnect( MessageListener listener ) 
 56:    {
 57:       if ( !connected )
 58:          return; // if not connected, return immediately
 59:       
 60:       try // stop listener and disconnect from server
 61:       {     
 62:          // notify server that client is disconnecting
 63:          Runnable disconnecter = new MessageSender( clientSocket, "", 
 64:             DISCONNECT_STRING );         
 65:          Future disconnecting = serverExecutor.submit( disconnecter );         
 66:          disconnecting.get(); // wait for disconnect message to be sent
 67:          receiver.stopListening(); // stop receiver
 68:          clientSocket.close(); // close outgoing Socket
 69:       } // end try
 70:       catch ( ExecutionException exception ) 
 71:       {
 72:          exception.printStackTrace();
 73:       } // end catch
 74:       catch ( InterruptedException exception ) 
 75:       {
 76:          exception.printStackTrace();
 77:       } // end catch
 78:       catch ( IOException ioException ) 
 79:       {
 80:          ioException.printStackTrace();
 81:       } // end catch
 82:      
 83:       connected = false; // update connected flag
 84:    } // end method disconnect
 85:    
 86:    // send message to server
 87:    public void sendMessage( String from, String message ) 
 88:    {
 89:       if ( !connected )
 90:          return; // if not connected, return immediately
 91:       
 92:       // create and start new MessageSender to deliver message
 93:       serverExecutor.execute( 
 94:          new MessageSender( clientSocket, from, message) );
 95:    } // end method sendMessage
 96: } // end method SocketMessageManager


 99: /**************************************************************************
100:  * (C) Copyright 1992-2005 by Deitel & Associates, Inc. and               *
101:  * Pearson Education, Inc. All Rights Reserved.                           *
102:  *                                                                        *
103:  * DISCLAIMER: The authors and publisher of this book have used their     *
104:  * best efforts in preparing the book. These efforts include the          *
105:  * development, research, and testing of the theories and programs        *
106:  * to determine their effectiveness. The authors and publisher make       *
107:  * no warranty of any kind, expressed or implied, with regard to these    *
108:  * programs or to the documentation contained in these books. The authors *
109:  * and publisher shall not be liable in any event for incidental or       *
110:  * consequential damages in connection with, or arising out of, the       *
111:  * furnishing, performance, or use of these programs.                     *
112:  *************************************************************************/