001 /*
002 * cs101.net.BabySitter.java
003 * $Id: BabySitter.java,v 1.2 2003/09/23 15:18:08 gus Exp $
004 *
005 * Developed for "Rethinking CS101", a project of Lynn Andrea Stein's AP Group.
006 * For more information, see <a href="http://www.ai.mit.edu/projects/cs101/">the
007 * CS101 homepage</a> or email <las@ai.mit.edu>.
008 *
009 * Copyright (C) 1998 Massachusetts Institute of Technology.
010 * Please do not redistribute without obtaining permission.
011 */
012
013 package cs101.net;
014
015 import java.io.*;
016 import java.net.*;
017
018 /**
019 * This object handles the io between the server and one client.
020 * It has a run method that listens for information and relays it to
021 * the server. It also has a method to send information back to its client.
022 *
023 * <P>Copyright 1998 Massachusetts Institute of Technology
024 *
025 * @author Todd C. Panrell, tparnell@ai.mit.edu
026 * @version $Id: BabySitter.java,v 1.2 2003/09/23 15:18:08 gus Exp $
027 *
028 */
029 public class BabySitter implements Runnable {
030
031 /** Server this client is connected to */
032 protected Server server;
033 /** Animacy that runs this object */
034 protected Thread spirit;
035
036 /** Client connection */
037 protected Socket sock;
038 /** Where to read from client */
039 protected ObjectInputStream ois;
040 /** Where to write to client */
041 protected ObjectOutputStream oos;
042
043 /** Flag to indicate whether the Thread animating this should stop */
044 private boolean stopped;
045
046 /**
047 * Creates a BabySitter to handle communication with a
048 * client. Spawns a new thread to handle input from client;
049 * sends strings on request.
050 *
051 * @param sock the client socket of this threads client
052 * @param server The <code>Server</code> object for this BabySitter
053 *
054 * @see #send
055 * @see Server#sendToAllExcept
056 */
057 protected BabySitter(Socket sock, Server server) {
058 System.out.println( "Server: setting up new connection from " +
059 sock.getInetAddress().getHostName() +
060 " on port " + sock.getPort() );
061 this.sock = sock;
062 this.server = server;
063 try {
064 // it is very, very important to create the Output before Input
065 this.oos = new ObjectOutputStream(sock.getOutputStream());
066 this.ois = new ObjectInputStream(sock.getInputStream());
067 } catch (IOException e) {
068 try { this.sock.close(); } catch ( IOException e2 ) {}
069 System.out.println("Server: socket error in BabySitter");
070 this.server.removeBabySitter(this);
071 return;
072 }
073 this.spirit = new Thread( this );
074 this.spirit.start();
075 }
076
077 /**
078 * Sends a String to the client.
079 *
080 * @param s the String to send
081 */
082 protected void send(String s) {
083 try {
084 // System.out.println("Server: sending "+s);
085 this.oos.writeObject(s);
086 // System.out.println("Server: successfully sent "+s);
087 } catch (IOException e) {
088 System.out.println("Server: socket error in send");
089 this.server.removeBabySitter(this);
090 }
091 }
092
093 /**
094 * Recieves new info from clients.
095 *
096 * @see Server#sendToAllExcept
097 */
098 public void run() {
099 System.out.println("Server: BabySitter running");
100 while( !this.stopped )
101 {
102 try {
103 String s = (String)ois.readObject();
104 System.out.println( "Server: just read '" + s +"' from " +
105 this.sock.getInetAddress().getHostName() +
106 ", port " + this.sock.getPort() );
107
108 if( s == null || s == "" ) {
109 this.server.removeBabySitter(this);
110 return;
111 }
112 this.server.sendToAllExcept(s,this);
113
114 } catch (IOException e) {
115 System.out.println("Server: socket error in run ");
116 this.server.removeBabySitter(this);
117 } catch (ClassNotFoundException cnfe) {
118 System.out.println("Server: could not find class String.");
119 this.server.removeBabySitter(this);
120 }
121
122 }
123 }
124
125 /**
126 * Should only be called by Server.
127 * User server.removeBabySittter( BabySitter ) instead.
128 *
129 * @see Server#removeBabySitter
130 */
131 protected void stop() {
132 System.out.println( "Server: closing connection from " +
133 this.sock.getInetAddress().getHostName() +
134 " on port " + this.sock.getPort() );
135 try {
136 this.ois.close();
137 } catch (IOException e) {}
138
139 try {
140 this.oos.close();
141 } catch (IOException e) {}
142
143 try {
144 this.sock.close();
145 } catch (IOException e) {}
146
147 this.stopped = true;
148 }
149 }
150
151 /*
152 * $Log: BabySitter.java,v $
153 * Revision 1.2 2003/09/23 15:18:08 gus
154 * javadoc fix
155 *
156 * Revision 1.1.1.1 2002/06/05 21:56:32 root
157 * CS101 comes to Olin finally.
158 *
159 * Revision 1.7 1998/07/24 17:13:36 tparnell
160 * Placate new javadoc behavior
161 *
162 * Revision 1.6 1998/07/22 15:42:22 tparnell
163 * moved to cs101.net
164 *
165 * Revision 1.5 1998/07/20 21:35:50 tparnell
166 * Moved from Data*Stream to Object*Stream.
167 *
168 * Revision 1.4 1998/07/08 16:11:49 tparnell
169 * update to JDK1.2: removed refrences to Thread.stop() since it has been
170 * deprecated in 1.2
171 *
172 * Revision 1.3 1998/06/24 21:24:27 tparnell
173 * added logging to file
174 *
175 */