Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ObjectOutputStream - NotSerializableException??? 
V
    Опции темы
Killer_13
Дата 10.5.2012, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Здравствуйте, вот такая беда у меня, копался чуток в инете, есть темы похожие, но мне не получается.
Вот здесь есть похожее http://cloud-cuckoo.com.ua/content/java-se...jectinputstream

Кто сталкивался подскажите пож!!!

Пробую сделать многопоточный сервер. Пока все получается, но мне нужно передать на клиенты объект через который они будут общаться. 
При попытке передачи такого объекта, я получаю  NotSerializableException - что нужно сериализировать, зачем? Спасибо!

Код

this.oOutputStream.writeObject(sendOutputStreamObject);
 
Клиент посылает название сервера главному серверу.
Код

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class CHClient{

    private String serverName;
    private final int PORT = 8888;

    private ObjectInputStream oInputStream;
    private ObjectOutputStream oOutputStream;

    public CHClient(String serverName) throws IOException {

        this.serverName = serverName;

        Object[] inputStreamObject = null;
        String oInputStreamParam1;
        Object[] outputStreamObject = { this.serverName };

        InetAddress addr = InetAddress.getByName(null);
        System.out.println("addr = " + addr);
        Socket socket = new Socket(addr, PORT);
        try {
            System.out.println("socket = " + socket);

                this.oOutputStream = new ObjectOutputStream(socket.getOutputStream());
                this.oOutputStream.writeObject(outputStreamObject);

                this.oInputStream = new ObjectInputStream(socket.getInputStream());

                inputStreamObject = (Object[]) this.oInputStream.readObject();

                oInputStreamParam1 = inputStreamObject[0].toString();

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            System.out.println("closing...");
            socket.close();
        }
    }
}

 
Сервер смотрит если сервера с таким именем еще нет - создает и возвращает объект(должен возвращать), Все работает, но как только суну в Стрим объект типа ChessMultiServerThread - вылетает  NotSerializableException!
Код

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class ChessServer {
    private static final int PORT = 8888;
    private Socket socket;

    private ServerSocket serverSocket = null;
    private ArrayList<String> servers = new ArrayList<String>();
    private boolean isServerExist;

    private ObjectInputStream oInputStream;
    private ObjectOutputStream oOutputStream;

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

        new ChessServer();
    }

    public ChessServer() {
        Object[] inputStreamObject;
        Object outputStreamServerNameObj = null;
        Object outputStreamChMultiServObj = null;
        String oInputStreamParam1;

        System.out.println("Server Started");

        try {
            serverSocket = new ServerSocket(PORT);
            do {
                this.socket = serverSocket.accept();
                this.oInputStream = new ObjectInputStream(socket.getInputStream());

                inputStreamObject = (Object[]) this.oInputStream.readObject();
                this.oOutputStream = new ObjectOutputStream(socket.getOutputStream());
                oInputStreamParam1 = inputStreamObject[0].toString();

                isServerExist = isServerExist(oInputStreamParam1);

                if (!isServerExist) {
                    ChessMultiServerThread serverOne = new ChessMultiServerThread(socket);
                    outputStreamServerNameObj = new String("newServer");
                    outputStreamChMultiServObj = serverOne;
                } else {
                    outputStreamServerNameObj = new String("serverExist");
                }

                Object[] sendOutputStreamObject = { outputStreamServerNameObj, outputStreamChMultiServObj };
                this.oOutputStream.writeObject(sendOutputStreamObject);

            } while (true);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                this.serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private boolean isServerExist(String serverName) {

        boolean isExist = this.servers.contains(serverName);
        System.out.println("isExist: " + isExist);
        System.out.println("serverName: " + serverName);
        if (isExist) {
            return true;
        } else {
            this.servers.add(serverName);
            return false;
        }
    }
}

 

Сервер для коммуникации между клиентами.(Только набросок - логика еще не зашита)
Код

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

public class ChessMultiServerThread extends Thread{

    private Socket socket;
    private BufferedReader in;
    private PrintWriter out;


    public ChessMultiServerThread(Socket s) throws IOException {
        socket = s;
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
        start();
    }

    @Override
    public void run() {
        try {
            // while (true) {
            String str = in.readLine();
            // System.out.println("Echoing: " + str);
            out.println(str);
            // }
        } catch (IOException e) {
            System.err.println("IO Exception");
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                System.err.println("Socket not closed");
            }
        }
    }

}


PM MAIL   Вверх
Stolzen
Дата 10.5.2012, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: нет
Всего: 48



Цитата(Killer_13 @  10.5.2012,  14:35 Найти цитируемый пост)
Все работает, но как только суну в Стрим объект типа ChessMultiServerThread - вылетает  NotSerializableException!

Треды нельзя сериализовывать



--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Killer_13
Дата 10.5.2012, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Вопрос следующий, я если я уберу "extends Thread" - я смогу работать с этим объектом как с посредником между двумя клиентами? Тоисть если я передам обоим клиентам этот же объект по идее они должны через него общаться?
Спасибо.
PM MAIL   Вверх
Stolzen
Дата 10.5.2012, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: нет
Всего: 48



Нет. Сокеты, принтеры и ридеры (поля в вашем классе) - тоже неподходящие кандидаты для сериализации.
Что именно вы хотите сделать?


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Killer_13
Дата 14.5.2012, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: нет
Всего: 1



Цитата(Stolzen @  10.5.2012,  17:04 Найти цитируемый пост)
Нет. Сокеты, принтеры и ридеры (поля в вашем классе) - тоже неподходящие кандидаты для сериализации.
Что именно вы хотите сделать? 

Подчитал, разобрался, вопросов больше не имею - глупая затея. smile Зато теперь прекрасно понимаю как работают между собой сервер и клиент.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.