Hallo 👋🏻
Ich habe den heutigen Tag ein bisschen mir RMI rumprobiert und bin auf ein Problem gestoßen.
In meinem Programm soll der Client (eine GUI) den Server über einen klick auf einen Button informieren. Der Server (Controller) verwertet diese Information dann und kommt zu dem Schluss auf dem Client ein Dialog Fenster zu öffnen.
Bis dahin funktioniert das ganze auch ganz gut, das Dialog Fenster wird zumindest angezeigt (wenn es keine SWINg, sonder AWT KOmponenten sind auch diese). Der Button im Dialog Fenster gibt aber keine Reaktion. Erst wenn ich den Server beende kommt am Client eine Fehlermeldung (siehe unten) und eine Reaktion.
Das Programm scheint bei dem Befehl "myDialog.setVisible(true);" stehen zu bleiben, was ich anhand der fehlenden Ausgabe der darauf folgenden Zeile glaube. Mit dem Befehl "setVisible()" hat das aber nichts zu tun, was ich aus der "refresh()" Methode schließe.
Hier erst der Ordner Baum und dann die Implementierung. Ich hoff ihr könnt mir sagen was hier das Problem ist und welche möglichen Lösungen es gibt. Bei Fragen bitte einfach melden
[CODE lang="java" title="ClientImpl"]package Client;
import bothsides.Client;
import bothsides.Server;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ClientImpl extends UnicastRemoteObject implements Client {
private Server server;
private JFrame frame;
private JPanel panel;
public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
ClientImpl view = new ClientImpl();
}
public ClientImpl() throws RemoteException, MalformedURLException, NotBoundException {
server = (Server) Naming.lookup("rmi://127.0.0.1/test");
frame = new JFrame();
frame.setSize(1200,800);
panel = new JPanel();
refresh();
frame.add(panel);
server.setView(this);
}
@Override
public void refresh() throws RemoteException {
panel.removeAll();
panel.add(new JLabel("test"));
JButton b = new JButton("Click");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
server.report();
} catch (RemoteException remoteException) {
remoteException.printStackTrace();
}
}
});
panel.add(b);
frame.revalidate();
frame.repaint();
frame.setVisible(true);
System.out.println("Refresh");
}
@Override
public void dialog() throws RemoteException {
JDialog myDialog = new JDialog(frame,true);
myDialog.setSize(400,200);
Button button = new Button("OK");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myDialog.dispose();
System.out.println("PRESSED");
}
});
myDialog.add(button);
myDialog.setVisible(true);
System.out.println("DIALOG");
}
}
[/CODE]
[CODE lang="java" title="ServerImpl" highlight="11-34"]package Server;
import bothsides.Client;
import bothsides.Server;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ServerImpl extends UnicastRemoteObject implements Server {
Client view;
public static void main(String[] args) throws MalformedURLException, RemoteException {
ServerImpl serverImpl = new ServerImpl();
}
public ServerImpl() throws RemoteException, MalformedURLException {
java.rmi.registry.LocateRegistry.createRegistry(1099);
Naming.rebind("//localhost/test",this);
}
@Override
public void report() throws RemoteException {
view.dialog();
}
@Override
public void setView(Client view) throws RemoteException {
this.view = view;
this.view.refresh();
}
}
[/CODE]
[CODE lang="java" title="Client"]package bothsides;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Client extends Remote {
void refresh() throws RemoteException;
void dialog() throws RemoteException;
}
[/CODE]
[CODE lang="java" title="Server"]package bothsides;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Server extends Remote {
void report() throws RemoteException;
void setView(Client view) throws RemoteException;
}
[/CODE]
[CODE title="Fehlercode"]java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.net.SocketException: Connection reset[/CODE]
Ich habe den heutigen Tag ein bisschen mir RMI rumprobiert und bin auf ein Problem gestoßen.
In meinem Programm soll der Client (eine GUI) den Server über einen klick auf einen Button informieren. Der Server (Controller) verwertet diese Information dann und kommt zu dem Schluss auf dem Client ein Dialog Fenster zu öffnen.
Bis dahin funktioniert das ganze auch ganz gut, das Dialog Fenster wird zumindest angezeigt (wenn es keine SWINg, sonder AWT KOmponenten sind auch diese). Der Button im Dialog Fenster gibt aber keine Reaktion. Erst wenn ich den Server beende kommt am Client eine Fehlermeldung (siehe unten) und eine Reaktion.
Das Programm scheint bei dem Befehl "myDialog.setVisible(true);" stehen zu bleiben, was ich anhand der fehlenden Ausgabe der darauf folgenden Zeile glaube. Mit dem Befehl "setVisible()" hat das aber nichts zu tun, was ich aus der "refresh()" Methode schließe.
Hier erst der Ordner Baum und dann die Implementierung. Ich hoff ihr könnt mir sagen was hier das Problem ist und welche möglichen Lösungen es gibt. Bei Fragen bitte einfach melden
[CODE lang="java" title="ClientImpl"]package Client;
import bothsides.Client;
import bothsides.Server;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ClientImpl extends UnicastRemoteObject implements Client {
private Server server;
private JFrame frame;
private JPanel panel;
public static void main(String[] args) throws MalformedURLException, NotBoundException, RemoteException {
ClientImpl view = new ClientImpl();
}
public ClientImpl() throws RemoteException, MalformedURLException, NotBoundException {
server = (Server) Naming.lookup("rmi://127.0.0.1/test");
frame = new JFrame();
frame.setSize(1200,800);
panel = new JPanel();
refresh();
frame.add(panel);
server.setView(this);
}
@Override
public void refresh() throws RemoteException {
panel.removeAll();
panel.add(new JLabel("test"));
JButton b = new JButton("Click");
b.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
server.report();
} catch (RemoteException remoteException) {
remoteException.printStackTrace();
}
}
});
panel.add(b);
frame.revalidate();
frame.repaint();
frame.setVisible(true);
System.out.println("Refresh");
}
@Override
public void dialog() throws RemoteException {
JDialog myDialog = new JDialog(frame,true);
myDialog.setSize(400,200);
Button button = new Button("OK");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
myDialog.dispose();
System.out.println("PRESSED");
}
});
myDialog.add(button);
myDialog.setVisible(true);
System.out.println("DIALOG");
}
}
[/CODE]
[CODE lang="java" title="ServerImpl" highlight="11-34"]package Server;
import bothsides.Client;
import bothsides.Server;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class ServerImpl extends UnicastRemoteObject implements Server {
Client view;
public static void main(String[] args) throws MalformedURLException, RemoteException {
ServerImpl serverImpl = new ServerImpl();
}
public ServerImpl() throws RemoteException, MalformedURLException {
java.rmi.registry.LocateRegistry.createRegistry(1099);
Naming.rebind("//localhost/test",this);
}
@Override
public void report() throws RemoteException {
view.dialog();
}
@Override
public void setView(Client view) throws RemoteException {
this.view = view;
this.view.refresh();
}
}
[/CODE]
[CODE lang="java" title="Client"]package bothsides;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Client extends Remote {
void refresh() throws RemoteException;
void dialog() throws RemoteException;
}
[/CODE]
[CODE lang="java" title="Server"]package bothsides;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Server extends Remote {
void report() throws RemoteException;
void setView(Client view) throws RemoteException;
}
[/CODE]
[CODE title="Fehlercode"]java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.net.SocketException: Connection reset[/CODE]