Avatar billede bagnavnet Nybegynder
09. december 2004 - 21:41 Der er 28 kommentarer og
1 løsning

eksisterende kode til rmi

Hej

Jeg har en kode, som jeg skal have til at køre client/server.

Jeg har en GUI og en databaseforbindelse, med 2 klasser under sig.

Hvad har jeg brug for af klasser for at det kan køre rmi?

Det jeg er interesseret i, er at få skitseret et klassediagram så jeg kan få et overblik over hvordan det hænger sammen. Gerne lavet ud fra de 4 klasser jeg allerede har.

Mit bud er: Gui > Controller (som lytter på guiknapperne) > server(min databaseforbindelse). Er der andet jeg har brug for?
Avatar billede arne_v Ekspert
09. december 2004 - 21:46 #1
class GUI----(1:1)----class Controller
    |
  (1:1)
    |
interface Server

og

interface Server
      ^
      |
class ServerImpl

må være det du skal have
Avatar billede arne_v Ekspert
09. december 2004 - 21:48 #2
Måske er det kode i Controller klassen som skal have en reference til
en Server - det kan jeg ikke helt gennemskue udfra din beskrivelse.

Men det relevante er at du skal have et interface Server og en class ServerImpl
Avatar billede bagnavnet Nybegynder
09. december 2004 - 21:53 #3
ok.
I forhold til din artikkel http://www.eksperten.dk/artikler/25 hvad er de forskellige klasser så? Jeg ser mange steder en KlasseImpl, KlasseServer, KlasseKlient, KlasseI, hvad indeholder de? Og har jeg brug for dem alle?
Er det forkert at sige at min GUI er min klient? Eller er det min controller der er det? Er min databaseforbindelse min ServerImpl?
Meningen med det er vel, at serveren tager sig af alt det den kan tage sig af og at der kun ligger referencer til metoder på klienten?
Avatar billede arne_v Ekspert
09. december 2004 - 21:55 #4
Server = Calc
ServerImpl = CalcImpl
TestCalc = GUI eller Controller alt afhængig af hvor koden som skal kalde serveren er
Avatar billede bagnavnet Nybegynder
09. december 2004 - 21:57 #5
ok, kigger på det.
Avatar billede bagnavnet Nybegynder
09. december 2004 - 22:07 #6
Jeg bliver helt i tvivl. Som jeg ser det er:
Min databaseforbindelse = Server = din CalcImpl
din Calc = Interface = den jeg mangler
GUI eller controller = TestCalc

Er det ikke korrekt?
Avatar billede arne_v Ekspert
09. december 2004 - 22:09 #7
Jo
Avatar billede bagnavnet Nybegynder
09. december 2004 - 22:53 #8
vil det være helt galt hvis jeg dropper Controlleren og bare kører direkte GUI > Interface?
Avatar billede arne_v Ekspert
09. december 2004 - 22:55 #9
Næh

Jeg foretrækker normalt at brug .addActionListener(this) så jeg har hele koden
i samme klasse.
Avatar billede bagnavnet Nybegynder
09. december 2004 - 22:55 #10
ok.
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:18 #11
Jeg forsøger mig med denne linie i min DbServerImpl:
-------------------------------------

public static void main(String[] args) {     
              try { 
                  Naming.rebind("Forbindelse", new DbServerImpl());     
                  }
                  catch (RemoteException e) {       
                      e.printStackTrace();     
                      }
                        catch (MalformedURLException e) {
                                    e.printStackTrace();     
                                    }
                                      }
-------------------------
men den vil ikke compile? Spørger om jeg vil ændre rebind til bind eller cast remote exception....
Avatar billede arne_v Ekspert
09. december 2004 - 23:22 #12
Har du importeret de retter pakker/klasser ?
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:23 #13
ja, og lidt til tror jeg:

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.sql.*;
import java.util.*;
import oracle.jdbc.*;
import java.rmi.server.UnicastRemoteObject;

hehe
Avatar billede arne_v Ekspert
09. december 2004 - 23:26 #14
Mystisk.

rebind er der
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:27 #15
Jeg havde glemt denne:

