2

HttpHandlerクラス内のオブジェクトをシリアル化しようとしています。

私は2つのファイルを持っていますServer3.java

package server3;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.net.InetSocketAddress;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

public class Server3 {
public static void main(String[] args) throws Exception {

HttpServer server = HttpServer.create(new InetSocketAddress(3333), 0);
server.createContext("/", new MyHandler());
server.setExecutor(null); // creates a default executor
server.start();
}

static class MyHandler implements HttpHandler {
public void handle(HttpExchange t) throws IOException {
        String response = "Kjo eshte nje pergjigje nga serveri! n";

        t.sendResponseHeaders(200, response.length());
        OutputStream os = t.getResponseBody();
        os.write(response.getBytes());
        os.close();

        Personat obj = new Personat();
        ObjectOutputStream objOut = new     ObjectOutputStream(t.getResponseBody());
        objOut.writeObject(obj);
        objOut.close();
}
}
}
class Personat implements Serializable{
private static final long serialVersionUID = 1L;
int ID=3;
String Name="Andi";
}

およびClient3.java

package server3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
//te gjithe personat qe jan ne database me nej objekt 
public class Client3 {
public static void main(String[] args) throws Exception {
    try {
        URL url = new URL("http://localhost:3333");
        HttpURLConnection s = (HttpURLConnection) url.openConnection();
        s.setDoOutput(true);
        s.setDoInput(true);
        s.setRequestMethod("POST");
        s.setUseCaches(false);

        InputStream in = s.getInputStream();
        InputStreamReader isr = new InputStreamReader(in);
        BufferedReader br = new BufferedReader(isr);
        int c;
        while ((c = br.read()) != -1) {
            System.out.print((char) c);
        }
        ObjectInputStream ios = new ObjectInputStream(s.getInputStream());
        Personat oin = (Personat) ios.readObject();
        String emri=oin.Name;
        System.out.println(emri);
        ios.close();
        s.disconnect();
    } catch (IOException ex) {
        System.err.println(ex);
        System.out.print(ex);
    }
}
  }

しかし、私がそれを実行すると、日食は私を示しています

java.io.EOFException Kjo eshte nje pergjigje nga serveri! njava.io.EOFException`

理由がわかりません。

4

2 に答える 2

2

response問題は、文字列とオブジェクトの両方をresponse.length()バイトに合わせようとしていることです。何が起こるかというと、response.length()バイトのみが送信されるため、さらに読み込もうとするとEOFException.

パラメータを 0に設定するresponseLengthと、任意の量のデータを送信できます。

t.sendResponseHeaders(200, 0); 

さらにデータを書き込む場合は、ストリームを閉じないでください。os.close()すべての書き込みが完了するまで電話しないでください。

于 2012-11-02T13:12:30.673 に答える
1

Java doc EOFExceptionから

入力中にファイルの終わりまたはストリームの終わりに予期せず到達したことを通知します。

この例外は、主にデータ入力ストリームでストリームの終わりを知らせるために使用されます。他の多くの入力操作は、例外をスローするのではなく、ストリームの最後に特別な値を返すことに注意してください。

EOFExceptionのサブクラスですIOException。ストリームから読み取ろうとして、読み取るデータがなくなった場合にスローされます。

InputStream以下を読んだ後、何も残っていないと思います:

InputStream in = s.getInputStream();
InputStreamReader isr = new InputStreamReader(in);
BufferedReader br = new BufferedReader(isr);
int c;
while ((c = br.read()) != -1) {
    System.out.print((char) c);
 }
于 2012-11-02T12:07:40.787 に答える