这是我的客户端代码。客户端发送手机号码。到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);
}
答案 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.websocket
和javax.websocket.server
包;见here。
还有其他的websockets实现; Google for&#34; java websocket&#34;以及合作的客户端和服务器可以通过其他非标准方式执行此操作。但这超出了HttpURLConnection API或实现将支持的范围。
答案 1 :(得分:0)
你想要的是不可能的。那就是我的想法。我之前从未见过这样的http通讯。如果可能的话,它会非常有趣。
在一个&#39;会话中&#39;您希望服务器从客户端接收内容。送回去的东西。客户端读取的内容。然后客户端再次发送服务器应该读取的数据。