2010-04-08 40 views
3

我正在開發一個應用程序使用J2ME發送GPS座標接收到服務器,我是新開發客戶端服務器應用。PWC1406:Servlet.service()拋出異常java.io.IOException:無效的塊頭當客戶端發送數據到服務器

一切工作正常使用諾基亞N97mi​​ni或E71。但是當我在HTC HD2上試用它時,我從服務器上得到了異常。我使用Netbeans 6.5.1 GlassFish V2作爲服務器。我不知道爲什麼這個錯誤只發生在HTC HD2上。任何幫助將不勝感激。謝謝...

以下是錯誤消息:

StandardWrapperValve[FindHospitalServlet]: PWC1406: Servlet.service() for servlet FindHospitalServlet threw exception 
java.io.IOException: Invalid chunk header 
    at org.apache.coyote.http11.filters.ChunkedInputFilter.doRead(ChunkedInputFilter.java:171) 
    at org.apache.coyote.http11.InternalInputBuffer.doRead(InternalInputBuffer.java:719) 
    at org.apache.coyote.Request.doRead(Request.java:482) 
    at org.apache.coyote.tomcat5.InputBuffer.realReadBytes(InputBuffer.java:342) 
    at org.apache.tomcat.util.buf.ByteChunk.substract(ByteChunk.java:378) 
    at org.apache.coyote.tomcat5.InputBuffer.readByte(InputBuffer.java:351) 
    at org.apache.coyote.tomcat5.CoyoteInputStream.read(CoyoteInputStream.java:159) 
    at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:320) 
    at java.io.DataInputStream.readUTF(DataInputStream.java:572) 
    at java.io.DataInputStream.readUTF(DataInputStream.java:547) 
    at myPackage.FindHospitalServlet.doPost(FindHospitalServlet.java:28) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) 
    at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:315) 
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94) 
    at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587) 
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096) 
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579) 
    at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263) 
    at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214) 
    at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380) 
    at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265) 
    at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106) 

下面是我寫的連接到服務器的代碼:

private void connectFindHospServlet() 
{ 
    String url = "http://172.22.190.13:8080/UpdateServlet/FindHospitalServlet"; 
    StringBuffer sb = new StringBuffer(); 

    String info = lat+"!"+lng+"!"; 

    try 
    { 
     HttpConnection c = (HttpConnection) Connector.open(url); 
     c.setRequestProperty("User-Agent","Profile/MIDP-2.0, Configuration/CLDC-1.0"); 
     c.setRequestProperty("Content-Language","en-US"); 
     c.setRequestMethod(HttpConnection.POST); 

     DataOutputStream os = (DataOutputStream)c.openDataOutputStream(); 
     os.writeUTF(info); 
     os.flush(); 
     os.close(); 

     // Get the response from the servlet page. 
     DataInputStream is =(DataInputStream)c.openDataInputStream(); 

     int ch; 
     sb = new StringBuffer(); 

     while ((ch = is.read()) != -1) 
      sb.append((char)ch); 

     is.close(); 
     c.close(); 

     if(sb.toString().charAt(0) == 'n') 
     { 
      formDisplayResultFindHosp(); 
      display.setCurrent(formDisplayResultFindHosp); 
     } 
     else 
     { 
      PlannerMain pm = new PlannerMain(); 
      hospInfo = pm.getFindHospInfo(sb.toString().substring(0, sb.length()-2)); 
      formDisplayResultFindHosp(hospInfo); 
      display.setCurrent(formDisplayResultFindHosp); 
     } 
    } 
    catch (Exception e) 
    { 
     System.out.println("Error recieve find user"); 
    } 
} 

理解需要更好地幫助任何信息問題,請讓我知道。我會盡量提供。

回答

0

服務器顯然試圖將它作爲分塊流讀取。這可能是由於客戶端自動設置了Transfer-Encoding: chunked標題,因爲在寫入請求正文之前尚未設置標頭Content-Length

所以,第一步解決這個問題,將設置HTTP Content-Length頭:

c.setRequestProperty("Content-Length", info.getBytes("UTF-8").length); 
+0

您好, 感謝您的答覆。 c.setRequestProperty(String,String)所需的參數; (「UTF-8」)。長度返回int c.setRequestProperty(「Content-Length」,「」+ info.getBytes(「UTF-8」)。length) ; 我不確定這是否是正確的做法。但無論如何,我仍然收到相同的錯誤信息。任何其他想法? – Nivek 2010-04-09 08:03:38

相關問題