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
()
Ответ на: комментарий от 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
()

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

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

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

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