Object an Server senden, Server antwortet mit objekt?

babuschka

Top Contributor
Hi,

versuch hier ne Verbindung aus Client und Server herzustellen. Soweit auch alles gut. Allerdings ein Problem gibts mitm Senden:

Die Client-Methode zum Senden:

Java:
	public static Object send(Object object){
		
		//Verbindung aufnehmen
		Socket socket = startConnection();
		
		Object obj = null;
				
		//Senden
		OutputStream out;
		ObjectOutputStream oos = null;
		try {
			out = socket.getOutputStream();
			oos = new ObjectOutputStream(out);
			
			oos.writeObject(object);	
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//Antwort empfangen
		InputStream in;
		ObjectInputStream ins = null;
		try {
			in = socket.getInputStream();
			ins = new ObjectInputStream(in);
			
			obj = ins.readObject();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("[Client] Object gesendet");
		
		//Verbindungen beenden
		try {
			oos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		closeConnection(socket);
		
		return obj;
	}

Die Methode vom Server:

Java:
	public void run() {
		
		try {
			InputStream in = connectionToClient.getInputStream();
			
			System.out.println("[SERVER] Lese input Stream...");
		
			// Erstellen des ObjectInputStreams
			ObjectInputStream objIn = new ObjectInputStream(in);
			OutputStream out = null;
			ObjectOutputStream objOut = null;
			
			try {
				// Empfangen des vom Client gesendetn Objekts
				Object obj = objIn.readObject();
				
				System.out.println("[SERVER] Object erhalten");
				
				if (obj instanceof Ausgabe) {
					....					
					
				}else if(obj instanceof String){
					String abruf = (String) obj;
					
					System.out.println("[SERVER] neue String-Anfrage: " + abruf);
					
					if(abruf.equals("sendAlleZeitschriftenKomplett")){
						
						System.out.println("[SERVER] Alle Zeitschriften inkl. Ausgaben werden verschickt");
						//Antwort zurücksenden
						
						out = connectionToClient.getOutputStream();
						objOut = new ObjectOutputStream(out);
						Object test = "Huhu";
						objOut.writeObject(test);
																		
					}
				}
				
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			
			objIn.close();
			//objOut.close();
			connectionToClient.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

Problem ist, dass zwar die Anfrage an den Server raus, also die Anfrage kommt an, der geht in die IF-Abfrage rein.
Aber das Zurücksenden eines Objektes läuft nicht. Also beim Senden vom Server direkt gibts keinen Fehler.
Aber beim Empfangen der Antwort im Client erhalte ich dann folgende Exeception:

Zeile 76 ist die hier: ins = new ObjectInputStream(in);
java.io.EOFException
at java.i😵bjectInputStream$PeekInputStream.readFully(Unknown Source)
at java.i😵bjectInputStream$BlockDataInputStream.readShort(Unknown Source)
at java.i😵bjectInputStream.readStreamHeader(Unknown Source)
at java.i😵bjectInputStream.<init>(Unknown Source)
at de.steuerung.MagazinClient.send(MagazinClient.java:76)
at de.gui.MagazinManagerWindow.createInhalt(MagazinManagerWindow.java:174)
at de.gui.MagazinManagerWindow.loadContent(MagazinManagerWindow.java:139)
at de.gui.listener.JMenuBarListener.actionPerformed(JMenuBarListener.java:28)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.AbstractButton.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

Hoffe ihr habt ne Idee...danke
 
Ohne das im Detail zu durchschauen.
Nach dem:
Code:
 objOut.writeObject(test);
ist noch ein:
Code:
 objOut.flush();
empfehlenswert.
 
Hmh, schade, wäre so schön einfach gewesen.
Aber auf Client Seite fehlt nach:
Code:
oos.writeObject(object);
auch der flush.
Übrigens tut
Code:
ins = new ObjectInputStream(in);
Bereits Daten vom server lesen, die er wohl noch nicht bereit gestellt werden.
 
Achso ok...hab die Reihenfolge dann mal geändert:

Java:
public static Object send(Object object){
		
		//Verbindung aufnehmen
		Socket socket = startConnection();
		
		Object obj = null;
		
		//Senden
		OutputStream out;
		InputStream in;
		ObjectOutputStream oos = null;
		ObjectInputStream ins = null;
		try {
			out = socket.getOutputStream();
			in = socket.getInputStream();
			
			oos = new ObjectOutputStream(out);
			oos.writeObject(object);
			oos.flush();
			
			//Antwort lesen
			ins = new ObjectInputStream(in);
			obj = ins.readObject();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		
		System.out.println("[Client] Object gesendet");
		
		//Verbindungen beenden
		try {
			oos.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		closeConnection(socket);
		
		return obj;
	}

Java:
	public void run() {
		
		try {
			InputStream in = connectionToClient.getInputStream();
			OutputStream out = connectionToClient.getOutputStream();
			
			System.out.println("[SERVER] Lese input Stream...");
		
			// Erstellen des ObjectInputStreams
			ObjectInputStream objIn = new ObjectInputStream(in);
			ObjectOutputStream objOut = null;
			
			try {
				// Empfangen des vom Client gesendetn Objekts
				Object obj = objIn.readObject();
				
				System.out.println("[SERVER] Object erhalten");
				
				if (obj instanceof Ausgabe) {
					...				
				}else if(obj instanceof String){
					String abruf = (String) obj;
					
					System.out.println("[SERVER] neue String-Anfrage: " + abruf);
					
					if(abruf.equals("sendAllZeitschriften")){
						....	
					}else if(abruf.equals("sendAlleZeitschriftenKomplett")){
						//Anfrage zum Verschicken aller aktuellen Zeitschriften inkl. Ausgaben, etc.
						System.out.println("[SERVER] Alle Zeitschriften inkl. Ausgaben werden verschickt");
						//Antwort zurücksenden
						objOut = new ObjectOutputStream(out);
						Object object = "Stringtest";
						objOut.writeObject(object);
						objOut.flush();
					}
				}
				
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
			
			objIn.close();
			objOut.close();
			connectionToClient.close();
			
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
 
2 ns nachdem der Server die Antwort sendet steht schon
> connectionToClient.close();

das ist sicherlich ungesund für eine vertrauensvolle Übertragung

edit:
wobei es lokal auch damit funktioniert, vielleicht ist dort die Übertragung schnell genug,
deine try/catch-Auswüchse solltest du überdenken, allein in der Hinsicht vielleicht schon hilfreich:

Java:
public class Test
{
    public static void main(String[] args)  throws Exception  {

        new Thread()  {
                public void run()  {
                    try    {
                        serverRun();
                    }catch (Exception e)   {
                        e.printStackTrace();
                    }
                }
            }.start();

        Thread.sleep(2000);
        send("test");
        Thread.sleep(4000);
        System.out.println("end");
    }

    public static void serverRun()   throws Exception {
        ServerSocket server = new ServerSocket(5678);
        Socket connectionToClient = server.accept();
        InputStream in = connectionToClient.getInputStream();

        System.out.println("[SERVER] Lese input Stream...");

        // Erstellen des ObjectInputStreams
        ObjectInputStream objIn = new ObjectInputStream(in);
        OutputStream out = null;
        ObjectOutputStream objOut = null;

        // Empfangen des vom Client gesendetn Objekts
        Object obj = objIn.readObject();

        System.out.println("[SERVER] Object erhalten: " + obj);


        // Antwort zurücksenden
        out = connectionToClient.getOutputStream();
        objOut = new ObjectOutputStream(out);
        Object test = "Huhu";
        objOut.writeObject(test);

        objIn.close();
        // objOut.close();
        connectionToClient.close();
    }

    public static Object send(Object object)   throws Exception  {

        // Verbindung aufnehmen
        Socket socket = new Socket("localhost", 5678);

        Object obj = null;

        // Senden
        OutputStream out;
        ObjectOutputStream oos = null;
        out = socket.getOutputStream();
        oos = new ObjectOutputStream(out);

        oos.writeObject(object);
        System.out.println("[Client] Object gesendet");

        // Antwort empfangen
        InputStream in;
        ObjectInputStream ins = null;
        in = socket.getInputStream();
        ins = new ObjectInputStream(in);

        obj = ins.readObject();
        System.out.println("Antwort beim Client: " + obj);

        // Verbindungen beenden
        oos.close();
        socket.close();

        return obj;
    }
}
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben