LINUX.ORG.RU

Java seriarizable + socket


1

2

Добрый день! Пилю я тут в целях самообразования многопоточный сервер сообщений («ненужно!»), предполагаю передавать данные от клиента серверу и обратно как сериализованные объекты. Но что то ниего не получается. Строки и даты - получается, свои объекты - нет. Делаю все это впервые. Полностью проект на гитхабе
Основная часть сервера

package org.svgroz.client_listner;

import org.svgroz.notification.IObserver;
import org.svgroz.notification.ISubject;

import java.io.*;
import java.net.Socket;
import java.util.Date;

import org.apache.log4j.Logger;

public class ClientListener extends Thread implements IObserver {
    private Socket client;
    private ISubject subject;
    private Logger logger;

    public ClientListener(Socket client, ISubject subject) {
        this.client = client;
        this.subject = subject;
        logger = Logger.getLogger(ClientListener.class.getName());
    }

    public void update(String message){
        try {
            PrintWriter writer = new PrintWriter(client.getOutputStream(), true);
            writer.println(message);
        }
        catch (Exception exception) {
            logger.error(exception.getMessage());
        }
    }

    @Override
    public void run () {
        try {
            ObjectInputStream objectInputStream = new ObjectInputStream(client.getInputStream());
            Date message;
            while ((message = (Date)objectInputStream.readObject()) != null) {
                logger.info(message);
            }
            objectInputStream.close();
            this.subject.removeObserver(this);
        }
        catch (IOException exception) {
            logger.warn(exception.getMessage());
        }
        catch (Exception exception) {
            logger.error(exception.getMessage());
            exception.printStackTrace();
        }
        finally {
            try{
                client.close();
                logger.info("Connection closed");
            } catch (IOException exception){
                logger.error(exception.getMessage());
            }
        }
    }
}
Ну и простой клиент.
package org.svgroz;

import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.channels.SocketChannel;
import java.util.Date;

public class EchoClient {
    public static void main(String[] args) throws IOException {

        String hostName = "localhost";
        int portNumber = 4444;

        try{
            SocketChannel socketChannel = SocketChannel.open();
            socketChannel.connect(new InetSocketAddress(hostName, portNumber));
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socketChannel.socket().getOutputStream());
            Date message = new Date();
            Thread.sleep(1000);
            objectOutputStream.writeObject(message);
        } catch (Exception e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}

«ненужно!»

Более того, эталонное.

anonymous ()
ClientListener(...) {
update(...){
run () {

Похоже, ты не можешь найти в себе дзен.

anonymous ()
try {
  ...
}
catch (Exception exception) {
try{
  ...
} catch (IOException exception){

Туда же.

anonymous ()

Какое исключение кидает-то?

CARS ★★★★ ()
Ответ на: комментарий от dr_mariarti

А поподробнее? Какая строчка? Что посылается? Как я понял по описанию, приведенный код должен работать. Какой не работает?

anonymous ()
Ответ на: комментарий от anonymous

Приведенный код работает, да. Даты и строки пересылаются. Но банальный

public class Message implements Serializable {
    private Integer version;
    private String message;

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
уже нет.

dr_mariarti ()
Ответ на: комментарий от anonymous

Да, этот класс есть в обоих приложениях, он одинаков вплоть до пробелов.

Message message;
            while ((message = (Message)objectInputStream.readObject()) != null) {
                logger.info(message.getMessage());
            }
И этот вариант уже все, не работает.

dr_mariarti ()
Ответ на: комментарий от dr_mariarti

В приведённом тобой коде клиента шлётся дата. Приведи пример с нужным классом.

Hater ★★ ()
Ответ на: комментарий от Hater

Они должны быть одинаковые?... Ох черт, если да, то тогда вопрос закрыт. Простите. Спасибо.

dr_mariarti ()
Ответ на: комментарий от dr_mariarti

Ну а как ты себе представляешь поиск нужного для десериализации класса?) В разных пакетах с таким именем может быть сколько угодно классов.

Hater ★★ ()

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

anonymous ()
Ответ на: комментарий от anonymous

Не то, чтобы я советовал так делать, конечно же.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.