Home > Java > Socket の勉強のためにエコーサーバー書いた

Socket の勉強のためにエコーサーバー書いた

前々から、Jarひとつで動くHTTPサーバーを書いてみたいと思っていて(既にたくさんあると思うけど)、それには Socket でがちゃがちゃしないといけないとの事だったので、重い腰を上げて Socket の勉強をしてみた。

とりあえず、リクエストされた文字列をそのまま返すだけのエコーサーバーを書いてみた。
一応、マルチスレッド対応。

Server

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class EchoServer {

    public static void main(String[] args) throws IOException {

        ServerSocket server = new ServerSocket(5000);

        // クライアントからの接続を待ち受ける
        while (true) {
            Socket client = server.accept();

            new Thread(new EchoServer().new EchoThread(client)).start();
        }
    }

    class EchoThread implements Runnable {

        Socket client;

        public EchoThread(Socket client) {
            this.client = client;
        }

        @Override
        public void run() {
            echo(client);
        }

        private void echo(Socket client) {
            System.out.println("処理開始");

            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
            }

            System.out.println("接続中 : " + client.getRemoteSocketAddress());

            try {
                InputStream in = client.getInputStream();
                OutputStream out = client.getOutputStream();

                int recvByte;
                while ((recvByte = in.read()) != -1) {
                    out.write(recvByte);
                }
            } catch (IOException e) {
                System.err.println(e);
            } finally {
                closeQuietly(client);
            }

            System.out.println("処理終了");
        }

        private void closeQuietly(Socket socket) {
            try {
                if (socket != null) {
                    socket.close();
                }
            } catch (IOException e) {
                // ignore
            }
        }
    }
}

Client

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class EchoClient {

    public static void main(String[] args) throws IOException {

        Socket socket = new Socket("localhost", 5000);
        System.out.println("サーバとの接続を確立 : " + socket.getLocalPort());

        InputStream in = socket.getInputStream();
        OutputStream out = socket.getOutputStream();

        byte[] data = args[0].getBytes();
        out.write(data);
        System.out.println("送信 : " + new String(data));

        int i = 0;
        byte[] output = new byte[data.length];
        int recvByte;
        while ((recvByte = in.read()) != -1) {
            output[i++] = (byte) recvByte;

            if (i >= data.length) {
                break;
            }
        }

        System.out.println("受信 : " + new String(output));

        socket.close();
    }
}

バイトの読み書きを1バイトずつやってるので、あまり効率的ではないんだろうな。

Comments:0

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://sinsengumi.net/blog/2012/03/socket-%e3%81%ae%e5%8b%89%e5%bc%b7%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ab%e3%82%a8%e3%82%b3%e3%83%bc%e3%82%b5%e3%83%bc%e3%83%90%e3%83%bc%e6%9b%b8%e3%81%84%e3%81%9f/trackback/
Listed below are links to weblogs that reference
Socket の勉強のためにエコーサーバー書いた from sinsengumi血風録
pingback from シンプルな HTTP Server 書いた - sinsengumi血風録 2012年3月31日

[...] Older [...]

Home > Java > Socket の勉強のためにエコーサーバー書いた

Search
Feeds
Meta

Return to page top