HttpClient - Server (Jetty) - getInputStream - EOF

Diskutiere HttpClient - Server (Jetty) - getInputStream - EOF im Netzwerkprogrammierung Bereich.
B

betramw

Hallo,

ich bin jetzt schon zwei Tage dran, das Problem zu lösen aber ich komme nicht auf den Fehler drauf. Ich habe davor Webservices in einer anderen Programmiersprache geschrieben. Wahrscheinlich habe ich etwas in der Java-Logik noch nicht ganz verstanden.

Der Client serialisiert das Objekt mit den ArrayLists und benutzerdefinierten Klassen und sendet das Objekt an den Server. Der Handler greift aber der Request-InputStream dürfte null sein. Was mache ich falsch?

Client-Seite:
Java:
    public static PrimaryOutput SendPrimary(String _URL, Input INPUT, String urlParameters)
    {
      
        try
        {
            URLConnection connection = new URL(_URL).openConnection();
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/octet-stream");

            ObjectOutputStream oos = new ObjectOutputStream(connection.getOutputStream());
            oos.writeObject(INPUT);
            oos.close();

            ObjectInputStream ois = new ObjectInputStream(connection.getInputStream());
            boolean readBoolean = ois.readBoolean();
            ois.close();

            System.out.println(readBoolean);
        }
        catch (Exception ex)
        {
          
        }
      
        // später Output zurück
        return null;
}
Server:

Java:
    public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    {
      
      
        try
        {
            InputStream in = request.getInputStream();
          
            ObjectInputStream oI = new ObjectInputStream(in);
          
           MainInput.Input INP = (MainInput.Input)oI.readObject();
        }
        catch (Exception ex)
        {
            System.out.println(ex.getMessage());
            //Keine Ahnung warum EOF unknown source; Läuft auf dem localhost
        }

Fehler:

java.io.EOFException
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 Classes.HelloHandler.handle(HelloHandler.java:63)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1340)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:205)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1242)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
at org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:61)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:503)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:364)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:260)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:118)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:765)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:683)
at java.lang.Thread.run(Unknown Source)
null
 
Zuletzt bearbeitet:
mihe7

mihe7

Könnte es sein, dass Du unterschiedliche Versionen der Klasse Input verwendest?
 
B

betramw

Die Klassen dürften gleich sein, eine Deserialisierung von einem FileInputStream klappt auf beiden Seiten.

Workaround:

Client:
Java:
    private void RunPrimary(MainInput.Input INPUT)
    {
      
        Basic.MessageID = GUID.newGuid().toGuidString();
      
      
        File S = new File("C:\\Python27\\test" + Basic.MessageID +".txt"); //Test-Ordner
        File D = new File("C:\\Python28\\test" + Basic.MessageID +".txt");
      
      
        try
        {
            FTPUploadDemo.copyFileUsingChannel(S, D, INPUT); //Später die Datei per FTP uploaden; Zum Probieren lokal kopieren; FileOutputStream und ObjectOutputStream, um die Datei mit dem serialisierten Inhalt zu erstellen
        }
        catch (Exception ex)
        {
          
        }
  
    OUTPUT = Basic.SendPrimary4("http://localhost:2104/primary?ID=" + Basic.MessageID, INPUT, "");
  
    OutputGrid OUTP = new OutputGrid(OUTPUT);
    OUTP.main(null);
 
    }
Server:

Java:
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    {
    
        String ID = request.getParameter("ID");      
      
        File F = new File("C:\\Pyhton28\\" + ID + ".txt");
      
        MainInput.Input INPUT = new Input();
      
        List<Object> results = new ArrayList<Object>();  
try
{

    FileInputStream fis = new FileInputStream("C:\\Python28\\test" + ID +".txt");
    ObjectInputStream ois = new ObjectInputStream(fis);

    try {
        while (true) {
            results.add(ois.readObject());
        }
    } catch (OptionalDataException e) {
        if (!e.eof)
            throw e;
    } finally {
        //ois.close();
    }
  
    INPUT = (MainInput.Input)results.get(0);
  
}
catch (Exception eaa)
{
    System.out.println(eaa.getMessage()); //EOF, ignorieren, Array mit Index 0 zu Objekt
    INPUT = (MainInput.Input)results.get(0);
}
...
Elegant ist das vielleicht nicht aber möglicherweise doch besser, als > 116 kB so zu übertragen.
 
mihe7

mihe7

Es kommt natürlich auf die Verbindung an, aber erstens sind 116 kB nicht viel und zweitens ist TCP ein Protokoll, das Übertragungsfehler weitestgehend ausschließt.

Lies doch auf Serverseite einfach mal den InputStream aus und speicher das Ergebnis in eine Datei.
 
Thema: 

HttpClient - Server (Jetty) - getInputStream - EOF

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben