ソフトウエア基礎
ohmi@rsch.tuis.ac.jp

ネットワーク(2) 解答例

課題net-12

test.txtという名のファイルができ、内容は "File can't write." の一行である。このファイルには改行コードは含まれてない (od -c コマンドで確認できる)。

課題net-13

再度実行しても、test.txtの内容は変わらない。 FileOutput1.java を実行するたびに、test.txtの内容を空にして、 "File can't write."と書き込んでいるためである。

課題net-14

import java.io.*;

public class FracFileWrite {
    // 再帰版 frac
/*  static long frac(int n) {
	if (n == 0) return 1;
	return n*frac(n-1);
    } */

    // 繰り返し版 frac
    static long frac(int n) {
	int r = 1;
	for (int i = 1; i <= n; i++) {
	    r *= i;
	}
	return r;
    }

    public static void main(String[] args) {
	try {
	    FileWriter fw = new FileWriter("frac.txt");
	    PrintWriter pw = new PrintWriter(fw);
	    pw.println("8! = " + frac(8));
	    pw.close();
	} catch (IOException e) {
	    System.err.println("File can't write.");
	}
    }
}

課題net-15

import java.io.*;

public class AverageScore {
    public static void main(String[] args) {
	try {
	    BufferedReader br = new BufferedReader(new FileReader("data.txt"));
	    int sum = 0;
	    int n = 0;
	    String s;
	    while((s = br.readLine()) != null) {
		sum += Integer.parseInt(s);
		n++;
	    }
	    br.close();

	    System.out.println("Average score is " + (double)sum/n);
	} catch (IOException e) {
	    System.err.println("File can't read.");
	}
    }
}

課題net-16

import java.io.*;

public class ScoreSorting {
    static void bubble_sort(int[] d, int n) {
	for (int i = n-1; i > 0; i--) {
	    for (int j = 0; j < i; j++) {
		if (d[j] > d[j+1]) {
		    int t = d[j];
		    d[j] = d[j+1];
		    d[j+1] = t;
		}
	    }
	}
    }

    public static void main(String[] args) {
	try {
	    final int data_max = 100;
	    BufferedReader br = new BufferedReader(new FileReader("data.txt"));
	    int[] scores = new int[data_max];
	    int n = 0;
	    String s;
	    while((s = br.readLine()) != null) {
		if (n > data_max) {
		    System.err.println("Number of Data is too much!");
		    System.exit(-1);
		}
		scores[n] = Integer.parseInt(s);
		n++;
	    }
	    br.close();

	    bubble_sort(scores, n);

	    for (int i = 0; i < n; i++) {
		System.out.println(scores[i]);
	    }
	} catch (IOException e) {
	    System.err.println("File can't read.");
	}
    }
}

※ このプログラム例では、点数を格納する配列の大きさを100と 固定にしている。このため、data.txtのデータ数が100を超えた場合 エラー処理をしている。

課題net-17

import java.net.*;
import java.io.*;

public class DaytimeClient2 {
    public static void main(String[] args) {
	try {
	    String remotehost = null;
	    if (args.length != 1) {
		System.err.println("Usage: java DaytimeClient hostname");
		System.exit(-1);
	    } else {
		remotehost = args[0];
	    }

	    Socket sock = new Socket(remotehost, 13);
		    
	    InputStream is = sock.getInputStream();
	    int c;
	    while((c=is.read()) != -1) {
		System.out.print((char)c);
	    }
	    sock.close();
	} catch (UnknownHostException e) {
	    System.err.println(e);
	} catch (IOException e) {
	    System.err.println(e);
	}
    }
}

課題net-18

import java.net.*;
import java.io.*;

public class DaytimeClient3 {
    public static void main(String[] args) {
	try {
	    String remotehost = null;
	    if (args.length != 1) {
		System.err.println("Usage: java DaytimeClient hostname");
		System.exit(-1);
	    } else {
		remotehost = args[0];
	    }

	    Socket sock = new Socket(remotehost, 13);
		    
	    BufferedReader br = new BufferedReader(new InputStreamReader(
	 					   sock.getInputStream()));
	    String s;
	    while((s=br.readLine()) != null) {
		System.out.println(s);
	    }
	    sock.close();
	} catch (UnknownHostException e) {
	    System.err.println(e);
	} catch (IOException e) {
	    System.err.println(e);
	}
    }
}

課題net-19

import java.net.*;
import java.io.*;

public class DaytimeClient4 {
    public static void main(String[] args) {
	try {
	    String remotehost = null;
	    if (args.length != 1) {
		System.err.println("Usage: java DaytimeClient hostname");
		System.exit(-1);
	    } else {
		remotehost = args[0];
	    }

	    Socket sock = new Socket(remotehost, 13);
		    
	    BufferedReader br = new BufferedReader(new InputStreamReader(
	 					   sock.getInputStream()));
	    System.out.println("Remote Hostname is " +
			       sock.getInetAddress().getHostName());
	    System.out.println("Remote Port is " + sock.getPort());
	    System.out.println("Local Hostname is " +
			       sock.getLocalAddress().getHostName());
	    System.out.println("Local Port is " + sock.getLocalPort());

	    String s;
	    while((s=br.readLine()) != null) {
		System.out.println(s);
	    }
	    sock.close();
	} catch (UnknownHostException e) {
	    System.err.println(e);
	} catch (IOException e) {
	    System.err.println(e);
	}
    }
}

System.out.println(... + sock.getInetAddress().getHostName()); とあるのは、以下の省略形である。

            InetAddress a = sock.getInetAddress();
            System.out.println(... +  a.getHostName());

このプログラムを実行すると、実行するたびにローカル側のポート番号が 変わっていく(増えていく)であろう。これは、ソケットを生成する時に 自動的に割り当てられたポート番号である。

課題net-20

実行すると、途中でハングアップしたようになる。 これは、サーバに送信すべきデータがバッファに溜ったままになっているためで ある。 クラインアント側はサーバからの返答を待ち、サーバ側もクライアントから の要求を待っているという状態である。

課題net-21

import java.net.*;
import java.io.*;

public class EchoClient2 {
    public static void main(String[] args) {
	try {
	    String remotehost = "localhost";

	    Socket sock = new Socket(remotehost, 7);
	    
	    PrintWriter out = new PrintWriter(sock.getOutputStream());
	    BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
	    BufferedReader kin = new BufferedReader(new InputStreamReader(System.in));
	    System.out.println("Connected.");

	    while(true) {
		String s = kin.readLine();
		if (s.equals("")) break;
		out.print(s + "\r\n");
	        out.flush();
		s = in.readLine();
		System.out.println(s);
	    }
	    sock.close();
	} catch (UnknownHostException e) {
	    System.err.println(e);
	} catch (IOException e) {
	    System.err.println(e);
	}
    }
}

※ 空行かどうかの判定は、s = ""ではなく、 s.equals("")であることに注意せよ。


ソフトウエア基礎

ohmi@rsch.tuis.ac.jp

Valid HTML 4.01!