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.
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.
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.