解答例 - 実習課題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();
}
}
}
}

