gpt4 book ai didi

java - 输入流不读取任何内容

转载 作者:行者123 更新时间:2023-12-01 12:48:10 25 4
gpt4 key购买 nike

这是我的客户端代码。客户端发送手机号码。到 Servlet。然后,Servlet 向客户端发送一个字符串,该字符串将由 Client 进行 Base64 编码。然后 Servlet 从 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);
}

最佳答案

三个问题:

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

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

  • 您没有检查 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

还有其他 websocket 实现;谷歌搜索“java websocket”,并且协作的客户端和服务器可以通过其他非标准方式来完成此操作。但这超出了 HttpURLConnection API 或实现所支持的范围。

关于java - 输入流不读取任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24485478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com