Создать прослушиватель для ответа сокета сервера? - PullRequest
1 голос
/ 21 августа 2011

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

Вот сервер:

public class TestServer {

public static void main(String[] args) throws Exception {

    TestServer myServer = new TestServer(); 
    myServer.run(); 

}

private void run() throws Exception {

    ServerSocket mySS = new ServerSocket(4443);     

    while(true) {

        Socket SS_accept = mySS.accept(); 

        BufferedReader myBR = new BufferedReader(new InputStreamReader(SS_accept.getInputStream()));

        String temp = myBR.readLine(); 
        System.out.println(temp); 


        if (temp!=null) {

            PrintStream serverPS = new PrintStream(SS_accept.getOutputStream()); 
            serverPS.println("Response received: " + temp); 

        }

    }
}

}

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

Вот что я пытаюсь на стороне клиента:

protected static String getServerResponse() throws IOException {

    String temp;
    try {
        BufferedReader clientBR = new BufferedReader(new InputStreamReader(mySocket.getInputStream())); 
        temp = clientBR.readLine(); 
    } catch (Exception e) {
        temp = e.toString(); 
    }

    return temp; 
}

И просто для справки, да, отправка данных с клиента на сервер работает нормально (это данные System.out правильно). Однако, когда я вызываю вышеупомянутую функцию, чтобы попытаться получить ответ сервера, он просто вешает мое приложение, которое является приложением Android в случае, если это уместно.

Что я хочу от функции, так это просто спросить у сервера, есть ли у меня данные для меня, и получить их, а если нет, то не ломать мое чертово приложение.

1 Ответ

1 голос
/ 22 августа 2011

На стороне клиента создайте класс ConnectionManager, который будет обрабатывать все операции ввода-вывода сокетов.Метод ConnectionManager connect() создаст и запустит новый поток, который будет прослушивать ответы сервера.Как только он получит ответ, он уведомит всех зарегистрированных слушателей ConnectionManager.Поэтому для получения асинхронных ответов сервера вам необходимо зарегистрировать прослушиватель в ConnectionManager, используя его метод register(SomeListener).

Также вы можете взглянуть на JBoss Netty , которыйэто асинхронная основанная на событиях инфраструктура сетевых приложенийЭто значительно упрощает и упрощает сетевое программирование, такое как сервер сокетов TCP и UDP.

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