applet与servlet通信的问题 我当初这么写的时候就觉得会产生问题,获得数据时,servlet已将对象写入流中,所以建立连接后可以得到而写入数据时,是先建立的连接,后在流中写入数据,不知道这个连接是怎么建立起来的,何时建立起来的,什么时候释放 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看看如下代码: URL url = new URL("http://localhost:7001/Servlet?action=select"); URLConnection con = url.openConnection(); con.setDoOutput(true); con.setDoInput(true); con.setUseCaches(false); con.setDefaultUseCaches(false); con.setRequestProperty("Content-Type", "application/octet-stream"); String in = "request";//in can be any object ObjectOutputStream outputToServlet = new ObjectOutputStream(con. getOutputStream()); outputToServlet.writeObject(in); outputToServlet.flush(); ObjectInputStream inputFromServlet = new ObjectInputStream(con. getInputStream()); Object callServletResult = (Object) inputFromServlet.readObject(); outputToServlet.close();先设置好outputstream,然后再writeobject(写入输入),调用flush后就可以从outputstream中获得结果对象 试试hessian吧,相信会忘不掉的. www.caucho.com/hessian to gao277(流氓状元) :我的问题是根本就和servlet没有建立上通信,你给的代码是本页读取呀 好像没问题,试试: ObjectOutputStream out = null; ObjectInputStream input = null; Object returnObject = null; try { URL url = new URL("http://localhost:7001/Servletaction=select"); URLConnection conn = url.openConnection(); conn.setDoOutput(true); conn.setUseCaches(false); out = new ObjectOutputStream(conn.getOutputStream()); out.writeObject(context); out.flush(); out.close(); input = new ObjectInputStream(conn.getInputStream()); returnObject = input.readObject(); input.close(); if (returnObject == null) { return; } } catch (Exception e) { e.printStackTrace(); try { if (out != null) out.close(); if (input != null) input.close(); } catch (Exception e1) { e1.printStackTrace(); } throw new Exception(e); } to kaymo(头发熟了) 你的代码也是本程序读取呀,我需要的是在servlet中获得输入流但按我的代码根本就连接不上servlet 你的原因就是只建立了连接之后只给servlet了一个OutputStream,而没有接收servlet端发送回来的InputStream,所以你的连接不正确!要建立连接的话,首先在客户端建立连接,然后得到OutputStream接着用你的ObjectOutputSttream写对象,而servlet端则需要通过request.getInputStream()得到输入流,然后读出内容,关闭输入流,然后建立输出流,写输入流,然后关闭!而客户端要再次接收这个服务器端的输出流,读完内容后关闭,这样才能真正建立连接!不知道为什么如果想成功建立连接,客户端必须即有输出流又有输入流,否则就不行!我也是摸索了好久才发现的!个人,个人理解可能是因为URL连接是同步消息传输,所以客户端必须即有出又有入吧!理解错误之处请指正!附成功连接代码URL url = new URL("http://localhost:7001/Servlet?action=select");URLConnection urlcon = url.openConnection();urlcon.connect();ObjectInputStream ois = new ObjectInputStream(urlcon.getInputStream());Servlet端:String type = httpservletrequest.getParameter("action");System.out.println(type);if(type.equals("action")){ httpservletresponse.setContentType("application/octet-stream"); ObjectOutputStream objectoutputstream = new ObjectOutputStream(httpservletresponse.getOutputStream()); objectoutputstream.writeObject(new String("Success"));} to : flywind63(紫色的偶然) :谢谢你的讲解,问题解决了,这么说楼上的两位兄弟说的也是对的,只是小的愚笨,没能体会其中真谛------------------------------------------------------------------------偶然兄说:个人理解可能是因为URL连接是同步消息传输,所以客户端必须即有出又有入吧!------------------------------------------------------------------------如果是有出也有入的话,那为什么写inputstream的时候就不需要呢?这个问题我已经弄了整整两天了,郁闷至极。我发现只有当con.getInputStream()时才会建立与servlet的连接,所以我尝试了在applet中先建立输入流,再写输出流的办法,但servlet无法得到输入流。于是我就没有继续尝试。原来失败与成功只是一线之隔啊!不知道我的方法是哪里出了问题感觉虽然程序可以运行了,但正确的方法似乎不是这样的,一定会有更好的方法,有时间的话一定好好研究一下,希望偶然兄有兴趣的话可以和我继续交流这个问题 关于正则获取多个数据!!!!!! 谁好心帮我翻译下代码,谢谢了 Applet传递参数抱错 static的本质是什么,有关它本质的一切都可回答,谢谢了 如何在一个弧形里填充渐变色? 为什么会说我用了deprecated api?100分 java无窗体鼠标流畅拖动怎么实现? 关于JTable的一些problem? 请问awt与swing有什么区别?她们是怎样使用的? Java Socket 在已经实现长连接的情况下,服务端该如何处理来自不同客户端数据的传递转发 如何把byte[]中的数转为十六进制? 散分,兄弟自己建立了一个增值业务的BBS,欢迎大家去捧捧场
URL url = new URL("http://localhost:7001/Servlet?action=select");
URLConnection con = url.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setUseCaches(false);
con.setDefaultUseCaches(false);
con.setRequestProperty("Content-Type", "application/octet-stream");
String in = "request";//in can be any object
ObjectOutputStream outputToServlet = new ObjectOutputStream(con.
getOutputStream());
outputToServlet.writeObject(in);
outputToServlet.flush();
ObjectInputStream inputFromServlet = new ObjectInputStream(con.
getInputStream());
Object callServletResult = (Object) inputFromServlet.readObject();
outputToServlet.close();
先设置好outputstream,然后再writeobject(写入输入),调用flush后就可以从outputstream中获得结果对象
ObjectOutputStream out = null;
ObjectInputStream input = null;
Object returnObject = null;
try {
URL url = new URL("http://localhost:7001/Servletaction=select");
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
conn.setUseCaches(false);
out = new ObjectOutputStream(conn.getOutputStream());
out.writeObject(context);
out.flush();
out.close(); input = new ObjectInputStream(conn.getInputStream()); returnObject = input.readObject();
input.close();
if (returnObject == null) {
return;
} } catch (Exception e) {
e.printStackTrace();
try {
if (out != null)
out.close();
if (input != null)
input.close();
} catch (Exception e1) {
e1.printStackTrace();
}
throw new Exception(e);
}
接着用你的ObjectOutputSttream写对象,而servlet端则需要通过request.getInputStream()得到输入流,然后读出内容,关闭输入流,然后建立输出流,写输入流,然后关闭!而客户端要再次接收这个服务器端的输出流,读完内容后关闭,这样才能真正建立连接!不知道为什么如果想成功建立连接,客户端必须即有输出流又有输入流,否则就不行!我也是摸索了好久才发现的!个人,个人理解可能是因为URL连接是同步消息传输,所以客户端必须即有出又有入吧!理解错误之处请指正!附成功连接代码
URL url = new URL("http://localhost:7001/Servlet?action=select");
URLConnection urlcon = url.openConnection();
urlcon.connect();
ObjectInputStream ois = new ObjectInputStream(urlcon.getInputStream());Servlet端:
String type = httpservletrequest.getParameter("action");
System.out.println(type);
if(type.equals("action"))
{
httpservletresponse.setContentType("application/octet-stream");
ObjectOutputStream objectoutputstream = new ObjectOutputStream(httpservletresponse.getOutputStream());
objectoutputstream.writeObject(new String("Success"));
}
偶然兄说:
个人理解可能是因为URL连接是同步消息传输,所以客户端必须即有出又有入吧!
------------------------------------------------------------------------
如果是有出也有入的话,那为什么写inputstream的时候就不需要呢?
这个问题我已经弄了整整两天了,郁闷至极。我发现只有当con.getInputStream()时才会建立与servlet的连接,所以我尝试了在applet中先建立输入流,再写输出流的办法,但servlet无法得到输入流。于是我就没有继续尝试。原来失败与成功只是一线之隔啊!不知道我的方法是哪里出了问题感觉虽然程序可以运行了,但正确的方法似乎不是这样的,一定会有更好的方法,有时间的话一定好好研究一下,希望偶然兄有兴趣的话可以和我继续交流这个问题