Я хочу создать систему связи с двумя клиентами и сервером в Netty nio. Более конкретно, во-первых, я хочу, чтобы два клиента подключались к серверу для отправки сообщения с сервера, а затем для возможности обмена данными между двумя клиентами. Я использую код приведенный в этом примере. Мои изменения в коде можно найти здесь: ссылка
Кажется, что channelRead в serverHandler работает, когда первый клиент подключен, поэтому он всегда возвращает 1, но когда второй клиент подключен, он не изменяется на 2. Как я могу правильно проверить сервер, когда оба клиента подключены к сервер? Как я могу читать это значение динамически из моей основной функции Клиента? Тогда, что является лучшим способом, чтобы оба клиента обменивались данными?
EDIT1: Похоже, что клиентская служба работает и закрывается напрямую, поэтому каждый раз, когда я запускаю новый NettyClient, подключается, но после этого соединение закрывается. Таким образом, счетчик всегда имеет значение от нуля до единицы. Поскольку я был проинструктирован в нижеприведенных комментариях, я тестировал его, используя telnet в том же порту, и счетчик, кажется, растет нормально, однако, с услугой NettyClient нет.
EDIT2: Кажется, что проблема у меня была от future.addListener(ChannelFutureListener.CLOSE);
, которая находилась в channelRead
в ProcessingHandler class
. Когда я прокомментировал это, кажется, что код работает. Однако я не уверен, каковы последствия прокомментированного этого. Более того, я хочу, чтобы моя основная функция клиента проверяла, когда обратное сообщение является конкретным двумя. Как я могу создать метод, ожидающий определенного сообщения с сервера, и тем временем он блокирует основные функции.
static EventLoopGroup workerGroup = new NioEventLoopGroup();
static Promise<Object> promise = workerGroup.next().newPromise();
public static void callClient() throws Exception {
String host = "localhost";
int port = 8080;
try {
Bootstrap b = new Bootstrap();
b.group(workerGroup);
b.channel(NioSocketChannel.class);
b.option(ChannelOption.SO_KEEPALIVE, true);
b.handler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new RequestDataEncoder(), new ResponseDataDecoder(), new ClientHandler(promise));
}
});
ChannelFuture f = b.connect(host, port).sync();
} finally {
//workerGroup.shutdownGracefully();
}
}
Я хочу, чтобы внутри основной функции вызывал метод и возвращал результат, а когда ему было 2, чтобы продолжить основные функции. Тем не менее, я не могу вызвать callClient внутри while, так как он будет запускать несколько раз один и тот же клиент.
callBack();
while (true) {
Object msg = promise.get();
System.out.println("Case1: the connected clients is not two");
int ret = Integer.parseInt(msg.toString());
if (ret == 2){
break;
}
}
System.out.println("Case2: the connected clients is two");
// proceed with the main functionality
Как обновить переменную обещания для первого клиента. Когда я запускаю двух клиентов, для первого клиента я всегда получал сообщение:
Случай 1: подключенные клиенты не два
кажется, что обещание не обновляется нормально, а для второго клиента я всегда получал:
Случай 2: подключенные клиенты - это два