解答例 - 実習課題1 - 4.データグラム
(実習課題1)
第2節〜第3節で作成した、Daytimeサーバ・クライアントをUDPを利用したものに変更して下さい。クライアント側では、要求を送信して5秒以内に返答が無い場合、エラーメッセージを表示するようにして下さい。
解答例
/** * DatagramDaytimeClient.java * TECHSCORE Javaネットワークプログラミング4章 実習課題 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.net.chapter4; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketTimeoutException; public class DatagramDaytimeClient { public static final int DAYTIME_PORT = 13; public static final int PACKET_SIZE = 1024; public static void main(String args[]) { DatagramSocket socket = null; InetSocketAddress remoteAddress; //受信データグラムインスタンスの作成 byte buf[] = new byte[PACKET_SIZE]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //引数で指定したサーバに接続する if (args.length == 0) { System.out.println("引数に接続先のサーバを指定してください"); return; } else if (args.length == 1) { System.out.println("デフォルトのポート番号を使用します"); remoteAddress = new InetSocketAddress(args[0], DAYTIME_PORT); } else { remoteAddress = new InetSocketAddress(args[0], Integer.parseInt(args[1])); } try { socket = new DatagramSocket(); //5秒以内に反応がない場合エラー出力する socket.setSoTimeout(5000); //パケットを送る byte[] bufs = "".getBytes(); DatagramPacket sendPacket = new DatagramPacket(bufs, bufs.length, remoteAddress); //データグラムパケットの送信 socket.send(sendPacket); //データグラムパケットの受信 socket.receive(packet); //受信データグラムパケットの内容 String daytime = new String(buf, 0, packet.getLength()); System.out.println(daytime); } catch (SocketTimeoutException e) { System.out.println("サーバから反応がありません"); } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) { socket.close(); } } } }
/** * DatagramDaytimeServer.java * TECHSCORE Javaネットワークプログラミング4章 実習課題 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.net.chapter4; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.Date; public class DatagramDaytimeServer { public static final int DAYTIME_PORT = 10013; public static final int PACKET_SIZE = 1024; public static void main(String args[]) { DatagramSocket socket = null; byte buf[] = new byte[PACKET_SIZE]; DatagramPacket packet = new DatagramPacket(buf, buf.length); try { socket = new DatagramSocket(DAYTIME_PORT); System.out.println( "DatagramDaytimeServerが起動しました : (port=" + socket.getLocalPort() + ")"); while (true) { socket.receive(packet); //時刻を求める String daytime = (new Date()).toString(); byte[] bufs = daytime.getBytes(); // 送信データグラムインスタンスの作成 DatagramPacket sendPacket = new DatagramPacket( bufs, bufs.length, packet.getSocketAddress()); //データグラムパケットの送信 socket.send(sendPacket); } } catch (IOException e) { e.printStackTrace(); } finally { if (socket != null) { socket.close(); } } } }