Hi, ich switche mal wieder die Programmiersprache und mach jz ein kleines Projekt in Java. Es ist ein Client/Server Projekt. Der Server ist durch Addons (externe Jars) erweiterbar. So weit so gut, aber wenn ich jz ein Addon hinzufüge, möchte ich, dass der Client weiß wie das Layout aussieht. Da ich es vermeiden möchte eine addon_client.jar und eine addon_server.jar zu machen, gibt es im Addon ein JPanel, das der Server abrufen kann. Da ich es aber beim Client brauche, muss ich das irgendwie senden. Mit einem ObjectStream habe ich es nicht geschafft (kp, ob ich zu inkompetent bin oder das nicht geht). Hat da jemand eine Idee, wie man ein Layout senden kann ?
MfG Luca
Mein Code:
Layout:
Server:
Spoiler anzeigen
Client:
Spoiler anzeigen
Mein Fehler (Client):
Spoiler anzeigen
Ich check nicht ganz warum er die Layout Klasse sendet, obwohl ich sie zu einem JPanel gecastet habe
Edit: Es geht wenn man nur ein
MfG Luca
Mein Code:
Layout:
Server:
Java-Quellcode
- import java.io.IOException;
- import java.io.ObjectOutputStream;
- import java.net.ServerSocket;
- import java.net.Socket;
- import javax.swing.JPanel;
- public class Server {
- public static void main(String[] args) {
- new Server();
- }
- public Server() {
- try {
- @SuppressWarnings("resource")
- ServerSocket server = new ServerSocket( 40040 );
- System.out.println( "Server online on Port: " + server.getLocalPort() );
- while ( !server.isClosed() )
- handleConnection( server.accept() );
- } catch ( IOException e ) { e.printStackTrace(); }
- }
- private void handleConnection( Socket client ) {
- try {
- ObjectOutputStream oos = new ObjectOutputStream( client.getOutputStream() );
- System.out.println( "Client connected: " + client.getInetAddress() + ":" + client.getPort() );
- JPanel pLayout = new Layout();
- oos.writeObject( pLayout ); oos.flush();
- oos.close();
- } catch ( IOException e ) { e.printStackTrace(); }
- }
- }
Client:
Java-Quellcode
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.net.Socket;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- public class Client {
- public static void main(String[] args) {
- new Client();
- }
- public Client() {
- try {
- @SuppressWarnings("resource")
- Socket server = new Socket( "", 40040 );
- ObjectInputStream ois = new ObjectInputStream( server.getInputStream() );
- System.out.println( "Connected with Server: " + server.getInetAddress() + ":" + server.getPort() );
- JFrame frame = new JFrame( "Client" );
- JPanel playout = (JPanel) ois.readObject();
- frame.setSize( 800, 600 );
- frame.add( playout );
- frame.setVisible( true );
- ois.close();
- } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); }
- }
- }
Mein Fehler (Client):
Quellcode
- java.lang.ClassNotFoundException: de.multiSync.Server.src.Layout
- at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
- at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
- at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
- at java.lang.Class.forName0(Native Method)
- at java.lang.Class.forName(Class.java:348)
- at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:626)
- at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1613)
- at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
- at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
- at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
- at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
- at de.MultiSync.Client.src.Client.<init>(Client.java:26)
- at de.MultiSync.Client.src.Client.main(Client.java:12)
Ich check nicht ganz warum er die Layout Klasse sendet, obwohl ich sie zu einem JPanel gecastet habe
Edit: Es geht wenn man nur ein
new JPanel()
sendet, aber ich möchte eigentlich alles senden... Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Luca“ ()