import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.io.DataOutputStream; import java.net.Socket; public class Clientx { public static void main(String[] args) throws IOException{ String sendData = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; String Host = args[0]; Integer DstPort = Integer.parseInt(args[1]); int count = Integer.parseInt(args[2]); String Proto = args[3]; System.out.println(Proto); if (Proto.equals("U")) { UDPsend(sendData,Host,DstPort,count); }else{ TCPsend(sendData,Host,DstPort,count); } } public static void UDPsend(String sdata, String host, int dstPort, int count) throws IOException{ byte[] bdata = sdata.getBytes("UTF-8"); DatagramSocket sock = new DatagramSocket(); DatagramPacket packet = new DatagramPacket(bdata, bdata.length, new InetSocketAddress(host,dstPort)); for(int i=1; i<=count; i++) { sock.send(packet); System.out.println("Sent UDP data "+host+":"+dstPort); try{ Thread.sleep(1000); }catch(InterruptedException e){} } sock.close();// } public static void TCPsend(String sdata, String host, int dstPort, int count) { try{ for(int i=1; i<=count; i++) { Socket sock = new Socket(host,dstPort); DataOutputStream out = new DataOutputStream(sock.getOutputStream()); out.writeUTF(sdata); System.out.println("Sent TCP data "+host+":"+dstPort); out.close(); sock.close(); try{ Thread.sleep(1000); }catch(InterruptedException e){} } }catch(IOException e){ e.printStackTrace(); } } }-------------
使い方
TCP12345のパケットを5個送信
java Clientx localhost 12345 5 T
UDP12345のパケットを5個送信
java Clientx localhost 12345 5 U
実際は4番目の引数が"U"ならUDP、それ以外だとTCPになる。
4番目の引数がないと動かない。
UDPの場合はport unreachableが返ってきてもとりあえず送信はするが、
TCPの場合受信者がいないと(指定したTCPポートをリッスンしていない)と、
1回送ってExceptionを吐いて終了してしまう。
TCPのサーバも作った。
TCPのサーバ
ServerT.java
import java.io.IOException; import java.io.DataInputStream; import java.net.ServerSocket; import java.net.Socket; public class ServerT { public static void main(String[] args) { try{ while(true){ ServerSocket svSock = new ServerSocket(12345); Socket sock = svSock.accept(); DataInputStream in = new DataInputStream(sock.getInputStream()); String strData = in.readUTF(); System.out.println("Received TCP : "+strData); in.close(); svSock.close(); } }catch(IOException e){ e.printStackTrace(); } } }UDP/TCPどっちでも受信できるようにするのはまた今度。