thuGG Opublikowano 28 Sierpnia 2005 Zgłoś Opublikowano 28 Sierpnia 2005 Witam, mam nastepujacy problem: Mam klase (Zapytanie), na ktora sklada sie kilka pol typu String i tablica 10 elementowa typu boolean, przesylam obiekt tego typu do serwera, ktory serwer rzutuje z typu Object na Zapytanie. Problem w tym, ze zawartosc tablicy boolean po odebraniu przez serwer jest inna niz ta ktora wyslal serwer. Wszystko dziala na soketach w standardowy sposob (tak jak to opisuja w ksiazkach). Czy ktos cos wie o tym moze. Uzywam java v1.5.0_02 Z gory dziekuje za odpowiedzi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Contrast Opublikowano 28 Sierpnia 2005 Zgłoś Opublikowano 28 Sierpnia 2005 Napisalem kiedys aplikacje typu klient serwer na javie. Kazda klasa dziedziczy defoultowo z klasy object, rzutowanie z typu object na typ zapytanie jest tu niepotrzebne. Nie kazdy object jest zapytaniem ale kazde zapytanie jest objectem. Nie pamientam dokladnie funkcji socketu ale najprawdopodobniej jest to cos w stylu : funkcja read zwraca object: ServerSocket socket1 = new ServerSocket();//najprawdopodobniej konstruktor klasy ServerSocket przyjmuje jakies //datkowe parametry jak naprzyklad string z nazwa URL lub adresem IP//ale nie jestem pewien bo moze istniec metoda GetUrlName lub jeszcze //lub jeszcze cos zwiazanego z InetAdress ale nie pamietam , nie w tym rzecz//wieczapytanie nowe = socket1.read();//a niezapytanie nowe = (zapytanie)socket1.read(); Wiem z dowiadczenia ze rzutowania typow powinno sie urzywac tylko gdy jest naprawde potrzebne a w tym przypadku jest zbedne. A rzutowanie calych klas to dosc skomplikowany mechanizm , wiesz w prostym przypadku rzutowania integer na string zawszezyskasz poprawny wynik ale przy klasach to juz jest problem , istnieje interfejs serializable z ktorym proponowal bym sie zapoznac rownierz.. Powodzenia na JAVIE Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
thuGG Opublikowano 29 Sierpnia 2005 Zgłoś Opublikowano 29 Sierpnia 2005 Moze ja wkleje fragmenty kodu, wtedy bedzie wiadomo co i jak: Aha i zaznaczam ze jestem poczatkujacym programista. serwer: public class WatekSerwera extends Thread{ private Socket socket; private OperacjeBazy operacje; private ObjectInputStream input; private ObjectOutputStream output; public WatekSerwera(Socket s,OperacjeBazy op){ socket=s; operacje=op; try { input=new ObjectInputStream(socket.getInputStream()); output=new ObjectOutputStream(socket.getOutputStream()); } catch (IOException e) { e.printStackTrace(); } wyslijListeBranz(); start(); } public void run() { try { while(true) { Object o=input.readObject(); //czytanie obiektu if (o!=null && o instanceof Instytucja){ odpowiedz((Instytucja)o); // rzutowanie } } } catch (IOException e) { System.out.println("rozlaczono"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { socket.close(); System.out.println("zamknieto watek serwera"); } catch (IOException e) { e.printStackTrace(); } } public void odpowiedz(Instytucja i){ try { ArrayList <Instytucja> lista=operacje.szukajUsun(i,false); System.out.println("rzmr "+lista.size()); output.writeObject(lista); output.flush(); } catch (NullPointerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void wyslijListeBranz(){ try { Set<String> lista=operacje.zwrocListeBranz(); output.writeObject(lista); output.flush(); } catch (NullPointerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } To klient: public class Klient extends Thread{ ObjectOutputStream output; ObjectInputStream input; Okno okno; InetAddress addr; Socket socket; public Klient(Okno o){ okno=o; } public void polacz(){ try { addr=InetAddress.getByName("localhost"); socket=new Socket(addr,12293); output=new ObjectOutputStream(socket.getOutputStream()); input=new ObjectInputStream(socket.getInputStream()); new WatekKlienta(socket,okno,input); System.out.println("polaczono"); } catch (ConnectException c){ System.out.println("nie polaczono"); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void wyslijZapytanie(Instytucja i){ try { output.writeObject(i); //wyslanie obiektu output.flush(); } catch (IOException e) { System.out.println("Polaczenie z serwerem zostalo zerwane, serwer nie odpowiada"); } } } A to klasa, ktorej obiekt przesylam do serwera, ktory to wlasnie jest inny po przeslaniu: public class Instytucja implements Serializable{ private static final long serialVersionUID = 1L; public String rodzaj=""; public String branza=""; public String nazwa=""; public String miasto=""; public String ulica=""; public String nrDomu=""; public String nrLokalu=""; public String telefon1=""; public String telefon2=""; public String fax=""; public Boolean[] tab=new Boolean[10]; public Instytucja (){ } public Instytucja(String rodzaj,String branza,String nazwa,String miasto,String ulica,String nrDomu, String nrLokalu,String telefon1,String telefon2,String fax,Boolean[] tab){ this.rodzaj=rodzaj; this.branza=branza; this.nazwa=nazwa; this.miasto=miasto; this.ulica=ulica; this.nrDomu=nrDomu; this.nrLokalu=nrLokalu; this.telefon1=telefon1; this.telefon2=telefon2; this.fax=fax; this.tab=tab; } public Instytucja(String rodzaj,String branza,String nazwa,String miasto,String ulica,String nrDomu, String nrLokalu,String telefon1,String telefon2,String fax){ this.rodzaj=rodzaj; this.branza=branza; this.nazwa=nazwa; this.miasto=miasto; this.ulica=ulica; this.nrDomu=nrDomu; this.nrLokalu=nrLokalu; this.telefon1=telefon1; this.telefon2=telefon2; this.fax=fax; } public String toString(){ String tmp=""; return tmp=nazwa+" | "+branza+" | "+rodzaj; } } Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Contrast Opublikowano 29 Sierpnia 2005 Zgłoś Opublikowano 29 Sierpnia 2005 Nie moge dzis odpidac ale widze kilka subtelnych bledow ktore moga wplynac na zawartosc tablicy booleanow tab . przeczytaj moj poprzedni watek i popatrz u siebie w kod przy porownywaniu do instanceof. Jesli ci to nie pomorze to w nocy napisze o co chodzi , choc nie mam kompilatora przy sobie ale sproboje pomoc Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
thuGG Opublikowano 29 Sierpnia 2005 Zgłoś Opublikowano 29 Sierpnia 2005 (edytowane) Ale wlasnie po to jest instaneof, sprawdza czy obiekt ktory został odebrany jest wlasciwego typu, robie rzutowanie dopiero po upewnieniu sie ze rzutowanie sie powiedzie. Przecierz nie moge zrobic czegos takiego: "Instytucja i=input.readObject()" bo kompilator mi tego nie przepusci bez rzutowania, a ty widze sugerujesz zebym tak wlasnie zrobil. Pozdro Edit: Sprawa rozwiazana, probem tkwil w buforowaniu strumienia, sprawe zalatwil dodatkowy konstruktor w klasie Instytucja: public Instytucja (Instytucja i){ tab = i.tab.clone(); } Podziekowania dla mojego w wykladowcy z PŚK. Edytowane 30 Sierpnia 2005 przez thuGG Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...