Jak wywoływać funkcje na rzecz obiektu?

0

hej.
Mój projekt dotyczy przesyłania serializowanych obiektów w aplikacji okienkowej.
Mój klient:

public  class Klient extends JFrame
{ private Socket socket;
 ObjectOutputStream OOS=null;
    ObjectInputStream OIS=null;
    Klient() {
        try {
        socket = new Socket("localhost", 2020);
        System.out.println("Klient dziala: ");
        } catch (IOException e) {
            System.out.println("Uruchom serwer: " + e);
            System.exit(1);
        }
    }
    
    public static void main(String[] args) throws Exception 
{   /*String nazwaPliku="E:\\Pliczek.txt";
        Towar t1=new Towar("123","nazwa",234,"producent");
 Magazyn m1  = new Magazyn();
 m1.dodaj(t1);
 //tutaj wywołanie funkcji na rzecz obiektu m1 tj. zapis tablicy do pliku oraz odczytanie z pliku      
 m1.dopiszPlik(nazwaPliku);
m1.odczytajPlik(nazwaPliku);

Klient okno = new Klient("Zarzadzanie magazynem");    
  {  //okno.init();   
    okno.setVisible(true);  
   okno.pack();
    Klient client = new Klient();
        client.uruchom();
} 
     void uruchom() throws Exception {
        String messageFromServer = null;

OIS = new ObjectInputStream(socket.getInputStream());
OOS = new ObjectOutputStream(socket.getOutputStream());
//powyżej utworzenie strumieni. 
 }
 
 Klient(String tytul) {   super(tytul);  } 
 
 void init() {  //tutaj jakies przyciski, pola do wyswietlania itp. } 

Klasa Serwer:

package klasy;

public class Serwer {
    int serverPort = 2020;
    ServerSocket SerwerSoketSerwera;
    Socket socketDoKlienta;
 
    ObjectInputStream OIS=null;
    ObjectOutputStream OOS=null;

    Serwer() {
        try {
           
            SerwerSoketSerwera = new ServerSocket(serverPort);
            System.out.println("Serwer dziala");
        } catch (IOException e) {
            System.out.println("Nie można utworzyć gniazda");
            System.exit(1);
        }
    }

    public static void main(String args[]) throws Exception {
        Serwer server = new Serwer();
        server.uruchom();
        server.SerwerSoketSerwera.close();
    }

    void uruchom() throws Exception {
        socketDoKlienta = SerwerSoketSerwera.accept();

OIS = new ObjectInputStream(socketDoKlienta.getInputStream());
OOS= new ObjectOutputStream(socketDoKlienta.getOutputStream());
        }
      SerwerSoketSerwera.close();
}

Mam nadzieje że nie pousuwałem potrzebnych rzeczy.
Nazwy socketów są dosyć jasne ;)
Teraz bardzo ważne pytanie jak użyć tych strumieni? Funkcje na plikach/tablicach (odczyt/zapis)obiektów serializowanych to dopiszPlik() i odczytajPlik() ale nie bardzo wiem jak tablice obiektów wysłać przez strumień oraz jak z takiego strumienia odebrać i np zapisac do zmiennej? jak użyć funkcji writeObject albo readObject i ewentualnie podpiąć ją pod przycisk? Bardzo proszę o jakiś zrozumiały przykład.

0

Jest kilka sposobów wysyłania (i odbierania):
pętla po tablicy, jest drobny problem przy odczycie - nie wiesz ile obiektów odczytać,

zastąpić tablicę kolekcją - jeśli klasa Towar implementuje interfejs Serializable, to obiekty typu ArrayList<Towar> też można serializować,

utworzyć serializowalną tablicę

import java.io.*;

public class SerializedArray implements Serializable 
{
    private Towar[] array = null;
    //-------------------------
    public SerializedArrayTowar[] array)
    {
        this.array = array;
    }
    //-------------------------
    public void setArray(Towar[] array)
    {
        this.array = array;
    }
    //-------------------------
    public Towar[] getArray()
    {
        return array;
    }
}``` 
0
Eryk17 napisał(a):

Mój klient:

public  class Klient extends JFrame
{ 
//.....
}

Pytanie z innej beczki. Dlaczego Twoja klasa klienta rozszerza JFrame? ;)
Nie ma to żadnego związku logicznego, dlatego jeśli serwer masz ładnie oddzielony, to radzę to samo zrobić z klientem.

0

@Edit:
serwer przesyła tak jak powinien i jest wszystko fajnie.
Mam jeszcze problem z wysyłaniem obiektów np. obiektu typu Magazyn w którym znajduje się tablica typu Towar.
próbując wykonać funkcje:

OOS.writeObject(m1);

wyskakuje mi błąd: "methond WriteObject in class ObjectOutputStream cannot be applied to given types"
Pytanie jak wysłać obiekt m1 typu Magazyn w którym znajduje się tablica Towar tab[] oraz jak to odczytać?
oczywiście przez funkcje readObject() i writeObject()

0

Wie ktoś może co jest nie tak z tym kodem?


 
public  class Klient extends JFrame
{  
    BufferedReader klawiatura;
    PrintWriter out;
    private Socket socketKlienta;
    private BufferedReader in;
    ObjectOutputStream OOS=null;
    ObjectInputStream OIS=null;
     Magazyn m1  = new Magazyn();
       String nazwaPliku="E:\\Pliczek.txt";
    Klient() {
        try {
        socketKlienta = new Socket("localhost", 2020);
        System.out.println("Klient dziala: ");
        } catch (IOException e) {
            System.out.println("Uruchom serwer: " + e);
            System.exit(1);
        }
    }
    
    public static void main(String[] args) throws Exception 
{  

    /////////////////////////////////////////////////////////////
    Klient okno = new Klient("Zarzadzanie magazynem");    
    //okno.init();   
    okno.setVisible(true);  
   okno.pack();
    Klient client = new Klient();
        client.uruchom();
} 
     void uruchom() throws Exception {
        String messageFromServer = null;
//////////////////////////////////////////////////////////////////////////////
//tutaj dzialamy
OIS = new ObjectInputStream(socketKlienta.getInputStream());
//OOS = new ObjectOutputStream(socketKlienta.getOutputStream());
m1 = (Magazyn)OIS.readObject();
m1.wyswietl();


    }
 
 Klient(String tytul) {   super(tytul);  } 
 
 } 

    
    }
  

serwer:

package klasy;

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

public class Serwer {
    int serverPort = 2020;
    ServerSocket SerwerSoketSerwera;
    Socket socketDoKlienta;
   
    BufferedReader klawiatura;
    PrintWriter out;
    private BufferedReader in;
  Magazyn m3 = new Magazyn();
  String nazwaPliku="E:\\Pliczek.txt";
    ////////////////////////////////////////////
    ObjectInputStream OIS=null;
    ObjectOutputStream OOS=null;
    
   /////////////////////////////////////////////// 
   
//Magazyn m1 = new Magazyn();

    /* Konstruktor próbuje utworzyć gniazdo */
    Serwer() {
        try {
           
            SerwerSoketSerwera = new ServerSocket(serverPort);
            System.out.println("Serwer dziala");
        } catch (IOException e) {
            System.out.println("Nie można utworzyć gniazda");
            System.exit(1);
        }
    }

    public static void main(String args[]) throws Exception {
        Serwer server = new Serwer();
        server.uruchom();
        server.SerwerSoketSerwera.close();
    }

    void uruchom() throws Exception {
        socketDoKlienta = SerwerSoketSerwera.accept();
//////////////////////////////////////////////////////////////////////////////
OOS = new ObjectOutputStream(socketDoKlienta.getOutputStream());
//OIS = new ObjectInputStream(socketDoKlienta.getInputStream());
m3.odczytajPlik(nazwaPliku);
//m3.wyswietl();
OOS.writeObject(m3);


    }
}

Mój wynik:

run:
Klient dziala: 
Exception in thread "main" java.net.SocketException: Connection reset
	at java.net.SocketInputStream.read(SocketInputStream.java:210)
	at java.net.SocketInputStream.read(SocketInputStream.java:141)
	at java.net.SocketInputStream.read(SocketInputStream.java:224)
	at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2598)
	at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2905)
	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2915)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1502)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2245)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2169)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2027)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1535)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:422)
	at klasy.Klient.uruchom(Klient.java:77)
	at klasy.Klient.main(Klient.java:69)

Błąd jest ten o tyle dziwny, że występuje tylko wtedy gdy przesyłam tylko obiekt typu Magazyn.
Jeżeli prześle przed tym obiektem coś typu np int a następnie typu Magazyn to działa idealnie. Dlaczego?
serwer:

OOS = new ObjectOutputStream(socketDoKlienta.getOutputStream());
//OIS = new ObjectInputStream(socketDoKlienta.getInputStream());
OOS.writeObject(1);
m3.odczytajPlik(nazwaPliku);
//m3.wyswietl();
OOS.writeObject(m3);

klient

OIS = new ObjectInputStream(socketKlienta.getInputStream());
//OOS = new ObjectOutputStream(socketKlienta.getOutputStream());
Object o1=OIS.readObject();
m1 = (Magazyn)OIS.readObject();

m1.wyswietl();

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