解答例 - 実習課題1 - 3.サーバソケット
(実習課題)
前節の演習課題で利用したDaytimeサーバを実装してください。送り返す文字列は、現在の日時がわかるものであれば書式は問いません。待ち受けポートは10013番ポートとして下さい。このプログラムはすぐにコネクションを開放するため、マルチスレッドにする必要性は高くありませんが、ここでは接続のあるたびに新しいスレッドを作成するようにして下さい。
また、前節の演習課題で作成したクライアントプログラムを変更し、コマンドラインで接続先ポート番号も指定できるようにして下さい。ポート番号は省略可とし、省略時のポート番号は13として下さい。このプログラムを用いて、サーバプログラムの動作を確認してください。
解答例
/** * MultiDaytimeClient.java TECHSCORE Javaネットワークプログラミング3章 実習課題 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.net.chapter3; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; public class MultiDaytimeClient { public static final int DAYTIME_PORT = 13; public static void main(String args[]) { Socket socket = null; try { //引数で指定したホストに接続する if (args.length == 0) { System.out.println("引数に接続先のサーバを指定してください"); return; } else if (args.length == 1) { System.out.println("デフォルトのポート番号を使用します"); socket = new Socket(args[0], DAYTIME_PORT); } else { socket = new Socket(args[0], Integer.parseInt(args[1])); } System.out.println("接続しました : " + socket.getRemoteSocketAddress()); //データ受信用のリーダを作成 BufferedReader in = new BufferedReader(new InputStreamReader(socket .getInputStream())); String line; while ((line = in.readLine()) != null) { System.out.println(line); } in.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (socket != null) { socket.close(); System.out.println("切断されました : " + socket.getRemoteSocketAddress()); } } catch (IOException e) { } } } }
/** * MultiDaytimeServer.java TECHSCORE Javaネットワークプログラミング3章 実習課題 * * Copyright (c) 2004 Four-Dimensional Data, Inc. */ package com.techscore.net.chapter3; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Date; public class MultiDaytimeServer { public static final int DAYTIME_PORT = 10013; public static void main(String args[]) { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(DAYTIME_PORT); System.out.println("MultiDaytimeServerが起動しました : (port=" + serverSocket.getLocalPort() + ")"); while (true) { Socket socket = serverSocket.accept(); new DaytimeThread(socket).start(); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (serverSocket != null) { serverSocket.close(); } } catch (IOException e) { } } } } class DaytimeThread extends Thread { private Socket socket; public DaytimeThread(Socket socket) { this.socket = socket; System.out.println("接続されました : " + socket.getRemoteSocketAddress()); } public void run() { try { //データ送信用のプリントライタを作成 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); //クライアントに時間を送信する out.println(new Date()); } catch (IOException e) { e.printStackTrace(); } finally { try { if (socket != null) { socket.close(); System.out.println("切断されました : " + socket.getRemoteSocketAddress()); } } catch (IOException e) { } } } }