하나의 응용 프로그램 (서버 다음의 클라이언트)에서 TCP 에코 서버와 클라이언트를 모두 시작하려고합니다.Netty : 서버가 부트 스트랩 한 후 클라이언트를 시작하십시오. 다른 스레드가 필요한 이유는 무엇입니까?
내가 할 것은 :이 같은 server.bind().sync()
에 의해 반환 ChannelFutureListener
에서 클라이언트를 시작 :
public void runClientAndServer() {
server.run().addListener((ChannelFutureListener) future -> {
// client.run(); //(1) this doesn't work!
new Thread(()->client.run()).start(); //(2) this works!
});
}
및 server.run()
은 다음과 같이이다 :
public ChannelFuture run() {
ServerBootstrap b = new ServerBootstrap();
//doing channel config stuff
return b.bind(6666).sync();
}
및 client.run()
이 같다 :
public void run() {
Bootstrap b = new Bootstrap();
//do some config stuff
f = b.connect(host, port).sync(); //wait till connected to server
}
어떤 일이 발생합니까 : 잘 작동하는 문장 (2)에서; 위 문장 (1)에서 클라이언트는 Wireshark에서 볼 수있는 메시지를 보내고 서버는 TCP ACK
세그먼트를 응답하지만 서버 쪽에서는 channelRead()
메서드가 호출되지 않으며 소켓에 메시지를 쓰려고 시도 할 수 없습니다 이 캡처 같은 : wireshark capture
(4.1.16.Final를) 나는 인 Netty 스레드에 문제가 있어야합니다 생각하지만, 난 그냥
나는 최신 그물코의 버전을 기준으로 예를 준비했습니다