이번시간엔 Nio java를 이용한 에코서버 만들기에 대해 포스팅 해보려고 한다. 사실 별내용은 없다. 기존에 만들었었던 기초적인 서버만들기와 비슷한 점이 많다. 에코서버의 전체 그림은 다음과 같다.
1. Serverinitializer class를 만들고 다음과 같이 코딩한다.
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.AsynchronousChannelGroup;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ServerInitializer
{
private static int PORT = 5000; ->포트수설정
private static int threadPoolSize = 8; ->스레드풀사이즈 설정
private static int initialSize = 4; ->이니셜 사이즈 설정
private static int backlog = 50;
public static void main(String[] args)
{
System.out.println("SERVER START!");
ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize); ->threadPoolSize 공간 할당
try
{
AsynchronousChannelGroup group = AsynchronousChannelGroup.withCachedThreadPool(executor, initialSize);->캐시스레드 풀생성
AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open(group);-> 스트림 지향의 리스닝 소켓을 위한 비동기 생성
listener.bind(new InetSocketAddress(PORT), backlog);
listener.accept(listener, new Dispatcher()); -> 리스닝 수용
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
2. Dispatcher class를 생성하고 다음과 같이 코딩한다.
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousServerSocketChannel;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class Dispatcher implements CompletionHandler<AsynchronousSocketChannel, AsynchronousServerSocketChannel>
{
private int DATA_SIZE = 1024;
@Override
public void completed(AsynchronousSocketChannel channel, AsynchronousServerSocketChannel listener)
{
listener.accept(listener, this);
ByteBuffer buffer = ByteBuffer.allocate(DATA_SIZE);
channel.read(buffer, buffer, new EchoHandler(channel));
}
@Override
public void failed(Throwable exc, AsynchronousServerSocketChannel listener)
{
}
}
3. EchoHandler class를 생성하고 다음과 같이 코딩해준다.
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;
public class EchoHandler implements CompletionHandler<Integer, ByteBuffer>
{
private AsynchronousSocketChannel channel; ->비동기식소켓채널 설정
public EchoHandler(AsynchronousSocketChannel channel)
{
this.channel = channel;
}
@Override
public void completed(Integer result, ByteBuffer buffer)
{
if (result == -1)
{
try
{
channel.close(); ->close안해주면 메모리에 내용이 그대로 남아있다. 꼭 닫아주자.
}
catch (IOException e)
{
e.printStackTrace();
}
}
else if (result > 0)
{
buffer.flip();
String msg = new String(buffer.array());
System.out.println("echo: " + msg);
}
}
@Override
public void failed(Throwable exc, ByteBuffer attachment) {
}
}
4. 이대로 정확히 다 설정해주면 다음과같이 실행되게 된다.
앞에 에코가 나오면서 정확히 잘 동작되고 있다.
'Server > Server의 기초' 카테고리의 다른 글
서버의 전체적인 그림 (0) | 2016.08.10 |
---|---|
Dispatcher을 이용한 또하나의 Protocol생성 (0) | 2016.08.07 |
Dispatcher (0) | 2016.08.07 |