Я на самом деле программирую программу клиент-сервер, используя Netty, но я застрял в проблеме, которую не могу решить с прошлой недели.Ввод Java на стороне клиента netty
Поскольку это довольно большая программа, я не могу вставить весь мой код, но я начал использовать этот пример из GitHub Нетти (в https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example/securechat)
В контексте игры, я хотел бы, чтобы позволить игроку набрать каждой команде, которую он любит (чтобы изменить свое имя или посмотреть, что происходит), но дело в том, что во время процесса ввода я не могу получить ответ сервера.
Ответ сервера получен с помощью обратного вызова:
public class ClientHandler extends SimpleChannelInboundHandler<String> {
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
System.out.println(cause.getMessage());
ctx.close();
System.exit(84);
}
@Override
public void channelRead0(ChannelHandlerContext arg0, String answer) throws Exception {
// HERE
}
}
И в моем главном цикле я на самом деле делать это (я упростил его, потому что это слишком долго):
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
line = in.readLine();
// Process and send to server
System.out.println(line);
Когда я ожидая ввода пользователя и получая ответ сервера одновременно, вход блокирует мой обратный вызов. Я получаю его только при выполнении ввода.
Может кто-нибудь просветить меня, пожалуйста? Как я могу начать делать неблокирующий ввод или что-то еще, когда сервер отправляет мне что-то, я могу остановить процесс ввода и прочитать ответ?
Спасибо!
Я немного смущен. Вы получаете ответ от сервера до того, как пользователь сделал ввод? –
На самом деле, когда я делаю «line = in.readLine()», я, скорее всего, получаю ответ с сервера, но я не могу его получить. Пример: есть 5 игроков. Игрок 5 играет, и я набираю что-то для отправки на сервер. Когда игрок заканчивает свой ход, игра (по какой-либо причине) закончена: игра должна начинаться с самого начала и уведомлять всех игроков. Но так как игрок 1, 2, 3 и я застревают в процессе readLine(), мы НЕ можем получить уведомление сервера (обратный вызов не вызывается, но обычно он должен). Мы получим его только тогда, когда мы передадим часть readLine. – NPanda
http://stackoverflow.com/questions/40668791/how-can-a-netty-server-cancel-receiving-a-response-from-a-web-server Это может вам помочь. –