ObjectOutputstream / ObjectInputStream не отправляется каждый раз - PullRequest
0 голосов
/ 27 мая 2018

Я новичок в сетевом программировании, и я делаю чат-программу в Java.Сначала я использовал DataOutputStream, и он работал нормально, но я подумал, что было бы более аккуратно, если бы я использовал Object Streams, позволяя мне отправлять пользовательскую информацию.Дело в том, что ObjectOutPutStream не отправляет каждый раз для меня.На самом деле он имеет регулярную схему отправки каждый третий раз.То же самое относится и к сообщениям сервера, клиент получает их каждый третий раз.

Вот код:

Сторона клиента:

public void start() throws IOException{ 
    output = new ObjectOutputStream(socket.getOutputStream());

    if (thread == null) {
        client = new ChatClientThread(this, socket);
        thread = new Thread(this);
        thread.start();
    }

}

public void sendMessage(String msg){
    try {
        output.writeObject(new Message(msg));
        output.flush();
    }catch (IOException ioe) {
        System.out.println("Sending error: " + ioe.getMessage());
        stop();
    }
}

Сторона сервера:

public void run() {
    System.out.println("Server Thread " + ID + " running.");
    while (true) {
        try {
            if(streamIn.readObject() instanceof Message){
                System.out.println((Message)streamIn.readObject());
                server.handleMessage(ID, (Message)streamIn.readObject());
            }   
        }catch (IOException ex) {
                System.out.println("Listening error: " + ex.getMessage());
                server.remove(ID);
        } catch (ClassNotFoundException ex) {
                System.out.println("Class was not found");
        }

    }


}
public void open() throws IOException {
    streamOut = new ObjectOutputStream(socket.getOutputStream());

    streamIn = new ObjectInputStream(socket.getInputStream());
}

Есть идеи, почему это происходит?

1 Ответ

0 голосов
/ 27 мая 2018

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

Попробуйте переписать код вашего сервера следующим образом:

    System.out.println("Server Thread " + ID + " running.");
    while (true) {
        try {
            Object message = streamIn.readObject();
            if (message instanceof Message) {
                System.out.println((Message) message);
                server.handleMessage(ID, (Message) message);
            }
        } catch (IOException ex) {
            System.out.println("Listening error: " + ex.getMessage());
            server.remove(ID);
        } catch (ClassNotFoundException ex) {
            System.out.println("Class was not found");
        }

    }

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

Также я бы добавил блок else с сообщением регистрации, которое по какой-то причине не является экземпляром Message.И распечатывать фактические исключения с помощью stacktrace в catch блоках.

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