2016-12-01 6 views
0

Я на самом деле программирую программу клиент-сервер, используя 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); 

Когда я ожидая ввода пользователя и получая ответ сервера одновременно, вход блокирует мой обратный вызов. Я получаю его только при выполнении ввода.

Может кто-нибудь просветить меня, пожалуйста? Как я могу начать делать неблокирующий ввод или что-то еще, когда сервер отправляет мне что-то, я могу остановить процесс ввода и прочитать ответ?

Спасибо!

+0

Я немного смущен. Вы получаете ответ от сервера до того, как пользователь сделал ввод? –

+0

На самом деле, когда я делаю «line = in.readLine()», я, скорее всего, получаю ответ с сервера, но я не могу его получить. Пример: есть 5 игроков. Игрок 5 играет, и я набираю что-то для отправки на сервер. Когда игрок заканчивает свой ход, игра (по какой-либо причине) закончена: игра должна начинаться с самого начала и уведомлять всех игроков. Но так как игрок 1, 2, 3 и я застревают в процессе readLine(), мы НЕ можем получить уведомление сервера (обратный вызов не вызывается, но обычно он должен). Мы получим его только тогда, когда мы передадим часть readLine. – NPanda

+0

http://stackoverflow.com/questions/40668791/how-can-a-netty-server-cancel-receiving-a-response-from-a-web-server Это может вам помочь. –

ответ

1

Вы должны отделить контур ввода от обработчиков нетти.

Если вы начинаете свой входной цикл игры из обработчика netty, это будет означать, что нити нити не возвращаются к ядру netty, и поэтому ваш канал будет помечен как занятый, что означает, что новые входы будут стоять в очереди, и будет обрабатываться только при возврате потока.

Хороший способ решить эту проблему - создать новый экземпляр потока с самого начала ваших программ и сделать эти методы вызова нити для действий вашей игры.

Смежные вопросы