InputStream没有读任何东西

时间:2014-06-30 08:03:52

标签: java android servlets urlconnection

这是我的客户端代码。客户端发送手机号码。到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);
    }

2 个答案:

答案 0 :(得分:1)

三个问题:

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

  • 您的服务器端似乎是针对POST请求编码的,但客户端没有设置任何方法类型。 (它默认发送GET请求......)

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


<强>更新

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

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

我怀疑那会奏效。当您关闭原始输出流时,应该关闭基础Socket的输出端。它无法重新打开。如果它没有关闭Socket我会期望getOutputStream()调用抛出

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

基本上,HttpURLConnection API的设计并非如此......


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

还有其他的websockets实现; Google for&#34; java websocket&#34;以及合作的客户端和服务器可以通过其他非标准方式执行此操作。但这超出了HttpURLConnection API或实现将支持的范围。

答案 1 :(得分:0)

你想要的是不可能的。那就是我的想法。我之前从未见过这样的http通讯。如果可能的话,它会非常有趣。

在一个&#39;会话中&#39;您希望服务器从客户端接收内容。送回去的东西。客户端读取的内容。然后客户端再次发送服务器应该读取的数据。