Получить InputObjectStream из потока - PullRequest
0 голосов
/ 01 ноября 2018

Я делаю приложение чата на Java.

У меня есть класс с именем Client, с несколькими методами, которые могут отправлять запрос на мой сервер и ждать ответа. Раньше я делал это:

public  boolean  authenticate(String login, String password) throws ResponseException{
    try {
        AuthentificationRequest req = new AuthentificationRequest(login,password);
        this.out.writeObject(req);
        this.out.flush();

        Response rep=this.readResponse();

...

Но я меняю способ получения ответов от сервера. Теперь я использую поток с именем ResponseHandler:

public void run() {
    // TODO Auto-generated method stub
    Response rep = new Response();
    try {       
        while (!Thread.currentThread().isInterrupted()) {
            this.isResponseReceived=false;
            this.setResponse((Response) in.readObject()) ;
            synchronized(this) {
                this.isResponseReceived=true;
                notify();   
            }

Это мой новый метод "readResponse":

public   Response readResponse(Request req) throws ClassNotFoundException, IOException, InterruptedException {
    synchronized(this.responseHandler) {

        while(!this.responseHandler.isResponseReceived()) {
            this.out.writeObject(req);      
            wait(); 
        }
    }
    this.out.flush();
    return this.responseHandler.getResponse();
}

А это мой новый код клиента для предыдущего примера:

public  boolean  authenticate(String login, String password) throws ResponseException{
    try {

        Response rep = this.readResponse(new AuthentificationRequest(login,password));

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

Спасибо за ваш отзыв

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

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

В моем классе клиента: public Response readResponse (Request req) выбрасывает ClassNotFoundException, IOException, InterruptedException { Ответ rep = null;

    synchronized(this.in) {
        this.out.writeObject(req);  
        while(!this.responseHandler.isResponseReceived()) {
             rep = this.responseHandler.getResponse();
             in.notify();   
        }
    }
    this.out.flush();
    return rep;
}

И в моем методе выполнения класса ResponseHandler:

synchronized(this.in){
                        wait();
                        this.isResponseReceived=true;
                        System.out.println("thread unlocked");
                    }
0 голосов
/ 01 ноября 2018

Вы не опубликовали полный код. Могут быть разные проблемы. Возможно, что без очистки запрос не будет отправлен. Другая проблема в вашем методе readResponse заключается в том, что вы неоднократно отправляете один и тот же цикл запроса int при получении уведомления.

Измените метод readResponse:

    public   Response readResponse(Request req) throws ClassNotFoundException, IOException, InterruptedException {
        synchronized(this.responseHandler) {
//send the req immediatelly
                this.out.writeObject(req);    
                this.out.flush();  
               //wait for response
            while(!this.responseHandler.isResponseReceived()) {
                this.responseHandler.wait(); 
            }
        }       
        return this.responseHandler.getResponse();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...