2010-04-08 16 views
3

Je développe une application en utilisant J2ME pour envoyer les coordonnées GPS reçues au serveur et je suis nouveau client à développer application serveur.PWC1406: Servlet.service() a jeté exception java.io.IOException: en-tête de bloc non valide Lorsque le client envoie des données au serveur

Tout fonctionne correctement avec l'utilisation du Nokia N97mini ou E71. Mais quand je l'ai essayé sur HTC HD2, je reçois l'exception du serveur. J'utilise Netbeans 6.5.1 GlassFish V2 en tant que serveur. Je ne sais pas pourquoi cette erreur se produit uniquement sur le HTC HD2. Toute aide est la bienvenue. Merci ...

Voici le message d'erreur:

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) 

est Ci-dessous le code que je l'ai écrit pour se connecter au serveur:

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"); 
    } 
} 

Toute information nécessaire pour mieux aider à comprendre le problème, faites le moi savoir. Je vais essayer de fournir autant que possible.

Répondre

0

Le serveur tente apparemment de le lire en tant que flux segmenté. Cela peut être dû au fait que le client a automatiquement défini l'en-tête Transfer-Encoding: chunked car l'en-tête Content-Length n'a pas été défini avant d'écrire le corps de la demande.

Ainsi, la première étape pour résoudre ce problème allait mettre l'en-tête HTTP Content-Length:

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

Salut, Merci pour la réponse. Le paramètre requis pour c.setRequestProperty (String, String); donc je l'ai fait comme info.getBytes ("UTF-8"). Longueur renvoie int c.setRequestProperty ("Content-Length", "" + info.getBytes ("UTF-8"). Longueur) ; Je ne suis pas sûr si c'est la bonne façon de le faire. Mais de toute façon je reçois toujours le même message d'erreur. D'autres idées? – Nivek