ファイルの転送

  まず,クライアント側のプログラムを見て下さい.基本的には,C/C++ の場合と同じですが,Java の場合は,プログラム例 12.1 と同様,Socket クラスのコンストラクタだけで簡単にソケット接続が可能です.

/****************************/
/* サーバへファイルを転送   */
/* (クライアント)         */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.net.*;

public class Client1
{
	public static void main(String[] args)
	{
					// サーバ名
		if (args.length < 1) {
			System.out.println("***error***  サーバ名を入力してください");
			System.exit(1);
    	}
		else
			new Connect(args[0]).start();
	}
}
/*
		接続
*/
class Connect extends Thread
{
	private String hostname;

	public Connect(String hostname_i)
	{
		hostname = hostname_i;
	}

	public void run()
	{
		String line, f_name, str;
		int bt, port = 50000;

		try {
					// 接続
			Socket s = new Socket(hostname, port);
					// ファイル名の入力
			BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
			line = in.readLine();
			System.out.print(line);

			BufferedReader in_s = new BufferedReader(new InputStreamReader(System.in));
			f_name = in_s.readLine();

			PrintWriter out = new PrintWriter(s.getOutputStream(), true);
			out.println(f_name);
					// ファイル名の送信
			BufferedInputStream in_f = new BufferedInputStream(new FileInputStream(f_name));
			BufferedOutputStream out_f = new BufferedOutputStream(s.getOutputStream());
					// ファイル内容の送信
			long k = 0;
			while ((bt = in_f.read()) >= 0) {
				out_f.write(bt);
				k++;
			}
			out_f.flush();
			System.out.println(k + " バイト送信しました");
					// 接続を切る
			s.close();
		}

		catch (IOException e) {
			System.out.println("Error : " + e);
			System.exit(1);
		}
	}
}
		

  サーバ側のプログラムにおいても,ServerSocket クラスのコンストラクタを使用して,C/C++ の場合より簡単に記述することができます.また,fork 関数に代わるものとして,スレッドを使用している点にも注意して下さい.

/****************************/
/* サーバへファイルを転送   */
/* (サーバ)               */
/*      coded by Y.Suganuma */
/****************************/
import java.io.*;
import java.net.*;

public class Server1
{
	public static void main(String[] args)
	{
		int port = 50000;

		try {
			ServerSocket s_s = new ServerSocket(port);
			System.out.println("Ready to Transfer");
			for (;;) {
				Socket s = s_s.accept( );
				new Connect(s).start();
			}
		}
		catch (Exception e) {
			System.out.println(e);
		}
	}
}
/*
          新しい接続
*/
class Connect extends Thread
{
	private Socket s;

	public Connect(Socket s_i)
	{
		s = s_i;
	}

	public void run()
	{
		int bt;
		String str, f_name;

		try {
					// ファイル名
			PrintWriter out = new PrintWriter(s.getOutputStream(), true);
			out.println("ファイル名を入力してください ");

			BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
			f_name = in.readLine();
					// 保存
			BufferedOutputStream out_f = new BufferedOutputStream(new FileOutputStream(f_name));
			BufferedInputStream in_f = new BufferedInputStream(s.getInputStream());
			long k = 0;
			while ((bt = in_f.read()) >= 0) {
				out_f.write(bt);
				k++;
			}
			out_f.close();
			System.out.println(k + " バイト受け取りました");
					// 終了
			s.close();
		}

		catch (Exception e) {
			System.out.println(e);
		}
	}
}