Тупой вопрос о сокетах Java: могу ли я сделать прослушиватель клиента во входном потоке, пока клиент первым пишет объект? - PullRequest
1 голос
/ 05 мая 2011
InetAddress Address = InetAddress.getByName("172.24.3.154");
            kkSocket = new Socket(Address, 2003);

            out = new ObjectOutputStream(kkSocket.getOutputStream());
            in = new ObjectInputStream(kkSocket.getInputStream());

public static <T> Object sendReceive(T obj) {
    try {

        out.writeObject(obj);
        out.flush();
        System.out.println("Client : " + obj.toString());

        Object resp = in.readObject();
        if (resp != null) {
            System.out.println("Server : " + resp.toString());
        }
        return resp;

    } catch (IOException ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}    

это мой метод Клиента, которым я отправляю запрос на Сервер.

out = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream in = new ObjectInputStream(socket.getInputStream());

        System.out.println("Server: S-a conectat :" + socket.getInetAddress());

        Protocol protocol = new Protocol(server);
while (socket.isClosed() != true) {
Object response = protocol.processInput(in.readObject());
  System.out.println("Server:  message Received: " + getName());
   if (response != null) {
         out.writeObject(response);
          out.flush();
    } else {
          out.writeObject(null);
         out.flush();
    }   
} 

это то, что делает мой сервер. И это тоже работает. Мой вопрос: Предоставляя эту настройку для сокетов, как я могу сделать отдельный слушатель для клиента, чтобы отправить в определенное время одно сообщение клиенту, в то время как клиент все еще функционирует нормально?
Я попытался создать новый поток для управления потоком ввода на стороне клиента, но приложение не запускается и просто застревает в методе выполнения потока
Thx.

РЕДАКТИРОВАТЬ:

То, что я делаю, это многопользовательское приложение с сокетами, использующее многопоточность. У меня есть приведенный выше код, и он работает для меня, для вызова метода «sendReceive» для отправки запроса на сервер, и он что-то возвращает. Что я я пытаюсь сделать, когда я получаю конкретный запрос, я хочу уведомить всех онлайн-клиентов. Я применил шаблон наблюдателя следующим образом: сервер является наблюдаемым, а потоки - наблюдателями. когда поступает конкретный запрос, я уведомляю все шаги, но я не могу t get each threat to send to the clients immediately a message because the client doesn t слушать. Может быть, я поступаю с этим по неправильному пути. Может ли кто-нибудь помочь PLS?

1 Ответ

2 голосов
/ 06 мая 2011

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

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

В подходе с двумя сокетами у вас может быть один поток на сокет, поэтому вам не нужно беспокоиться о блокировке ввода-вывода.

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