Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   ObjectOutputStream - NotSerializableException??? (http://forum.oszone.net/showthread.php?t=234370)

Killer_13 10-05-2012 14:42 1913438

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

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

Пробую сделать многопоточный сервер. Пока все получается, но мне нужно передать на клиенты объект через который они будут общаться.
При попытке передачи такого объекта, я получаю 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");
                        }
                }
        }

}



Время: 06:40.

Время: 06:40.
© OSzone.net 2001-