public class DbServerImpl extends UnicastRemoteObject implements Forbindelse
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:30 #16
nu får jeg dog fejl på den sidste del:

new DbServerImpl()

add trows declaration
add catch clause to surrounding try
eller surround with try/catch
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:32 #17
undskyld. Det er mig der roder... der er styr på det nu.
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:38 #18
Jeg er lidt i tvivl om jeg blander tingene lidt sammen nu, men jeg har bla denne metode i DbServerImpl:

public Vector hentVarer() throws SQLException
          {
            Vector alle = new Vector();
            ResultSet rs = stmt.executeQuery("select NAVN, PRIS from VARE");
            while (rs.next())
            {
              // brug kolonneindeks i stedet for kolonnenavn
              Vare v = new Vare( rs.getString(1), rs.getInt(2));
              alle.addElement(v);
            }
            return alle;
          }
-------------------
Den brokker sig lidt over at jeg throws SQLException her....hvordan hænger det sammen med at jeg throws RemoteException på metoden i min forbindelses klasse?

Hvis jeg fjerner throws SQLException fra metoden i DbServerImpl så lader det til at den er tilfreds. Er det overhovedet nødvendigt på den metode at throws SQLException? Hvad er det præcist der sker når jeg gør det, ved du det?
Avatar billede arne_v Ekspert
09. december 2004 - 23:42 #19
Forbindelse hentVarer skal throwe SQLException + RemoteException når
DbServerImpl thrower SQLException

interfacet thrower altid samme som implementationen plus RemoteException
Avatar billede arne_v Ekspert
09. december 2004 - 23:47 #20
Der er iøvrigt solid tradition i RMI for at bruge navne Xxxx og XxxxImpl
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:48 #21
public interface Forbindelse extends Remote {

  public void indsætVare(Vare v) throws SQLException throws RemoteException;
  public Vector hentVarer() throws SQLException throws RemoteException; 
}

Indtil videre har jeg ovenstående i min forbindelse. Giver det nogen mening at nr. 2 throws i første linie bliver markeret med rødt mens ingen af de andre gør det?
Avatar billede arne_v Ekspert
09. december 2004 - 23:49 #22
Øh - er det ikke:

public interface Forbindelse extends Remote {

  public void indsætVare(Vare v) throws SQLException, RemoteException;
  public Vector hentVarer() throws SQLException, RemoteException;
}
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:49 #23
ok,
jeg har GUI, Forbindelse, DbServerImpl. (så kan jeg selv holde styr på hvad der er hvad;-)) Hvad forslår du jeg kalder dem?
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:50 #24
haha, jo det ser bedre ud. Det er lige med at finde ud af hvordan det skal skrives...
Avatar billede arne_v Ekspert
09. december 2004 - 23:51 #25
GUI, DbServer, DbServerImpl
Avatar billede bagnavnet Nybegynder
09. december 2004 - 23:54 #26
klart! Det gør jeg...
Avatar billede bagnavnet Nybegynder
10. december 2004 - 00:24 #27
Bare så jeg forstår hvad det er der sker.

I forhold til din artikkel http://www.eksperten.dk/artikler/25

Du beskriver kaldet således:

Client kode -- Stub Kode -- (netværk) -- Skeleton kode -- Server kode

Eftersom at jeg ikke har en klasse for hver af disse, hvad er så hvad i mit lille system?

Har jeg både stub kode og skeleton kode i en og samme klasse?

Og hvordan forholder det sig mht. serialiseringen? Hvor sker den, samt de-serialiseringen?
Avatar billede arne_v Ekspert
10. december 2004 - 07:37 #28
Stub og skeleton genereres af RMIC compileren. Du skal ikke selv skrive dem.

(i nyere Java versioner kan de vost endda genereres dynamisk på runtime)

Serialisering og deserialisering ordner stub og skeleton - du skal kun sikre
dig at dine argumenter er serializable - du kan ikke sende et ResultSet med
godt en ArrayList af et serialiazable objekt af ints og strings.
Avatar billede arne_v Ekspert
01. januar 2005 - 13:36 #29
OK ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester