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 018package org.apache.commons.net.examples.unix; 019 020import java.io.BufferedReader; 021import java.io.IOException; 022import java.io.InputStreamReader; 023import java.io.InterruptedIOException; 024import java.io.OutputStreamWriter; 025import java.io.PrintWriter; 026import java.net.InetAddress; 027import java.net.SocketException; 028import java.nio.charset.Charset; 029import java.time.Duration; 030 031import org.apache.commons.net.echo.EchoTCPClient; 032import org.apache.commons.net.echo.EchoUDPClient; 033 034/** 035 * This is an example program demonstrating how to use the EchoTCPClient and EchoUDPClient classes. This program connects to the default echo service port of a 036 * specified server, then reads lines from standard input, writing them to the echo server, and then printing the echo. The default is to use the TCP port. Use 037 * the -udp flag to use the UDP port. 038 * <p> 039 * Usage: echo [-udp] <hostname> 040 * </p> 041 */ 042public final class echo { 043 044 public static void echoTCP(final String host) throws IOException { 045 final EchoTCPClient client = new EchoTCPClient(); 046 String line; 047 048 // We want to timeout if a response takes longer than 60 seconds 049 client.setDefaultTimeout(60000); 050 client.connect(host); 051 try { 052 System.out.println("Connected to " + host + "."); 053 final Charset charset = Charset.defaultCharset(); 054 final BufferedReader input = new BufferedReader(new InputStreamReader(System.in, charset)); 055 try (PrintWriter echoOutput = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), charset), true); 056 BufferedReader echoInput = new BufferedReader(new InputStreamReader(client.getInputStream(), charset))) { 057 while ((line = input.readLine()) != null) { 058 echoOutput.println(line); 059 System.out.println(echoInput.readLine()); 060 } 061 } 062 // Don't close System.in 063 } finally { 064 client.disconnect(); 065 } 066 } 067 068 public static void echoUDP(final String host) throws IOException { 069 int length, count; 070 byte[] data; 071 String line; 072 final BufferedReader input; 073 final InetAddress address; 074 075 final Charset charset = Charset.defaultCharset(); 076 input = new BufferedReader(new InputStreamReader(System.in, charset)); 077 address = InetAddress.getByName(host); 078 try (EchoUDPClient client = new EchoUDPClient()) { 079 080 client.open(); 081 // If we don't receive an echo within 5 seconds, assume the packet is lost. 082 client.setSoTimeout(Duration.ofSeconds(5)); 083 System.out.println("Ready to echo to " + host + "."); 084 085 // Remember, there are no guarantees about the ordering of returned 086 // UDP packets, so there is a chance the output may be jumbled. 087 while ((line = input.readLine()) != null) { 088 data = line.getBytes(charset); 089 client.send(data, address); 090 count = 0; 091 do { 092 try { 093 length = client.receive(data); 094 } 095 // Here we catch both SocketException and InterruptedIOException, 096 // because even though the JDK 1.1 docs claim that 097 // InterruptedIOException is thrown on a timeout, it seems 098 // SocketException is also thrown. 099 catch (final SocketException e) { 100 // We timed out and assume the packet is lost. 101 System.err.println("SocketException: Timed out and dropped packet"); 102 break; 103 } catch (final InterruptedIOException e) { 104 // We timed out and assume the packet is lost. 105 System.err.println("InterruptedIOException: Timed out and dropped packet"); 106 break; 107 } 108 System.out.print(new String(data, 0, length, charset)); 109 count += length; 110 } while (count < data.length); 111 112 System.out.println(); 113 } 114 115 } 116 } 117 118 public static void main(final String[] args) { 119 120 if (args.length == 1) { 121 try { 122 echoTCP(args[0]); 123 } catch (final IOException e) { 124 e.printStackTrace(); 125 System.exit(1); 126 } 127 } else if (args.length == 2 && args[0].equals("-udp")) { 128 try { 129 echoUDP(args[1]); 130 } catch (final IOException e) { 131 e.printStackTrace(); 132 System.exit(1); 133 } 134 } else { 135 System.err.println("Usage: echo [-udp] <hostname>"); 136 System.exit(1); 137 } 138 139 } 140 141}