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