public class SocketMessageManager implements MessageManager
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: *************************************************************************/