这样完整的回路是ok的
客户端
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;
public class Test {
public static void main(String[] args) {
try {
new Test().go();
} catch(Exception e) {
e.printStackTrace();
}
}
public void go() throws Exception {
try {
URL clssURL = new URL("http://localhost:8080/WebTest/MyServlet");
URLConnection connect = clssURL.openConnection();
connect.setDefaultUseCaches(false);
connect.setUseCaches(false);
connect.setDoInput(true);
connect.setDoOutput(true);
connect.connect();
OutputStream ops = connect.getOutputStream();
ObjectOutputStream objout = new ObjectOutputStream(ops);
objout.writeObject("xyz");
ops.flush();
InputStream in = connect.getInputStream();
ObjectInputStream objStream;
objStream = new ObjectInputStream(in);
try {
String obj = (String) objStream.readObject();
System.out.println("the returned object:" + obj);
} catch(java.lang.ClassNotFoundException ysy) {
}
in.close();
ops.close();
} catch(Exception e) {
}
}
}
servlet
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
try {
System.out.println("doGet");
ObjectOutputStream out = new ObjectOutputStream(res.getOutputStream());
ObjectInputStream in = new ObjectInputStream(req.getInputStream());
String string = (String)in.readObject();
out.writeObject(string + "server");
out.flush();
out.close();
in.close();
} catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
System.out.println("doPost");
this.doGet(req, res);
}
}
这样子,客户端能收到servlet的回应:"xyzserver",但如果屏蔽了客户端接收部分的代码后,servlet毫无反应
InputStream in = connect.getInputStream();
ObjectInputStream objStream;
objStream = new ObjectInputStream(in);
try {
String obj = (String) objStream.readObject();
System.out.println("the returned object:" + obj);
} catch(java.lang.ClassNotFoundException ysy) {
}
in.close();
这是why?难道说非得要完整的消息发送接收回路吗?
调试下来是需要有这一句:connect.getInputStream();
servlet端才会有反应,但这还只是现象,隐藏在现象背后的本质是什么?servlet是提供service的,所以只对输入流即获取服务的流有反应?