Avatar billede dennism Nybegynder
02. december 2007 - 18:07 Der er 35 kommentarer og
1 løsning

Java: RMI

Jeg er ved at skrive et system, hvor jeg indtil videre har brugt RMI til at sende mySQL-connection fra server til klient. Det skulle gerne være sådan, at man fra klienten kan logge ind på serveren, med et brugernavn/password som er opbevaret på serveren - som den kan trække ud fra en mySQL-database.

Hvordan kan jeg kan skrue dette login system sammen? Skal lade serveren sende et objekt med brugernavn/password til klienten, og så den finde ud af, om indtastet brugernavn/password er i objektet fra serveren? Umiddelbart lyder det ikke som en sikker løsning.
Avatar billede erikjacobsen Ekspert
02. december 2007 - 20:40 #1
Behold brugernavn og connection på serveren, og skriv og eksponer metoder der henter og gemmer data:  HentAlleHunde(). Klienten kalder HentAlleHunde(), serveren håndterer alt med databasen.
Avatar billede dennism Nybegynder
02. december 2007 - 22:11 #2
Undskyld, den fremgangsmåde er jeg ikke helt med på. Kan jeg lokke dig til at forklare den en gang til?
Avatar billede erikjacobsen Ekspert
02. december 2007 - 22:30 #3
Hvad skal jeg forklare igen?
Avatar billede dennism Nybegynder
02. december 2007 - 22:45 #4
Du laver en funktion der hedder HentAlleHunde(), men jeg forstår ikke, hvad du vil bruge den til?
Avatar billede erikjacobsen Ekspert
02. december 2007 - 22:46 #5
Det er bare et eksempelnavn, hvis nu din database var om hunde.
Avatar billede arne_v Ekspert
02. december 2007 - 22:47 #6
En MySQL Connection kan ikke sendes fra server til client via RMI. Den indeholder en socket
og den kan ikke serialiseres og sendes.

Som Erik siger skal du lade din RMI service returnere data ikke en connection.
Avatar billede dennism Nybegynder
03. december 2007 - 00:35 #7
Kan jeg ikke lave noget i stil med:
ResultSet row = ((MySQL) Naming.lookup("rmi://localhost/totalizator/MySQL")).query("SELECT * FROM customers");

..eller den vil måske stadig først kalde query på klienten?
Hvordan kan man med RMI gemme data på serveren? Med overstående Naming.lookup henter jeg et objekt ned..men hvordan kan man gemme data på serveren?

Umiddelbart vil jeg synes, at det vil være ekstremt kostbart at skulle lave metoder til at hente data for samtlige mySQL-kald mit program skal kunne kalde. Derfor vil det måske være smart bare at hente et Objekt fra serveren med login til mySQL-serveren og så oprette Connection til mySQL på klienten med de login-data som kommer fra serveren.

Jeg synes stadig ikke, jeg har fået et svar på, hvordan man kan bruge dette til at håndtere bruger-login? Jeg foreslog at man kunne få et objekt fra serveren med samtlige brugernavne/password og så matche dette objekt med det brugern indtaster ved login - men det lyder som en dårlig og usikker løsning. Hvad vil I foreslå?
Avatar billede erikjacobsen Ekspert
03. december 2007 - 08:42 #8
Jo, men det kan du jo ikke rent teknisk. Du har også selv nævnt problemet med sikkerhed, både mht brugernavn og pw, men også mht at lade mysql-serveren være åben for alle og enhver.

Og i forvejen bør du jo lave et "Data Access Lag", med den slags metoder, så du adskiller databasen fra applikationen.
Avatar billede dennism Nybegynder
03. december 2007 - 10:38 #9
Så du mener altså, at det med at hente et Objekt fra serveren med login til mySQL-serveren og så oprette Connection til mySQL på klienten med de login-data som kommer fra serveren, ville være en god ide?
Avatar billede erikjacobsen Ekspert
03. december 2007 - 10:51 #10
Nej, for det er det der ikke kan lade sig gøre.
Avatar billede erikjacobsen Ekspert
03. december 2007 - 10:53 #11
Eller, ok. Hvis du kun henter brugernavn og password, og derefter opretter forbindelsen fra din applikation, ja, så kan det gøres. Med sikkerhed vil være en by i Rusland.
Avatar billede dennism Nybegynder
03. december 2007 - 14:18 #12
Fint, det var det sidste jeg mente. Ved godt jeg har spurgt før, men har ikke forstået svaret: hvis det er en by i Rusland at gøre det på den måde, hvad vil du så anbefale?
Avatar billede erikjacobsen Ekspert
03. december 2007 - 21:39 #13
Det er skrevet før: hold al det med databasen på serveren. Klient og server udveksler så blot almindelige objekter - du skal finde på passende metoder.
Avatar billede dennism Nybegynder
03. december 2007 - 22:17 #14
Hvad så hvis jeg gerne vil indsætte noget i databasen. Så skal jeg fra klienten kunne sende noget til serveren. Kan man det med RMI?
Avatar billede erikjacobsen Ekspert
03. december 2007 - 22:32 #15
Ja
Avatar billede dennism Nybegynder
03. december 2007 - 22:46 #16
Kan du give mig et link el. lign til hvordan det kan klares?
Avatar billede erikjacobsen Ekspert
03. december 2007 - 23:01 #17
Du tager bare dine data med som parametre til en metode, gerne i et objekt der svarer til den tabel du skal gemme data i.
Avatar billede dennism Nybegynder
03. december 2007 - 23:07 #18
Jeg har bl.a. kigget på disse tutorials:
http://javabog.dk/OOP/kapitel19.jsp
http://www.javacoffeebreak.com/articles/javarmi/javarmi.html

