001 /*
002 * Networked Wire, Server Side
003 *
004 * $Id: ServerWire.java,v 1.2 2003/10/28 21:41:15 gus Exp $
005 *
006 * Developed for "Rethinking CS101", a project of Lynn Andrea Stein's AP Group.
007 * For more information, see <a href="http://www.ai.mit.edu/projects/cs101/">the
008 * CS101 homepage</a> or email <las@ai.mit.edu>.
009 *
010 * Copyright (C) 1996 Massachusetts Institute of Technology.
011 * Please do not redistribute without obtaining permission.
012 */
013 package cs101.net;
014
015 import cs101.awt.ServerDialog;
016 import java.io.*;
017 import java.net.*;
018
019 /**
020 * Networked Wire, Server Side. Provides readObject, writeObject.
021 * <p>
022 *
023 * If server's port is not provided at creation time, the user
024 * is prompted for this information using ServerDialog.
025 * <p>
026 * Copyright 1996 Massachusetts Institute of Technology
027 *
028 * @see cs101.net.Wire
029 * @see cs101.net.ClientWire
030 *
031 * @author Todd C. Parnell, tparnell@ai.mit.edu
032 * @author Maciej Stachowiak, maciej@ai.mit.edu
033 * @author Lynn Andrea Stein, las@ai.mit.edu
034 * @version $Id: ServerWire.java,v 1.2 2003/10/28 21:41:15 gus Exp $
035 *
036 */
037
038 public class ServerWire implements Wire {
039
040 /**
041 * The network connection. Contains all of the relevant connect
042 * info, if we need it
043 */
044 private Socket sock;
045 /** Where to read from */
046 private ObjectInputStream in;
047 /** Where to write to */
048 private ObjectOutputStream out;
049 /** Spew to System.out? */
050 private boolean verbose;
051
052 /**
053 * How to make one, if we know the port. Control verbosity.
054 *
055 * @param port the port number to listen on
056 * @param verbose toggle verbosity
057 */
058 public ServerWire( int port, boolean verbose ) {
059 this.verbose = verbose;
060 this.connectTo( port );
061 }
062
063
064 /**
065 * How to make one, if we know the port. Verbose mode.
066 *
067 * @param port the port number to listen on
068 */
069 public ServerWire( int port ) {
070 this(port, true);
071 }
072
073 /**
074 * How to make one, if we don't know who we want to talk to.
075 * Uses ServerDialog to ask user. Verbose mode.
076 */
077 public ServerWire() {
078 this.verbose = true;
079 ServerDialog qd = new ServerDialog();
080 qd.ask();
081 this.connectTo( qd.getPort() );
082 }
083
084 /**
085 * Opens a connection to a server presumed to be listening on hostName,
086 * port. Sets up listener thread. Called by constructor; should not be
087 * called otherwise.
088 *
089 * @param port the port number on which the server is listening
090 */
091 protected void connectTo( int port ) {
092 if (this.verbose) System.out.println("Server: listening on port " + port);
093 try {
094 ServerSocket srv = new ServerSocket( port );
095 this.sock = srv.accept();
096 this.in = new ObjectInputStream( this.sock.getInputStream() );
097 this.out = new ObjectOutputStream( this.sock.getOutputStream() );
098 } catch (IOException e) {
099 throw new RuntimeException("Server: " +
100 "can't establish communication on port " + port );
101 }
102 }
103
104 /**
105 * Use this to read an Object from the Wire.
106 *
107 * @return the Object read.
108 */
109 public Object readObject() {
110 try {
111 return this.in.readObject();
112 }
113 catch (Exception e) {
114 throw new RuntimeException("ServerWire: failed to read.");
115 }
116 }
117
118 /**
119 * Use this method to write an Object to the Wire.
120 *
121 * @param o The object to be written.
122 */
123 public void writeObject( Object o ) {
124 try {
125 this.out.writeUnshared( o );
126 } catch (IOException e) {
127 throw new RuntimeException("ServerWire: failed to write.");
128 }
129 }
130
131 /**
132 * Closes the Socket.
133 */
134
135 public void finalize() {
136 try {
137 this.in.close();
138 this.out.close();
139 this.sock.close();
140 } catch (IOException e) {}
141 }
142 }
143
144
145 /* Comments:
146 *
147 * History:
148 * $Log: ServerWire.java,v $
149 * Revision 1.2 2003/10/28 21:41:15 gus
150 * use writeUnshared not writeObject to avoid confusing communication problems
151 *
152 * Revision 1.1.1.1 2002/06/05 21:56:32 root
153 * CS101 comes to Olin finally.
154 *
155 * Revision 1.8 1999/02/17 17:36:47 tparnell
156 * added verbosity option
157 *
158 * Revision 1.7 1999/01/20 22:28:05 tparnell
159 * left in a println. oops
160 *
161 * Revision 1.6 1999/01/20 22:24:55 tparnell
162 * Modified ordering on creation of input/outputStreams
163 *
164 * Revision 1.5 1998/10/16 19:46:04 tparnell
165 * Fixed javadoc returns to return
166 *
167 * Revision 1.4 1998/07/24 17:13:46 tparnell
168 * Placate new javadoc behavior
169 *
170 * Revision 1.3 1998/07/23 14:58:15 tparnell
171 * javadoc fix
172 *
173 * Revision 1.2 1998/07/22 18:18:08 tparnell
174 * move from util to net
175 *
176 * Revision 1.1 1998/06/24 16:32:20 tparnell
177 * changes after summer98. added a multi-user Group server and some
178 * other misc files
179 *
180 *
181 */
182
183