001 /* 002 * Copyright 2001-2005 The Apache Software Foundation 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package examples; 017 018 import java.io.File; 019 import java.io.FileInputStream; 020 import java.io.FileOutputStream; 021 import java.io.IOException; 022 import java.net.SocketException; 023 import java.net.UnknownHostException; 024 import org.apache.commons.net.tftp.TFTP; 025 import org.apache.commons.net.tftp.TFTPClient; 026 027 /*** 028 * This is an example of a simple Java tftp client using NetComponents. 029 * Notice how all of the code is really just argument processing and 030 * error handling. 031 * <p> 032 * Usage: tftp [options] hostname localfile remotefile 033 * hostname - The name of the remote host 034 * localfile - The name of the local file to send or the name to use for 035 * the received file 036 * remotefile - The name of the remote file to receive or the name for 037 * the remote server to use to name the local file being sent. 038 * options: (The default is to assume -r -b) 039 * -s Send a local file 040 * -r Receive a remote file 041 * -a Use ASCII transfer mode 042 * -b Use binary transfer mode 043 * <p> 044 ***/ 045 public final class tftp 046 { 047 static final String USAGE = 048 "Usage: tftp [options] hostname localfile remotefile\n\n" + 049 "hostname - The name of the remote host\n" + 050 "localfile - The name of the local file to send or the name to use for\n" + 051 "\tthe received file\n" + 052 "remotefile - The name of the remote file to receive or the name for\n" + 053 "\tthe remote server to use to name the local file being sent.\n\n" + 054 "options: (The default is to assume -r -b)\n" + 055 "\t-s Send a local file\n" + 056 "\t-r Receive a remote file\n" + 057 "\t-a Use ASCII transfer mode\n" + 058 "\t-b Use binary transfer mode\n"; 059 060 public final static void main(String[] args) 061 { 062 boolean receiveFile = true, closed; 063 int transferMode = TFTP.BINARY_MODE, argc; 064 String arg, hostname, localFilename, remoteFilename; 065 TFTPClient tftp; 066 067 // Parse options 068 for (argc = 0; argc < args.length; argc++) 069 { 070 arg = args[argc]; 071 if (arg.startsWith("-")) 072 { 073 if (arg.equals("-r")) 074 receiveFile = true; 075 else if (arg.equals("-s")) 076 receiveFile = false; 077 else if (arg.equals("-a")) 078 transferMode = TFTP.ASCII_MODE; 079 else if (arg.equals("-b")) 080 transferMode = TFTP.BINARY_MODE; 081 else 082 { 083 System.err.println("Error: unrecognized option."); 084 System.err.print(USAGE); 085 System.exit(1); 086 } 087 } 088 else 089 break; 090 } 091 092 // Make sure there are enough arguments 093 if (args.length - argc != 3) 094 { 095 System.err.println("Error: invalid number of arguments."); 096 System.err.print(USAGE); 097 System.exit(1); 098 } 099 100 // Get host and file arguments 101 hostname = args[argc]; 102 localFilename = args[argc + 1]; 103 remoteFilename = args[argc + 2]; 104 105 // Create our TFTP instance to handle the file transfer. 106 tftp = new TFTPClient(); 107 108 // We want to timeout if a response takes longer than 60 seconds 109 tftp.setDefaultTimeout(60000); 110 111 // Open local socket 112 try 113 { 114 tftp.open(); 115 } 116 catch (SocketException e) 117 { 118 System.err.println("Error: could not open local UDP socket."); 119 System.err.println(e.getMessage()); 120 System.exit(1); 121 } 122 123 // We haven't closed the local file yet. 124 closed = false; 125 126 // If we're receiving a file, receive, otherwise send. 127 if (receiveFile) 128 { 129 FileOutputStream output = null; 130 File file; 131 132 file = new File(localFilename); 133 134 // If file exists, don't overwrite it. 135 if (file.exists()) 136 { 137 System.err.println("Error: " + localFilename + " already exists."); 138 System.exit(1); 139 } 140 141 // Try to open local file for writing 142 try 143 { 144 output = new FileOutputStream(file); 145 } 146 catch (IOException e) 147 { 148 tftp.close(); 149 System.err.println("Error: could not open local file for writing."); 150 System.err.println(e.getMessage()); 151 System.exit(1); 152 } 153 154 // Try to receive remote file via TFTP 155 try 156 { 157 tftp.receiveFile(remoteFilename, transferMode, output, hostname); 158 } 159 catch (UnknownHostException e) 160 { 161 System.err.println("Error: could not resolve hostname."); 162 System.err.println(e.getMessage()); 163 System.exit(1); 164 } 165 catch (IOException e) 166 { 167 System.err.println( 168 "Error: I/O exception occurred while receiving file."); 169 System.err.println(e.getMessage()); 170 System.exit(1); 171 } 172 finally 173 { 174 // Close local socket and output file 175 tftp.close(); 176 try 177 { 178 output.close(); 179 closed = true; 180 } 181 catch (IOException e) 182 { 183 closed = false; 184 System.err.println("Error: error closing file."); 185 System.err.println(e.getMessage()); 186 } 187 } 188 189 if (!closed) 190 System.exit(1); 191 192 } 193 else 194 { 195 // We're sending a file 196 FileInputStream input = null; 197 198 // Try to open local file for reading 199 try 200 { 201 input = new FileInputStream(localFilename); 202 } 203 catch (IOException e) 204 { 205 tftp.close(); 206 System.err.println("Error: could not open local file for reading."); 207 System.err.println(e.getMessage()); 208 System.exit(1); 209 } 210 211 // Try to send local file via TFTP 212 try 213 { 214 tftp.sendFile(remoteFilename, transferMode, input, hostname); 215 } 216 catch (UnknownHostException e) 217 { 218 System.err.println("Error: could not resolve hostname."); 219 System.err.println(e.getMessage()); 220 System.exit(1); 221 } 222 catch (IOException e) 223 { 224 System.err.println( 225 "Error: I/O exception occurred while sending file."); 226 System.err.println(e.getMessage()); 227 System.exit(1); 228 } 229 finally 230 { 231 // Close local socket and input file 232 tftp.close(); 233 try 234 { 235 input.close(); 236 closed = true; 237 } 238 catch (IOException e) 239 { 240 closed = false; 241 System.err.println("Error: error closing file."); 242 System.err.println(e.getMessage()); 243 } 244 } 245 246 if (!closed) 247 System.exit(1); 248 249 } 250 251 } 252 253 } 254 255