【问题标题】:InputStream not reading anythingInputStream 没有读取任何内容
【发布时间】:2014-08-20 13:12:26
【问题描述】:

这是我的客户端代码。客户端发送手机号码。到 Servlet。然后 Servlet 向客户端发送一个字符串,该字符串将由 Client.Servlet 进行 base64 编码,然后从 Inputstream 中读取此编码字符串。但它从 Inputstream 中什么也不读取。

    private class SendIP extends AsyncTask<Void, Void, String>
{
    EditText et; 
    Integer value;
    protected String doInBackground(Void... params) 
    {

        try
        {

               URL url = new URL("http://10.0.2.2:8080/New/MyServlet");
               URLConnection connection = url.openConnection();
               connection.setDoOutput(true);

               et = (EditText) findViewById(R.id.editText1);
               number = et.getText().toString();
               OutputStreamWriter out=new OutputStreamWriter(connection.getOutputStream());

               out.write(number+"\n");//sending mobile no. to server
               out.flush();
               out.close();

               BufferedReader in=new BufferedReader(new InputStreamReader (connection.getInputStream()));
               message=in.readLine();
               str=in.readLine();//reading the string sent by server

               in.close();
               byte[]data=str.getBytes("UTF-8");
               base64=Base64.encodeToString(data, Base64.DEFAULT);//encoding the string into base64
               OutputStreamWriter out1=new OutputStreamWriter(connection.getOutputStream());
               out1.write(base64+"\n");
               out1.flush();//sending the encoded string to server
               out1.close();
               //out.close();






        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        /*catch(IOException e)
        {
            e.printStackTrace();
        }
        */

这是我的服务器端代码。

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws       ServletException, IOException {
    // TODO Auto-generated method stub
    //PrintWriter out=response.getWriter();

    try
    {
    byte buf[]=new byte[40];
    byte b[]=new byte[40];

    ServletInputStream sin=request.getInputStream();

    num=sin.readLine(buf, 0, buf.length);//reading mobile no. from client
    String message=new String(buf);
    System.out.println(message);

    //response.setStatus(HttpServletResponse.SC_OK);

    }
        }
          }
      }
OutputStreamWriter writer=new  OutputStreamWriter(response.getOutputStream());
    res="mobile no. received";
    str="hello client";
    writer.write(res+"\n");//sending mobile number to server
    writer.write(str+"\n");//sending string to be encoded to server
    writer.flush();
    num1=sin.readLine(b,0,b.length);//reading the encoded string from client
    base64=new String(b);
    System.out.println(num1);//this prints -1
    sin.close();

    response.setStatus(HttpServletResponse.SC_OK);

    writer.close();

    }
    catch(IOException e)
    {
        response.getWriter().println(e);
    }

【问题讨论】:

    标签: java android servlets urlconnection


    【解决方案1】:

    三个问题:

    • 您已将doOutput 设置为true,但尚未将doInput 设置为true

    • 您的服务器端似乎针对 POST 请求进行了编码,但客户端未设置任何方法类型。 (默认会发送 GET 请求……)

    • 您没有检查 status 的 URL 连接。如果状态指示错误,则getInputStream() 将为您提供一个空流。这可能会发生(例如)如果请求永远不会到达您的服务器端 doPost 方法...


    更新

    啊……我明白你要做什么了。

        OutputStreamWriter out1 = 
               new OutputStreamWriter(connection.getOutputStream());
    

    我怀疑这会奏效。当您关闭原始输出流时,应该已经关闭了底层Socket 的输出端。它无法重新打开。如果它没有关闭 Socket 我希望 getOutputStream() 调用抛出

        ProtocolException("Cannot write output after reading input.")
    

    基本上,HttpURLConnection API 不是为这样设计的......


    您似乎想要做的是实现类似“websockets”的东西......客户端和服务器协商HTTP套接字在HTTP请求和回复之后保持打开状态,然后用于“其他事情”。如果你想这样做,你应该查看 Java EE javax.websocketjavax.websocket.server 包;见here

    还有其他的 websockets 实现;谷歌的“java websocket”,一个合作的客户端和服务器可以用其他非标准的方式来做到这一点。但这超出了 HttpURLConnection API 或实现所支持的范围。

    【讨论】:

    • 试试文本编辑器:-)。说真的,伙计,你要做的是阅读我写的内容,然后阅读 URLConnection 和 HttpURLConnection 的 javadocs,然后思考,找出正确的代码应该是什么并编写/测试它。我们不是在这里为您更正您的代码。那是你的工作......
    • 但是我的servlet是第一次从inputstream中读取数据,正在接收手机号,说明客户端默认没有设置GET请求
    • 阅读此内容:docs.oracle.com/javase/7/docs/api/java/net/… ... 请注意有关默认方法的内容。
    • 在这个问题中,他也试图使用 URL 重复相同的循环;Connection stackoverflow.com/questions/9370378/…
    • 那么这是否意味着在下一个循环中使用 URLConnection 没有办法做到这一点?
    【解决方案2】:

    你想要的都是不可能的。嗯,这就是我的想法。我以前从未见过这样的http通信。如果可能的话,那将是非常有趣的。

    在一个“会话”中,您希望服务器从客户端接收某些内容。寄东西回来。客户阅读。然后客户端再次发送服务器应该读取的数据。

    【讨论】:

    • 那我该怎么做呢?
    • 在您相信我之前,您可以尝试调整您的代码。特别是 - 正如其他人所说 - 不要创建两个 OutputStreamWriter。并搜索完成此类通信的示例代码。也许在您编写自己的服务器时是可能的。
    • 如何在不创建两个 OutputStream 对象的情况下做到这一点?刷新后我不能使用同一个对象
    • 为什么不呢?从来没有听说过。关闭后你的意思是!
    • 关闭输出流后object.out.close()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2010-12-18
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    相关资源
    最近更新 更多