이번에도 간단한 채팅 프로그램을 만들면서 네띠를 배워봅시다.
채팅이 가장 기본인듯 하네요...
1. 디팬던시를 추가해 줍시다.
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.66.Final</version>
</dependency>
메이븐이나 그래들 둘중에 원하시는걸 사용해 주세요.
2. 서버를 생성해 줍니다.
public class ChatServer {
private final int port;
private final List<Channel> channels = new ArrayList<>();
public ChatServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap bootstrap = new ServerBootstrap()
.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new ChatServerHandler(channels));
}
});
ChannelFuture future = bootstrap.bind(port).sync();
System.out.println("Server started on port " + port);
future.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
new ChatServer(8080).run();
}
}
이 서버는 포트 8080에서 들어오는 연결을 수신하고 연결하는 각 클라이언트에 대해 새 채널을 초기화합니다. 또한 수신 및 발신 메시지를 각각 인코딩하고 디코딩하는 채널 파이프라인에 StringEncoder 및 StringDecoder를 추가합니다. 마지막으로 들어오는 메시지를 처리하고 연결된 모든 클라이언트에 브로드캐스트하는 사용자 지정 ChatServerHandler를 추가합니다.
3. 클라이언트를 생성해 줍니다.
public class ChatClient {
private final String host;
private final int port;
public ChatClient(String host, int port) {
this.host = host;
this.port = port;
}
public void run() throws Exception {
EventLoopGroup group = new NioEventLoopGroup();
try {
Bootstrap bootstrap = new Bootstrap()
.group(group)
.channel(NioSocketChannel.class)
.handler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel socketChannel) throws Exception {
ChannelPipeline pipeline = socketChannel.pipeline();
pipeline.addLast(new StringDecoder());
pipeline.addLast(new StringEncoder());
pipeline.addLast(new ChatClientHandler());
}
});
Channel channel = bootstrap.connect(host, port).sync().channel();
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String line = in.readLine();
if (line == null) {
break;
}
channel.writeAndFlush(line + "\r\n");
}
} finally {
group.shutdownGracefully();
}
}
public static void main(String[] args) throws Exception {
new ChatClient("localhost", 8080).run();
}
}
이 클라이언트는 포트 8080의 "localhost"에서 서버에 연결하고 메시지 전송을 위한 새 채널을 초기화합니다. 또한 수신 및 발신 메시지를 각각 인코딩하고 디코딩하는 채널 파이프라인에 StringEncoder 및 StringDecoder를 추가합니다. 마지막으로 서버에서 들어오는 메시지를 처리할 사용자 지정 ChatClientHandler를 추가합니다.
클라이언트를 실행할 때 사용자에게 메시지를 입력하라는 메시지가 표시됩니다. 사용자가 Enter 키를 누르면 메시지가 서버로 전송되고 연결된 다른 모든 클라이언트에 브로드캐스팅됩니다. 사용자는 프로그램을 종료할 때까지 메시지를 계속 보낼 수 있습니다.
4. ChatServerHandler 와 ChatClientHandler 추가
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class ChatServerHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
String message = (String) msg;
System.out.println("Received message from client: " + message);
// Broadcast the message to all connected clients except the sender
ctx.channel().parent().writeAndFlush("[" + ctx.channel().remoteAddress() + "]: " + message + "\n");
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
public class ChatClientHandler extends ChannelInboundHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
String message = (String) msg;
System.out.println(message);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}
자 이제 만들어진 채팅 프로그램을 실행해 봅시다.
저는 intellij를 사용했기때문에 다음과 같은 방법으로 테스트 해보겠습니다.
1. ChatServer main()을 실행해 줍니다.
2. ChatClient main()을 실행해 줍니다.
3. ChatClient main()을 한번더 실행해 줍니다.
인텔리j에서 여러번을 실행하기 위해선 다음과 같이 세팅해 줘야 합니다.
여러번의 인스턴스를 중복으로 실행할 수 있도록 해줍니다.
이제 2개의 실행된 chatclient에서 채팅을 번갈아 가면서 테스트 해봅시다.
다음과 같이 나오면 정상입니다.
감사합니다.
'네띠' 카테고리의 다른 글
Netty (네띠) 에 대해 알아보자. (0) | 2023.03.04 |
---|
댓글