Guten Morgen,
ich habe einen Server und mehrere Clienten auf Java RMI basis.
Diese funktionieren über meine lokale IP-Adresse tadellos, jedoch nicht über das LAN.
Meine IP (Beispielhaft) : 123.45.678.000
Vom anderen Rechner : 123.45.678.999
Ich gebe z.B. die IP-Adresse von einem anderen Rechner ein und er startet den Clienten, führe ich nun eine Methode vom Server aus ( in diesem Fall: login() ) dann hängt sich das Programm auf und nach ca 2 Minuten kommt folgender Fehler:
]
Das Problem scheint zu sein, das er trotzdem ich die andere IP eingebe, der Server meine nimmt.
Kennt jemand das Problem bzw die Lösung?
Dann habe ich noch eine zweite Frage:
Ist es möglich, über den Clienten alle laufenden Server zu ermitteln? Sodass man auswählen kann, zu welchem Server man verbinden möchte?
Vielen Dank schonmal im Vorraus! :toll:
PS: Vielleicht habt ihr ja auch noch Anmerkungen, Tipps oder Kritiken zu meinem Codystyle?
Würde mich sehr freuen, eine kleine Rückmeldung dazu zu erhalten!
ich habe einen Server und mehrere Clienten auf Java RMI basis.
Diese funktionieren über meine lokale IP-Adresse tadellos, jedoch nicht über das LAN.
Meine IP (Beispielhaft) : 123.45.678.000
Vom anderen Rechner : 123.45.678.999
Ich gebe z.B. die IP-Adresse von einem anderen Rechner ein und er startet den Clienten, führe ich nun eine Methode vom Server aus ( in diesem Fall: login() ) dann hängt sich das Programm auf und nach ca 2 Minuten kommt folgender Fehler:
Java:
java.rmi.ConnectException: Connection refused to host: 123.45.678.000; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at meiern.Starte.starteClientMitIP(Starte.java:115)
at meiern.Starte.access$000(Starte.java:22)
at meiern.Starte$1.actionPerformed(Starte.java:89)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:708)
at java.awt.EventQueue$4.run(EventQueue.java:706)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
Caused by: java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 44 more
Das Problem scheint zu sein, das er trotzdem ich die andere IP eingebe, der Server meine nimmt.
Kennt jemand das Problem bzw die Lösung?
Java:
public class Starte {
private static int MIN_ANZAHL_SPIELER;
private static int MAX_ANZAHL_SPIELER;
private static String SERVER_NAME;
private static void starteServer(){
Scanner sc = new Scanner( System.in );
try {
// Erstellt einen neuen Server
ServerImpl serverImpl = new ServerImpl( SERVER_NAME, MIN_ANZAHL_SPIELER, MAX_ANZAHL_SPIELER );
// Erstellt eine Registry mit dem Standart Registryport 1099
Registry reg = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
String hostAddress = InetAddress.getLocalHost().getHostAddress();
// Bindet den Server an den spezifischen Namen
Naming.bind( SERVER_NAME , serverImpl );
// Ausgabe, dass der Server gestartet wurde
// und unter welcher IP er zu erreichen ist
System.out.println( "Der Server ist unter folgender IP zu erreichen:" );
System.out.println( hostAddress );
System.out.println( "Den Server halten Sie per \"stop\" an!" );
System.out.println( "Warte auf Clients..." );
// Gibt man "stop" in die Konsole ein, wird der Server beendet
while( true ){
String s = sc.next();
if( s.toLowerCase().equals("stop") ){
reg.unbind( "server" );
System.exit( 0 );
}else{
System.out.println( "Mit \"stop\" können Sie den Server anhalten!" );
}
}
}
catch( Exception ex ) {
ExceptionLogger.logge( ex );
}
}
private static void starteClientOhneIP(){
final JFrame frame = new JFrame( "IP-Auswahl" );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLayout( new GridLayout(3,1) );
frame.setLocationRelativeTo( null );
frame.setSize( 300, 120 );
JLabel lblIPAdresse = new JLabel("IP Adresse");
lblIPAdresse.setHorizontalAlignment( JLabel.CENTER );
frame.add( lblIPAdresse );
final JTextField txtfldIPAdresse = new JTextField();
txtfldIPAdresse.setText( "192.11.109.156" );
frame.add( txtfldIPAdresse );
JButton btnVerbinden = new JButton( "Verbinde zum Server" );
btnVerbinden.addActionListener( new ActionListener() {
@Override
public void actionPerformed( ActionEvent e ) {
String sIPAdresse = txtfldIPAdresse.getText().trim();
if( !sIPAdresse.isEmpty() ){
frame.dispose();
starteClientMitIP( sIPAdresse );
}else{
Exception ex = new Exception( "Das Textfeld der IPAdresse ist leer!");
ExceptionLogger.logge( ex );
}
}
});
frame.add( btnVerbinden );
frame.setVisible( true );
}
private static void starteClientMitIP( String sIP ){
try {
// Setzt das LookAndFeel auf "NimbusLookAndFeel"
UIManager.setLookAndFeel( UIManager.getCrossPlatformLookAndFeelClassName() );
UIManager.setLookAndFeel( "com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel" );
// URL gibt an, wo sich der Server befindet
//String url = "//127.0.0.1/server";
String ip = sIP;
String name = SERVER_NAME;
String url = "//"+ ip +"/" + name;
// Sucht den Server in der URL
Server server = (Server) Naming.lookup( name );
// Uebergibt dem neu erstellten Clienten den gesuchten Server,
// die IP-Adresse und den Namen
ClientImpl clientImpl = new ClientImpl( server );
}
catch( Exception ex ) {
ExceptionLogger.logge( ex );
}
}
public static void leseIni( String sINIPfad ){
Properties prop = null;
try {
prop = new Properties();
prop.load( new FileInputStream(sINIPfad) );
}catch( Exception ex ) {
ExceptionLogger.logge( ex );
}finally{
if( prop != null ){
SERVER_NAME = prop.getProperty( "servername", "server" );
String min = prop.getProperty( "min_anzahl_spieler", "3" );
MIN_ANZAHL_SPIELER = Integer.parseInt( min );
String max = prop.getProperty( "max_anzahl_spieler", "10" );
MAX_ANZAHL_SPIELER = Integer.parseInt( max );
}else if( prop == null ){
SERVER_NAME = "server";
MIN_ANZAHL_SPIELER = 3;
MAX_ANZAHL_SPIELER = 10;
}
}
}
public static void main( String[] args ){
boolean bGestartet = false;
if( args.length >= 1 && !args[0].isEmpty() ){
leseIni( args[0] );
if( args.length >= 2 && !args[1].isEmpty() ){
if( args[1].equals( "server" ) ){
// @ToDo 30.07.2014 : am - MEIERN - INI-Datei einbinden (Server)
starteServer();
bGestartet = true;
}
if( args[1].equals( "client" ) ){
if( args.length >= 3 && !args[2].isEmpty() ){
starteClientMitIP( args[2] );
bGestartet = true;
}else{
starteClientOhneIP();
bGestartet = true;
}
}
}
}
if( !bGestartet ){
Exception ex = new Exception( "Es wurde kein Programm gestartet! "
+ "Bitte benutzen Sie folgende Parameter:\n"
+ " Client ohne IP-Adresse starten..: \"<Pfad zur INI-Datei>\" \"client\"\n"
+ " Client mit IP-Adresse starten...: \"<Pfad zur INI-Datei>\" \"client\" \"<IPAdresse>\" \n"
+ " Server starten .................: \"<Pfad zur INI-Datei>\" \"server\"\n" );
ExceptionLogger.logge( ex );
}
}
}
Dann habe ich noch eine zweite Frage:
Ist es möglich, über den Clienten alle laufenden Server zu ermitteln? Sodass man auswählen kann, zu welchem Server man verbinden möchte?
Vielen Dank schonmal im Vorraus! :toll:
PS: Vielleicht habt ihr ja auch noch Anmerkungen, Tipps oder Kritiken zu meinem Codystyle?
Würde mich sehr freuen, eine kleine Rückmeldung dazu zu erhalten!
Zuletzt bearbeitet: