Przesylanie serializowanych obiektow (sockets)

0

Hej,

Piszę aplikację typu klient-server i mam potrzebę przesyłania między klientem, a serwerem serializowanych obiektów. Gdy klient i serwer są odpaleni jako dwa różne wątki tej samej aplikacji to wszystko jest ok. Niestety, gdy klient zaimplementowany jest w jednej aplikacji, a serwer w drugiej to przy próbie czytania obiektu przez serwer z ObjectInputStream za każdym razem dostaję wyjątek ClassNotFoundException.

Oto przykładowy kod (dla czytelności wyrzuciłem znaczną część obsługi wyjątków):

Serwer:

public void createServer() throws Exception 
{
        ServerSocketChannel server = null;
        ObjectInputStream ois = null;
        SocketChannel socket = null;

        server = ServerSocketChannel.open();
        server.socket().bind(new InetSocketAddress(7777));
        socket = server.accept();
        
        System.out.println("Nowe polaczenie przychodzace");
        ois = new ObjectInputStream(socket.socket().getInputStream());

        try
        {
            Object obj = ois.readObject();  // <-- tutaj mi wywala ClassNotFoundException
        }
        catch (ClassNotFoundException e)
        {
            System.out.println("ClassNotFound");
        }
        catch (Exception e)
        {
            System.out.println("Other exception");
        }

        socket.close();
        ois.close();
        server.close();
}

I kod klienta przesyłającego obiekty do serwera (znajdującego się w innej aplikacji):

public void createClient() throws Exception
{
    SocketChannel socket = null;
    ObjectOutputStream oos = null;

    socket = SocketChannel.open(new InetSocketAddress(7777));
    oos = new ObjectOutputStream(socket.socket().getOutputStream());
        
    oos.writeObject(new SomeClass());  // <-- dowolna klasa zdefiniowana wewnatrz aplikacji klienta (impl Serializable)
    oos.flush();

    oos.close();
    socket.close();
}
0

I klient i serwer musza miec definicje klas ktore sa serializowane. Jak masz 1 program to oczywiscie te klasy masz dla obu; jak masz 2 osobne programy, to musisz obie klasy dodac do obu projektow. Aby uniknac duplikacji, najlepiej zrobic dodatkowy projekt, 'common' czy podobny, i dodac go jako zaleznosc dla 2 pozostalych - w ten sposob gdy zmieniasz serializowane klasy robisz to tylko raz.

0

Solved. Dzięki za poradę, zadziało i w sumie nawet jest logiczne : ) Cóż, java nie jest językiem do którego pałam jakąś szczególną miłością.

1 użytkowników online, w tym zalogowanych: 0, gości: 1