Search on the blog

2014年2月25日火曜日

telnetでポート接続を確認する


  telnetって遠隔操作のためのプロトコルだと思ってたけど、TCPポートの接続テストにも使えるみたいです。
 そういえば、昔telnetでHTTPサーバーに接続して「おーこれがステータスコードかー。」って確認して遊んだことがありました。コマンドラインから入力した文字をソケットの入力ストリームにそのまま入力して、ソケットからの出力をコマンドラインにそのまま出力してくれてるような感じだったので、echoサーバーを作って確認してみました。

 まずechoサーバー。今回の用途には特に不要ですが、練習のためマルチスレッド版を書きました。
package com.kenjih.echo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {

    private static class EchoProcessor extends Thread {
        private Socket socket = null;

        private EchoProcessor(Socket socket) {
            super(EchoProcessor.class.toString());
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                BufferedReader in = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                PrintWriter out = new PrintWriter(socket.getOutputStream(),
                        true);

                String line = null;
                while ((line = in.readLine()) != null) {
                    out.println(line);
                }

                System.out.printf("connection closed %s:%d\n",
                        socket.getInetAddress(), socket.getPort());
                socket.close();

            } catch (IOException e) {
                System.err.printf("error occurred in socket %s:%d\n",
                        socket.getInetAddress(), socket.getPort());
            }
        }
    }

    public static void main(String[] args) {
        if (args.length != 1 || !args[0].matches("^[0-9]+$")) {
            System.err.println("usege: java EchoServer <port number>");
            System.exit(1);
        }

        int port = Integer.valueOf(args[0]);
        boolean listening = true;

        try {
            ServerSocket serverSocket = new ServerSocket(port);
            while (listening) {
                Socket socket = serverSocket.accept();
                System.out.printf("connection opened %s:%d\n",
                        socket.getInetAddress(), socket.getPort());
                new EchoProcessor(socket).start();
            }
        } catch (IOException e) {
            System.err.println("Could not listen on port " + port);
        }
    }
}
でサーバーを起動。
$ java -cp bin com.kenjih.echo.EchoServer 12345

で別のコマンドラインからtelnet接続。ポイントはポート番号を指定しているところです。
$ telnet localhost 12345
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hogehoge
hogehoge
fugafuga
fugafuga
おー、なるほど。これは便利ですね。telnetはサーバーを書いた時のデバッグツールとして使えそうです。

0 件のコメント:

コメントを投稿