SocketError da sich ObjectOutputStreams und ObjectInputStreams blockieren ?

will2k

Mitglied
Guten Morgen Leute,

EDIT: habe mich verschrieben in den Kommentaren beim Server Thread:

Daten über socket zum Client senden muss Daten über socket vom Client empfangen heißen und andersrum natürlich

ich habe ein Objekt vom client thread über sockets zum server thread serialisiert und gesendet vom Objectoutputstream des clients zum Objectinputstream des Servers. Das ging bisher gut. Nun wollte ich auch daten vom server zum client senden sprich genau die andere Richtung. Dabei habe ich im server thread einen Objectoutputstream erstellt und im Thread client einen Objectinputstream natürlich. Seit ich nun in je einem Thread 2 streams habe (ObjectOutpu/ObjectInput-stream) blockiert sich das ganze irgendwie bzw. ich bekomme einen socketError bzw. exceptions... kann mir jemand sagen wie ich das problem angehen kann?

Dies ist ein wichtiger Codeausschnitt aus der client.class:

Code:
ObjectInputStream incomingObject = new ObjectInputStream(socket.getInputStream());
//nach debuggen an dieser Stelle springt der cursor in die untere Exception ?
Buchdaten bd = (Buchdaten) incomingObject.readObject();


Das ist die Fehlermeldung die ich bekomme:


Code:
Connection done - handshake Socket[addr=/127.0.0.1,port=3893,localport=10001]
Socket is closed
Software caused connection abort: socket write error
java.net.SocketException: Software caused connection abort: recv failed
   at java.net.SocketInputStream.socketRead0(Native Method)
   at java.net.SocketInputStream.read(Unknown Source)
   at java.io.ObjectInputStream$PeekInputStream.read(Unknown Source)
   at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source)
   at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source)
   at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
   at java.io.ObjectInputStream.<init>(Unknown Source)
   at MainWindow$ClientThread.run(MainWindow.java:255)



Client thread Klasse:


Code:
public class ClientThread extends Thread
    {
       ClientThread()
       {                      
       }
       
       public void run()
       {          
       
          try
             {          
                InetAddress ip = InetAddress.getByName("localhost");             
                Socket socket = new Socket(ip , ServerThread.PORT); 
                System.out.println("test");            
                
                ObjectOutputStream outgoingObject = new ObjectOutputStream(socket.getOutputStream()); // ObjectOutputStream for the object to be sent over socket to the server
                
                try
                {
                   outgoingObject.writeObject(meineBuchdaten);
                   outgoingObject.flush();
                   outgoingObject.close();
                }
                catch (NotSerializableException nse)
                {
                   System.out.println("No Serialization of the class " + nse.getLocalizedMessage() + " is possible");                   
                }
                catch(IOException ioe)
                {
                   System.out.println(ioe.getMessage());
                }   
                
                //nach debuggen springt der cursor in die untere Exception ?
                ObjectInputStream incomingObject = new ObjectInputStream(socket.getInputStream());
                Buchdaten bd = (Buchdaten) incomingObject.readObject();                
                
                myDataModel.setDataVector(bd.getArrayBuchdaten(),MainWindow.spaltennamen);                
                
                incomingObject.close();
                
                socket.close();          
            }
             catch (Exception e)
            {         
               e.printStackTrace();            
            }           
      }       
    }



Server Thread Klasse:


Code:
public class ServerThread extends Thread
{
   public static final int PORT = 10001;
   private ServerSocket myServerSocket = null;
   private Socket myClientSocket;   
   private Database myDatabase = new Database();
   private Buchdaten meineBuchdaten = new Buchdaten();
   
   public ServerThread()
   {      
   }   
   
    public void run()
    {          
      try
      {
         myServerSocket = new ServerSocket(PORT);         
      }
      catch (IOException e)
      {
         e.printStackTrace();
      }
      System.out.println("Started: " + myServerSocket);      
      
      try
      {          
         while(true)
         {            
            // wait until the client connects...         
            myClientSocket = myServerSocket.accept();   
            System.out.println("Connection done - handshake " + myClientSocket);
            
            /*----------------------- Daten über socket vom Client empfangen ------------------------------*/
            ObjectOutputStream outgoingObject = new ObjectOutputStream(myClientSocket.getOutputStream());
            
            try
                {
                   outgoingObject.writeObject(meineBuchdaten);
                   outgoingObject.flush();
                   outgoingObject.close();
                }
                catch (NotSerializableException nse)
                {
                   System.out.println("No Serialization of the class " + nse.getLocalizedMessage() + " is possible");                   
                }
                catch(IOException ioe)
                {
                   System.out.println(ioe.getMessage());
                }
                            
            /*----------------------- Daten über socket zum Client senden ------------------------------*/
            ObjectInputStream incomingObject = new ObjectInputStream(myClientSocket.getInputStream());              
            
            // Reading the serialized data and cast it to the proper type
            Buchdaten bd = (Buchdaten) incomingObject.readObject();
            
            myDatabase.passData2Database(bd);
            
            // closing the ObjectInputStream and the client connection to free resources
            incomingObject.close();
            myClientSocket.close();            
         }         
      }
      catch(Exception ex)
      {
         System.out.println(ex.getMessage());
      }      
   }
}
 
Zuletzt bearbeitet:
Zurück