Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用outputStreamWriter()将字符串从应用程序发送到servlet_Java_Android_Http_Jakarta Ee_Servlets - Fatal编程技术网

Java 无法使用outputStreamWriter()将字符串从应用程序发送到servlet

Java 无法使用outputStreamWriter()将字符串从应用程序发送到servlet,java,android,http,jakarta-ee,servlets,Java,Android,Http,Jakarta Ee,Servlets,我正在尝试从我的应用程序向Java servlet发送一个小字符串: //Send user mobile number to the server. EditText cinMobile = (EditText)findViewById(R.id.mobile_no); String inputVal = cinMobile.getText().toString(); URL mobileurl = new URL(url); URLConnection connection = mobil

我正在尝试从我的应用程序向Java servlet发送一个小字符串:

//Send user mobile number to the server.
EditText cinMobile = (EditText)findViewById(R.id.mobile_no);
String inputVal = cinMobile.getText().toString();

URL mobileurl = new URL(url);
URLConnection connection = mobileurl.openConnection();
connection.setDoOutput(true);

OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream());
out.write(inputVal);
out.close();
servlet应该通过doPost()接收值:

但是当我运行命令并尝试发送字符串时,在servlet端的行
byte[]input=new byte[length]中会出现
负数组大小异常

Feb 01, 2014 2:06:02 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [project_server.Login] in context with path [/project_server] threw exception
java.lang.NegativeArraySizeException
    at project_server.Login.doPost(Login.java:47)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
我不确定这里出了什么问题,但这个错误意味着它没有收到任何字符串。 LogCat显示应用程序端没有错误

我不确定这里出了什么问题,但这个错误意味着它没有收到任何字符串

否,该错误表示您正在尝试创建长度为负的数组。这涉及到以下几点:

int length = request.getContentLength();                                
byte[] input = new byte[length];    
大概没有设置
Content-Length
标题,因此
getContentLength()
返回-1。您应该能够处理这个问题-只需从输入流读取,直到
read()
返回一个非正数。例如,您可以使用
ByteArrayOutputStream
复制数据。或者,您可以使用
StringBuilder
并围绕输入流创建
InputStreamReader

char[] buffer = new char[8192];
StringBuilder builder = new StringBuilder();
try (Reader reader = new InputStreamReader(request.getInputStream(), "UTF-8")) {
    int charsRead;
    while ((charsRead = reader.read(buffer)) > 0) {
        builder.append(buffer, 0, charsRead);
    }
}
String text = builder.toString();

注意我是如何将UTF-8指定为输入编码的——在写入数据时也应该指定相同的编码。目前,您依赖的平台默认编码在客户端与服务器上是相同的,这是一个坏主意。

您在日志中的request.getContentLength()中得到了什么值?@KamleshArya-1;与错误所说的差不多。类似:
char[] buffer = new char[8192];
StringBuilder builder = new StringBuilder();
try (Reader reader = new InputStreamReader(request.getInputStream(), "UTF-8")) {
    int charsRead;
    while ((charsRead = reader.read(buffer)) > 0) {
        builder.append(buffer, 0, charsRead);
    }
}
String text = builder.toString();