我当初这么写的时候就觉得会产生问题,
获得数据时,servlet已将对象写入流中,所以建立连接后可以得到
而写入数据时,是先建立的连接,后在流中写入数据,不知道这个连接是怎么建立起来的,何时建立起来的,什么时候释放

解决方案 »

  1.   

    看看如下代码:
          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中获得结果对象
      

  2.   

    试试hessian吧,相信会忘不掉的. www.caucho.com/hessian
      

  3.   

    to gao277(流氓状元) :我的问题是根本就和servlet没有建立上通信,你给的代码是本页读取呀
      

  4.   

    好像没问题,试试:
    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);
    }
      

  5.   

    to kaymo(头发熟了) 你的代码也是本程序读取呀,我需要的是在servlet中获得输入流但按我的代码根本就连接不上servlet
      

  6.   

    你的原因就是只建立了连接之后只给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"));
    }
      

  7.   

    to :  flywind63(紫色的偶然) :谢谢你的讲解,问题解决了,这么说楼上的两位兄弟说的也是对的,只是小的愚笨,没能体会其中真谛------------------------------------------------------------------------
    偶然兄说:
    个人理解可能是因为URL连接是同步消息传输,所以客户端必须即有出又有入吧!
    ------------------------------------------------------------------------
    如果是有出也有入的话,那为什么写inputstream的时候就不需要呢?
    这个问题我已经弄了整整两天了,郁闷至极。我发现只有当con.getInputStream()时才会建立与servlet的连接,所以我尝试了在applet中先建立输入流,再写输出流的办法,但servlet无法得到输入流。于是我就没有继续尝试。原来失败与成功只是一线之隔啊!不知道我的方法是哪里出了问题感觉虽然程序可以运行了,但正确的方法似乎不是这样的,一定会有更好的方法,有时间的话一定好好研究一下,希望偶然兄有兴趣的话可以和我继续交流这个问题