package j6; import java.io.BufferedInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; // telnetの原形となるプログラムT1.java // このプログラムは,指定されたアドレスのポートに標準入出力を接続します // 使い方java T1 サーバアドレスポート番号 // 起動の例java T1 kiku.fuis.fukui-u.ac.jp 80 // 終了にはコントロールC を入力してください // ライブラリの利用 import java.net.Socket; import java.net.UnknownHostException; // T1クラス // T1クラスは,ネットワーク接続の管理を行います // StreamConnectorクラスを用いてスレッド処理を行います public class T1 { // ソケットの準備 protected Socket serverSocket;//接続用ソケット public OutputStream serverOutput;//ネットワーク出力用ストリーム public BufferedInputStream serverInput;// 同入力用ストリーム // openConnectionメソッド //アドレスとポート番号からソケットを作りストリームを作成します public void openConnection(String host,int port) throws IOException,UnknownHostException { serverSocket = new Socket(host, port); serverOutput = serverSocket.getOutputStream(); serverInput = new BufferedInputStream(serverSocket.getInputStream()); } // main_procメソッド // ネットワークとのやりとりをするスレッドをスタートさせます public void main_proc() throws IOException { try { // スレッド用クラスStreamConnectorのオブジェクトを生成します StreamConnector stdin_to_socket = new StreamConnector(System.in, serverOutput); StreamConnector socket_to_stdout = new StreamConnector(serverInput, System.out); // スレッドを生成します Thread input_thread = new Thread(stdin_to_socket); Thread output_thread = new Thread(socket_to_stdout); // スレッドを起動します input_thread.start(); output_thread.start(); } catch(Exception e){ System.err.print(e); System.exit(1); } } // mainメソッド // TCP コネクションを開いて処理を開始します public static void main(String[] arg){ try { T1 t = null; t = new T1(); t.openConnection(arg[0], Integer.parseInt(arg[1])); t.main_proc(); }catch(Exception e){ e.printStackTrace(); System.exit(1); } } } // StreamConnectorクラス // ストリームを受け取り,両者を結合してデータを受け渡します // StreamConnectorクラスはスレッドを構成するためのクラスです class StreamConnector implements Runnable { InputStream src = null; OutputStream dist = null; // コンストラクタ入出力ストリームを受け取ります public StreamConnector(InputStream in, OutputStream out){ src = in; dist = out; } // 処理の本体 // ストリームの読み書きを無限に繰り返します public void run(){ byte[] buff = new byte[1024]; while (true) { try { int n = src.read(buff); if (n > 0) dist.write(buff, 0, n); } catch(Exception e){ e.printStackTrace(); System.err.print(e); System.exit(1); } } } }