我正在尝试序列化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);
}
}
}
但是当我运行时,eclipse会显示我
java.io.EOFException Kjo eshte nje pergjigje nga serveri! njava.io.EOFException`
我无法理解为什么。
答案 0 :(得分:2)
问题在于您尝试将字符串response
和对象都放入response.length()
字节。发生的事情是只发送response.length()
字节,因此如果您尝试阅读更多字节,则会获得EOFException
。
如果您将responseLength
参数设置为0,则允许您传输任意数量的数据
t.sendResponseHeaders(200, 0);
如果要向其中写入更多数据,也不应关闭流。在所有写作完成之前,请勿致电os.close()
。
答案 1 :(得分: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);
}