Objekte über Sockets versenden und empfangen

bigbasti

Grünschnabel
Hallo zusammen,

ich habe hier ein kleines Problem, dass mich in den Wahnsinn treibt!!

Ich bastel grade (aus Lernzwecken) an einem Chat. Der lief auch git, nun möchte ich statt Strings Objekte versenden was auch klappt zumindest Client->Server aber andersherum gehts nicht. Das Programm Friert dabei ein.

Vielleicht kann mit jmd helfen:

Innere Klasse des Clients:
Code:
    class btnConnect_Click implements ActionListener{
        public void actionPerformed(ActionEvent e){
            try{
                sock = new Socket(txtIP.getText(), Integer.valueOf(txtProxy.getText()));

                oos = new ObjectOutputStream(
                    new BufferedOutputStream(sock.getOutputStream()));

                ois = new ObjectInputStream(new BufferedInputStream(sock.getInputStream()));

                System.out.println("Verbindugn zu "+txtIP.getText()+":"+txtProxy.getText()+" wurde erfolgreich hergestellt!");

                Thread readerThread = new Thread(new EingehendReader());
                readerThread.start();
                
                showChatLayout(txtIP.getText()+":"+txtProxy.getText());
                sendClientJoins();
                
            }catch(Exception ex){
                JOptionPane.showMessageDialog(null, "Es konnte keine Verbindung mit dem angegebenen Server hergestellt werden!", "Verbindung nicht möglich!", JOptionPane.OK_CANCEL_OPTION);
                ex.printStackTrace();
            }
        }
    }

    private class EingehendReader implements Runnable{
        public void run(){
            Message msg;
            try{
                while((msg = (Message) ois.readObject()) != null){
                    
                    txtChat.append(msg.message + "\n");
                    txtChat.setCaretPosition(txtChat.getText().length());
                }
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

    public void sendMessage(String Message, String to, String type, String cmd){
        try{
            Serializable msg = new Message(Message, nick, to, type, cmd);

            oos.writeObject(msg);
            oos.flush();
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    public void sendClientJoins(){
        try{
            
            sendMessage(java.net.InetAddress.getLocalHost().toString(),"server","command","join");

        }catch(Exception e){
            e.printStackTrace();
        } 
    }

so wie ich es beim Debuggen beobachtet habe friert das Programm bei der Erzeugung des ObjectInputStreams ein:

ois = new ObjectInputStream(new BufferedInputStream(sock.getInputStream()));

Imprinzip möchte ich dass die Nachrichten vom Client->Server->zurück zu Client gesendet werden aber der Empfang klappt leider nicht! :(

Weis jmd weiter?

MfG
 
Ich habe grad bei google folgende seite gefunden:

http://www.seasite.niu.edu/cs580java/Object_Serialization.html


Some client-server programs appear not to work if the ObjectInputStream is created before the ObjectOutputStream. This may be because the ObjectInputStream constructor blocks while reading a header from the stream source. If that source is a Socket and had not yet created a corresponding OuputStream, your program may hang. If your program appears to hang on creation of the Object I/O streams, try the order shown above on both sides.

Nun hängt sich das Programm nciht mehr auf, aber ich bekomme die

java.io.StreamCorruptedException: invalid stream header
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:764)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:277)
at Chat_v2.ChatClient$btnConnect_Click.actionPerformed(ChatClient.java:188)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1882)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2202)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:420)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:258)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:5602)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3135)
at java.awt.Component.processEvent(Component.java:5367)
at java.awt.Container.processEvent(Container.java:2010)
at java.awt.Component.dispatchEventImpl(Component.java:4068)
at java.awt.Container.dispatchEventImpl(Container.java:2068)
at java.awt.Component.dispatchEvent(Component.java:3903)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4256)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3936)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3866)
at java.awt.Container.dispatchEventImpl(Container.java:2054)
at java.awt.Window.dispatchEventImpl(Window.java:1801)
at java.awt.Component.dispatchEvent(Component.java:3903)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Java Result: 2147483647

StreamCorruptedException woran liegt das?

MfG
 
Hey,

bei mir lag es daran, dass in dem Server-Code die einzelnen Threads gleichzeitig auf eine Variable zugreifen wollten und sich somit selbst behindert haben, worauf hin das Programm sich aufhängte!

MfG
 

Neue Beiträge

Zurück