001 /* 002 * Networked Wire, Client Side 003 * 004 * $Id: ClientWire.java,v 1.3 2003/11/03 19:00:06 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.ClientDialog; 016 import java.io.*; 017 import java.net.*; 018 019 /** 020 * Networked Wire, Client Side. Provides readObject, writeObject. 021 * 022 * <P>If server's hostName and port are not provided at creation time, 023 * the user is prompted for this information using ClientDialog. 024 * 025 * <P>Copyright 1996 Massachusetts Institute of Technology 026 * 027 * @see cs101.net.Wire 028 * @see cs101.net.ServerWire 029 * 030 * @author Todd C. Parnell, tparnell@ai.mit.edu 031 * @author Maciej Stachowiak, maciej@ai.mit.edu 032 * @author Lynn Andrea Stein, las@ai.mit.edu 033 * @version $Id: ClientWire.java,v 1.3 2003/11/03 19:00:06 gus Exp $ 034 */ 035 036 public class ClientWire implements Wire { 037 038 /** 039 * The network connection. Contains all of the relevant connect 040 * info, if we need it 041 */ 042 private Socket sock; 043 /** Where to read from */ 044 private ObjectInputStream in; 045 /** Where to write to */ 046 private ObjectOutputStream out; 047 /** Who we're connected to */ 048 private String hostname; 049 /** Which port we're connected to */ 050 private int port; 051 /** Operate verbosely */ 052 private boolean verbose; 053 054 /** 055 * How to make one, if we know who we want to talk to. 056 * Specify verboseness. 057 * 058 * @param hostName the name of the machine that the server is on 059 * @param port the port number on which the server is listening 060 * @param verbose specify verboseness level 061 */ 062 public ClientWire( String hostName, int port, boolean verbose ) { 063 this.verbose = verbose; 064 this.connectTo( hostName, port ); 065 } 066 067 /** 068 * How to make one, if we know who we want to talk to. 069 * Verbosness on. 070 * 071 * @param hostName the name of the machine that the server is on 072 * @param port the port number on which the server is listening 073 */ 074 public ClientWire( String hostName, int port ) { 075 this(hostName, port, true); 076 } 077 078 /** 079 * How to make one, if we don't know who we want to talk to. 080 * Uses ClientDialog to ask user. Verboseness on. 081 */ 082 public ClientWire() { 083 this.verbose = true; 084 ClientDialog qd = new ClientDialog(); 085 qd.ask(); 086 this.connectTo( qd.getHostName(), qd.getPort() ); 087 } 088 089 /** 090 * Opens a connection to a server presumed to be listening on hostName, 091 * port. Sets up listener thread. Called by constructor; should not be 092 * called otherwise. 093 * 094 * @param hostName the name of the machine that the server is on 095 * @param port the port number on which the server is listening 096 */ 097 protected void connectTo( String hostName, int port ) { 098 if (this.verbose) 099 System.out.println("Client: trying to connect to " + hostName 100 + " on port " + port ); 101 try { 102 this.hostname = hostName; 103 this.port = port; 104 this.sock = new Socket( hostName, port ); 105 this.out = new ObjectOutputStream( this.sock.getOutputStream() ); 106 this.in = new ObjectInputStream( this.sock.getInputStream() ); 107 } catch (IOException e) { 108 throw new RuntimeException("Client: " + 109 "can't establish communication with " + 110 hostName + " on port " + port ); 111 } 112 } 113 114 /** 115 * Use this to read an Object from the Wire. 116 * 117 * @return the Object read. 118 */ 119 public Object readObject() { 120 try { 121 return this.in.readObject(); 122 } 123 catch (Exception e) { 124 throw new RuntimeException("ClientWire: failed to read from " + 125 hostname + " on " + port); 126 } 127 } 128 129 /** 130 * Use this method to write an Object to the Wire. 131 * 132 * @param o The object to be written. 133 */ 134 public void writeObject( Object o ) { 135 try { 136 this.out.writeUnshared( o ); 137 } catch (IOException e) { 138 throw new RuntimeException("ClientWire: failed to write to " + 139 hostname + " on " + port); 140 } 141 } 142 143 /** 144 * Closes the Socket and Streams. 145 */ 146 public void finalize() { 147 try { 148 this.in.close(); 149 this.out.close(); 150 this.sock.close(); 151 } catch (IOException e) {} 152 } 153 154 } 155 156 157 /* Comments: 158 * 159 * History: 160 * $Log: ClientWire.java,v $ 161 * Revision 1.3 2003/11/03 19:00:06 gus 162 * fix typo 163 * 164 * Revision 1.2 2003/10/28 21:41:15 gus 165 * use writeUnshared not writeObject to avoid confusing communication problems 166 * 167 * Revision 1.1.1.1 2002/06/05 21:56:32 root 168 * CS101 comes to Olin finally. 169 * 170 * Revision 1.7 1999/02/17 20:24:22 tparnell 171 * added verbose option 172 * 173 * Revision 1.6 1999/01/20 22:24:55 tparnell 174 * Modified ordering on creation of input/outputStreams 175 * 176 * Revision 1.5 1998/10/16 19:46:02 tparnell 177 * Fixed javadoc returns to return 178 * 179 * Revision 1.4 1998/07/24 17:13:39 tparnell 180 * Placate new javadoc behavior 181 * 182 * Revision 1.3 1998/07/22 18:17:53 tparnell 183 * move from util to net 184 * 185 * Revision 1.2 1998/06/24 21:28:53 tparnell 186 * code cleanup 187 * 188 * Revision 1.1 1998/06/24 16:32:16 tparnell 189 * changes after summer98. added a multi-user Group server and some 190 * other misc files 191 * 192 * 193 */ 194 195