tokuhirom's blog

Blocking echo server in Java

ServerSocketChannel を利用した blocking な echo server の実装でまともなのが見当たらなかったので書いた。

System.inheritedChannel() 使うようにもできるようにしたかったから1から書いたという感じ。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.Channel;
import java.nio.channels.ServerSocketChannel;

public class EchoServer {
    public static void main(String[] args) throws IOException {
        final ServerSocket socket = args.length == 1
                ? createSocket(Integer.parseInt(args[0]))
                : getInheritedSocket();

        while (true) {
            try (final Socket client = socket.accept()) {
                byte[] buf = new byte[1024];
                while (!client.isClosed()) {
                    int read = client.getInputStream().read(buf);
                    if (read > 0) {
                        client.getOutputStream().write(buf, 0, read);
                    } else {
                        client.close();
                    }
                }
                System.out.println("Closed connection.");
            }
        }
    }

    private static ServerSocket createSocket(int port) throws IOException {
        final ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
        final ServerSocket socket = serverSocketChannel.socket();
        final InetSocketAddress inetSocketAddress = new InetSocketAddress(port);
        socket.setReuseAddress(true);
        socket.bind(inetSocketAddress);
        return socket;
    }

    public static ServerSocket getInheritedSocket() throws IOException {
        final Channel channel = System.inheritedChannel();
        if (channel instanceof ServerSocketChannel) {
            return ((ServerSocketChannel)channel).socket();
        } else {
            throw new IllegalStateException("There is no inherited available server socket: " + channel);
        }
    }
}
Created: 2015-05-28 23:36:47
Updated: 2015-05-28 23:36:47
comments powered by Disqus