Der kan jeg kun finde én måde fra klienten at komme i kontakt med serveren, nemlig noget i stil med:
  KontoI k =(KontoI) Naming.lookup("rmi://localhost/kontotjeneste");
Hvordan vil du her have, at jeg kan give parametre med?
Avatar billede erikjacobsen Ekspert
03. december 2007 - 23:30 #19
Så har du lavet metoder du kan kalde fra k:  k.HentAlleHeste()  - det er måden at kommunikere med serveren, efter du har fået forbindelsen. Du kan også

  Hest h = new Hest("Fido")
  k.gemNyHest(h)
Avatar billede dennism Nybegynder
04. december 2007 - 10:09 #20
Men dette kan ikke bruges til en mySQL-connection? Hvis jeg laver en mySQl connection i en klasse kaldet MySQL og henter den ned på klienten - kan jeg så kalde insert, query mm. uden at det driller?
Avatar billede erikjacobsen Ekspert
04. december 2007 - 10:20 #21
Du kan ikke hente en connection med RMI. En connection kan ikke serialiseres. Læs hvad der er skrevet.
Avatar billede dennism Nybegynder
14. december 2007 - 18:09 #22
I må meget gerne smide et svar :)
Avatar billede arne_v Ekspert
15. december 2007 - 02:49 #23
Det må være Eriks point.

Og så ... - nå det må Erik hellere selv fortælle.
Avatar billede erikjacobsen Ekspert
15. december 2007 - 08:36 #24
Ingen point til mig, tak.
Avatar billede dennism Nybegynder
15. december 2007 - 09:56 #25
Heh.. ;) Så kan du godt smide et svar, Arne ;)
Avatar billede arne_v Ekspert
17. december 2007 - 04:43 #26
nej tak

du må reclaime dem
Avatar billede dennism Nybegynder
17. december 2007 - 18:52 #27
Tak for hjælpen!
Avatar billede dennism Nybegynder
17. december 2007 - 20:54 #28
Jeg har et lille problem..
På min lokale maskine forsøger jeg at kontakte serveren på IP'en, nemlig 192.168.1.34 - der går den fint igennem. Men på min anden client, som ikke er den samme maskine som serveren, kan jeg ikke komme igennem. Hvis jeg prøver at indtaste 192.168.1.34 i browseren kommer jeg igennem til apache-serveren, så der er hul den vej igennem. Server er en Ubuntu Linux.

Nogen der har en ide?
Avatar billede erikjacobsen Ekspert
17. december 2007 - 21:41 #29
Noget firewall?
Avatar billede dennism Nybegynder
17. december 2007 - 21:49 #30
Det tror jeg ikke, for kan godt komme igennem på telnet.
Jeg får denne exception:

java.rmi.ConnectException: Connection refused to host: 127.0.1.1; nested exception is:
        java.net.ConnectException: Connection refused: connect

Forstår ikke, hvorfor der pludselig står 127.0.1.1, når jeg forsøger at tilslutte mig 192.168.1.34?
Avatar billede arne_v Ekspert
17. december 2007 - 21:56 #31
Proev:

1)  paa server at bind til "rmi://192.168.1.34:dinport/DinApp"

hvis det ikke hjaelper saa proev:

2)  start server eller rmiregistry (kan ikke huske hvilken) med

    -Djava.rmi.server.hostname=192.168.1.34
Avatar billede dennism Nybegynder
17. december 2007 - 22:12 #32
Jeg har forsøgt på server, og der kan jeg godt!

Jeg laver mine RMI-service på denne måde:
java.rmi.registry.LocateRegistry.createRegistry(1099);

Så kan vist ik rigtigt bruge overstående? :(
Avatar billede arne_v Ekspert
17. december 2007 - 22:18 #33
#1 er netop i din server app

#2 er meget nemmere naar server app og registry er en process
Avatar billede dennism Nybegynder
18. december 2007 - 07:52 #34
Du mener altså at jeg ikke bør køre det på denne måde?
Avatar billede arne_v Ekspert
18. december 2007 - 15:18 #35
jo
Avatar billede dennism Nybegynder
20. december 2007 - 17:44 #36
Jeg tror ikke det er problemet. For hvis jeg bytter, så det er min Windows XP der står som server og min Linux maskine som står som client, så virker det fint!

Jeg tror umiddelbart ikke problemet er, at porten er lukket - for jeg får jo svar med telnet på porten 1099. Har I nogle ideer?
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