Przesyłanie tablicy/plików przez sockety

0

Hej.
Jestem nowy więc jeżeli pisze w złym dziale to przepraszam.
Chciałem zrobić program na zasadzie klient - serwer który będzie się łączył za pomocą socketów (wymagane)
Chciałbym aby klient tworzył tablicę obiektów zdefiniowanych przez użytkownika, a następnie przesyłał ją do serwera.Serwer musi ją odsyłać tak, żeby dało się tablice znów odczytać i edytować.
Nie bardzo wiem, czy lepiej będzie jak klient będzie tworzył tablice i zapisywał ją w pliku a następnie przesyłał sam plik, czy będzie przesyłał całą tablicę a serwer będzie zapisywał tablicę w pliku i w razie potrzeby będzie daną tablicę odczytywał i znów przesyłał do klienta?
Gdyby ktoś mógł mi to w bardzo prosty sposób wyjaśnić (co będzie lepsze i dlaczego) byłbym wdzięczny.

0

Wysyłając coś przez socket, piszesz do OutputStream. Pisząc do pliku też piszesz do OutputStream, więc na pewnym poziomie, z punktu widzenia interfejsu jest to robione tak samo. Dlatego jeżeli masz tablicę (lub lepiej listę) obiektów, to po prostu otwierasz socket, dekorujesz ObjectOutputStream + ew. BufferedOutputStream i po prostu piszesz do niej. Z drugiej strony socketu, pobierasz z niego InputStream, Opakowujesz w ObjectInputStream + ew. BufferedOutputStream i czytasz.

0

natknąłem się na interfejs Seriazable. Mój kod wygląda następująco:
klasa Towar


package klasy;
import java.io.*;
public class Towar implements Serializable
{
    private String ID;
    private String nazwa;
    private float cena;
    private String producent;
                public Towar(String ID, String nazwa, float cena, String producent)
                {
                    this.ID=ID;
                    this.nazwa=nazwa;
                    this.cena=cena;
                    this.producent=producent;
                }
            public Towar()
            {
                ID="brak";
                nazwa="brak";
                cena=0;
                producent="brak";
            }/////////////////////////// ponizej funkcje zmieniające wartosci////////////
        public void zmienCene(float cena)
        {
            this.cena=cena;
        }
        public void zmienNazwe(String nazwa)
        {
            this.nazwa=nazwa;
        }
        public void zmienID(String ID)
        {
            this.ID=ID;
        }
        public void ZmienProducenta(String producent)
        {
            this.producent=producent;
        }
        ////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////ponizej funkcje wyswietlajace poszczegolne wartosci//////////
        public float zwrocCene(){return cena;}
        public String zwrocNazwe(){return nazwa;}
        public String zwrocID(){return ID;}
        public String zwrocProducenta(){return producent;}
}
 
        

Klasa Magazyn


package klasy;
import java.io.*;
public class Magazyn implements Serializable
{
    private int liczbaTowarow;
    private Towar tab[];
    
    public Magazyn()
    {
        tab = new Towar[100];
        liczbaTowarow=0;
    }
    public void dodaj(Towar t)
    {
        tab[liczbaTowarow]=t;
        liczbaTowarow++;
        }
/////////////tutaj funkcje odczytujace tablice  z pliku ///////////
                public void odczytajPlik(String nazwaPliku)throws IOException,ClassNotFoundException
                {
                    ObjectInputStream plik = null;
                    Magazyn m=null;
                    try
                    {
                        plik=new ObjectInputStream(new FileInputStream(nazwaPliku));
                        while(true)
                        {
                            m=(Magazyn)plik.readObject();
                        }
                    }
                    catch(EOFException e)
                            {
                                System.out.println("Koniec pliku");
                            }
                    finally
                    {
                        if(plik!=null)
                            plik.close();
                    }
                }
////////////////////tutaj funkcja dopisujaca do pliku//////////////////////////////////
                public void dopiszPlik (String nazwaPliku, Magazyn m) throws IOException, ClassNotFoundException   
                {//najpierw odczytujemy z pliku to co bylo wczesniej do tablicy
                    Magazyn[] tab = new Magazyn[100];
                    ObjectInputStream plik=null;
                    try
                    {
                        plik = new ObjectInputStream(new FileInputStream(nazwaPliku));
                        int i=0;
                        while(true)
                        {
                            tab[i++]=(Magazyn)plik.readObject();
                        }
 //program przechodzi do konca pliku (do konca) zamyka plik i otwiera w trybie zapisu
 //wpisuje do niego wszystko + to co ma byc dodane

                    }
                    catch(EOFException e)
                           
                            {
                             if(plik!=null)
                                 plik.close();
                            }
                    ObjectOutputStream plik2=null;
                    try
                    {
                      plik2=new ObjectOutputStream(new FileOutputStream(nazwaPliku));
                      //wpisywanie do pliku to co w nim bylo
                      for(int i=0;tab[i]!=null;i++)
                      {
                          plik2.writeObject(tab[i]);
                          plik2.writeObject(m);
                          plik2.flush();
                      }
                    }
                      finally
                      {
                              if(plik2!=null)
                                  plik2.close();
                              }
                        
                    }
                }
   

Niektóre rzeczy wzorowałem się typowo na czyimś przykładzie, chodzi mi bardziej o sprawdzenie poprawności tego programu, wytłumaczenie co jest źle, oraz
czy kod

  public void odczytajPlik(String nazwaPliku)throws IOException,ClassNotFoundException
                {
                    ObjectInputStream plik = null;
                    Magazyn m=null;
                    try
                    {
                        plik=new ObjectInputStream(new FileInputStream(nazwaPliku));
                        while(true)
                        {
                            m=(Magazyn)plik.readObject();
                        }
                    }
                    catch(EOFException e)
                            {
                                System.out.println("Koniec pliku");
                            }
                    finally
                    {
                        if(plik!=null)
                            plik.close();
                    }
                }

nie lepiej zastąpić tym kodem:

 Magazyn []tab = new Magazyn[100];
                    ObjectInputStream plik=null;
                    try
                    {
                        plik = new ObjectInputStream(new FileInputStream(nazwaPliku));
                        int i=0;
                        while(true)
                        {
                            tab[i++]=(Magazyn)plik.readObject();
                        }

Gdyż to pozwoli nam "odczytane" obiekty z pliku przeglądać i edytować gdyż będą znajdować się w tablicy?

Wybaczcie za głupie i trochę ogólne pytania.

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