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.BufferedReader;
019 import java.io.IOException;
020 import java.io.InputStreamReader;
021 import java.io.InterruptedIOException;
022 import java.net.InetAddress;
023 import java.net.SocketException;
024 import org.apache.commons.net.CharGenTCPClient;
025 import org.apache.commons.net.CharGenUDPClient;
026
027 /***
028 * This is an example program demonstrating how to use the CharGenTCPClient
029 * and CharGenUDPClient classes. This program connects to the default
030 * chargen service port of a specified server, then reads 100 lines from
031 * of generated output, writing each line to standard output, and then
032 * closes the connection. The UDP invocation of the program sends 50
033 * datagrams, printing the reply to each.
034 * The default is to use the TCP port. Use the -udp flag to use the UDP
035 * port.
036 * <p>
037 * Usage: chargen [-udp] <hostname>
038 * <p>
039 ***/
040 public final class chargen
041 {
042
043 public static final void chargenTCP(String host) throws IOException
044 {
045 int lines = 100;
046 String line;
047 CharGenTCPClient client = new CharGenTCPClient();
048 BufferedReader chargenInput;
049
050 // We want to timeout if a response takes longer than 60 seconds
051 client.setDefaultTimeout(60000);
052 client.connect(host);
053 chargenInput =
054 new BufferedReader(new InputStreamReader(client.getInputStream()));
055
056 // We assume the chargen service outputs lines, but it really doesn't
057 // have to, so this code might actually not work if no newlines are
058 // present.
059 while (lines-- > 0)
060 {
061 if ((line = chargenInput.readLine()) == null)
062 break;
063 System.out.println(line);
064 }
065
066 client.disconnect();
067 }
068
069 public static final void chargenUDP(String host) throws IOException
070 {
071 int packets = 50;
072 byte[] data;
073 InetAddress address;
074 CharGenUDPClient client;
075
076 address = InetAddress.getByName(host);
077 client = new CharGenUDPClient();
078
079 client.open();
080 // If we don't receive a return packet within 5 seconds, assume
081 // the packet is lost.
082 client.setSoTimeout(5000);
083
084 while (packets-- > 0)
085 {
086 client.send(address);
087
088 try
089 {
090 data = client.receive();
091 }
092 // Here we catch both SocketException and InterruptedIOException,
093 // because even though the JDK 1.1 docs claim that
094 // InterruptedIOException is thrown on a timeout, it seems
095 // SocketException is also thrown.
096 catch (SocketException e)
097 {
098 // We timed out and assume the packet is lost.
099 System.err.println("SocketException: Timed out and dropped packet");
100 continue;
101 }
102 catch (InterruptedIOException e)
103 {
104 // We timed out and assume the packet is lost.
105 System.err.println(
106 "InterruptedIOException: Timed out and dropped packet");
107 continue;
108 }
109 System.out.write(data);
110 System.out.flush();
111 }
112
113 client.close();
114 }
115
116
117 public static final void main(String[] args)
118 {
119
120 if (args.length == 1)
121 {
122 try
123 {
124 chargenTCP(args[0]);
125 }
126 catch (IOException e)
127 {
128 e.printStackTrace();
129 System.exit(1);
130 }
131 }
132 else if (args.length == 2 && args[0].equals("-udp"))
133 {
134 try
135 {
136 chargenUDP(args[1]);
137 }
138 catch (IOException e)
139 {
140 e.printStackTrace();
141 System.exit(1);
142 }
143 }
144 else
145 {
146 System.err.println("Usage: chargen [-udp] <hostname>");
147 System.exit(1);
148 }
149
150 }
151
152 }
153