Могу ли я использовать BufferedReader для Java с прослушивателем событий, а не while (true)? - PullRequest
2 голосов
/ 04 ноября 2011

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

В AS3,мой основной язык, я бы добавил прослушиватель событий в сокет и обработал данные таким образом - но я не могу понять, как бы я это сделал в Java.

В настоящее время мой клиент имеет этокод в нем:

public String send(String message) {
    out.println(message);
    try {
        return in.readLine();
    } catch (IOException ex) {
        return "";
    }
}

В основном я вызываю его, передавая свое сообщение, и оно возвращает ответ сервера.Вместо того чтобы делать это, я хочу отправить туда сообщение, как показано ниже, и получить ответ в другом месте (слушатель события).

public void send(String message) {
    out.println(message);
}

Поскольку я не мог понять, как слушатель событиябудет работать, я подумал об использовании отдельного потока для запуска while(true){in.readLine;}, но я хочу избежать этого, если это вообще возможно;Я не слишком удобен с потоками, и я хочу сделать его максимально простым.

1 Ответ

1 голос
/ 04 ноября 2011

Самый простой способ сделать это - использовать потоки. У меня был бы хотя бы один поток, читающий сокет, который позволяет серверу отправлять сообщение клиенту в любое время.

Проблема со смешанными ответами и событиями заключается в том, что ваш первый блок не будет работать, поскольку «ответ» может быть событием.

Если вы не хотите использовать темы, у вас может быть что-то вроде

// simple but probably not a good idea.
public String send(String message) {
    out.println(message);
    try {
        while(true) {
            String line = in.readLine();
            if (isEvent(line))
               processEvent(line);
            else
               return line;
    } catch (IOException ex) {
        return "";
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...