본문 바로가기

Java/Vert.x

버텍스 코어: TCP 클라이언트

더보기

Vertx를 사용하면 간단하게 논 블로킹(Non blocking) TCP 서버와 클라이언트를 구현 할 수 있습니다.

TCP 클라이언트를 생성하려면 Vertx 객체의 createNetClient()를 호출합니다.

NetClient client = vertx.createNetClient();

TCP 클라이언트 구성

TCP 클라이언트 환경 설정을 변경하려면 NetClientOptions를 사용하여 TCP 클라이언트를 생성합니다.

NetClientOptions options = new NetClientOptions().setConnectTimeout(10000);
NetClient client = vertx.createNetClient(options);
더보기
더보기

서버에 연결 할 수 없는 경우 자동으로 재연결을 시도하기 위해서 setReconnectInterval()setReconnectAttempts()를 사용합니다.

이 설정은 초기 연결 과정에서만 적용됩니다.

NetClientOptions options = new NetClientOptions().
	setReconnectAttempts(10).
	setReconnectInterval(500);

NetClient client = vertx.createNetClient(options);

디폴트로는 재연결을 시도하지 않도록 되어있습니다.

TCP 서버에 연결

서버에 연결하려면 connect()를 사용합니다. 연결에는 첫 번째 인자:포트와 두 번째 인자:호스트가 필요합니다.

연결이 성사 또는 실패하면 등록된 핸들러를 통해 콜백 받습니다.

연결이 성사된 경우에 한해서  NetSocket 객체에 접근하여 소켓에 데이터를 읽거나 쓸 수 있습니다.

NetClientOptions options = new NetClientOptions().setConnectTimeout(10000);
NetClient client = vertx.createNetClient(options);
client.connect(4321, "localhost", res -> {
	if (res.succeeded()) {
		System.out.println("Connected!");
		NetSocket socket = res.result();
	} else {
		System.out.println("Failed to connect: " + res.cause().getMessage());
	}
});

TCP 클라이언트 소켓 처리

소켓으로부터 데이터를 읽어오려면 handler()를 등록합니다.

이 핸들러는 소켓으로부터 데이터를 읽어 올 수 있을 때 Buffer 객체와 함께 호출됩니다. 버퍼에는 전달된 데이터가 작성되어 있습니다.

socket.handler(buffer -> {
	System.out.println("I received some bytes: " + buffer.length());
});

소켓에 데이터를 작성하려면 write()를 사용합니다.

Buffer buffer = Buffer.buffer().appendFloat(12.34f).appendInt(123);
socket.write(buffer);

// Write a string in UTF-8 encoding
socket.write("some data");

// Write a string using the specified encoding
socket.write("some data", "UTF-16");
더보기
더보기

소켓에 버퍼를 쓰는 작업 write()는 비동기로 처리됩니다.

메소드가 리턴된 이후에도 아직 버퍼가 스트리밍되지 않았거나 또는 스트리밍 중일 수 있습니다.

따라서 버퍼를 재사용하지 않도록 주의합니다.

소켓에 연결된 IP 주소를 확인하려면 localAddress() 또는 remoteAddress()를 사용합니다.

SocketAddress local = socket.localAddress();
SocketAddress remote = socket.remoteAddress();

소켓이 닫히면 closeHandler()를 등록하여 콜백 받습니다.

socket.closeHandler(v -> {
	System.out.println("The socket has been closed");
});

정리 및 복습

  • createNetClient()를 사용해 TCP 클라이언트를 생성합니다.
  • TCP 클라이언트 생성에 필요한 구성은 NetClientOptions를 사용합니다.
  • TCP 서버와의 연결이 성사되면 NetSocket 객체에 접근 할 수 있습니다.
  • 소켓으로 서버가 보낸 데이터를 읽고, 서버로 데이터를 작성 할 수 있습니다.