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