2013-04-04 635 views
1

我從將gae-server發送到客戶端的數據有問題。一切工作在本地環境中,但不在Google的服務器環境中,我得到一個IOException。所有的GAE中的IOException異常1.7.4

首先,我一個JSON文件發送到我的GAE服務器...

url = new URL("http://xxxserver.appspot.com/xxxserver") 
       HttpURLConnection connection = (HttpURLConnection)url.openConnection(); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", "application/json"); 
      connection.setRequestProperty("Content-Length", "" + json.toString().getBytes("UTF8").length); 
      connection.setRequestProperty("Content-Language", "en-US"); 
      connection.setUseCaches (false); 
      connection.setDoInput(true); 
      connection.setDoOutput(true);  
      connection.setConnectTimeout(40000); //40 seconds 

的JSON字符串,whick應發回正確創建。它看起來像如下:

{"location1 cost_char":"0.77","location1 cost_reim":"0.0","location2 dist":"34.02","location1 dist":"2.76"} 

服務器接收文件,正確創建JSON字符串,但隨後一個IOException崩潰時,它應該刷新JSON字符串回:

//Send data to server 
    try { 
    resp.setContentLength(json.toString().getBytes("UTF8").length); 
    resp.setContentType("application/json"); 
     Writer wr = new BufferedWriter (new OutputStreamWriter (resp.getOutputStream()));   
     try { 
      wr.write(json.toString()); 
      wr.flush();  //crash!!!!!!!!!!!!! 
     } 
     finally { 
      if (wr != null) 
        logger.info(TAG +"test6"); 
       wr.close(); 
     } 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
     logger.info(TAG +": IO Error"); 
     String temp = getStackTrace (e); 
    logger.warning(TAG +": Exception is: " +temp); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
     logger.warning(TAG +": Exception is: " +e); 
    } 

客戶端接收數據:

//Get response from server 
      try { 
       InputStreamReader is = new InputStreamReader (connection.getInputStream()); 
       BufferedReader rd = new BufferedReader(is); //BufferedInputStreams works on byte streams. BufferedReaders works on character streams. 
       String line; 
       response = new StringBuffer();  
       try { 
        while((line = rd.readLine()) != null) { 
         response.append(line); 
         Log.d(TAG, "Received Data: " +line); 
        } 
        Log.v("Abrage:" ,"data received"); 
       } 
       finally { 
        if (rd != null) 
         rd.close(); 
       } 

這裏是堆棧跟蹤:

com.lemtex.carpoolio.server.CarpoolioServerServlet doPost: CarpoolioServerServlet: Exception is: java.io.IOException: Closed 
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:629) 
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:579) 
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:220) 
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:290) 
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:294) 
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:140) 
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) 
at java.io.BufferedWriter.flush(BufferedWriter.java:253) 
at com.lemtex.carpoolio.server.CarpoolioServerServlet.doPost(CarpoolioServerServlet.java:387) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:57) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266) 
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
at org.mortbay.jetty.Server.handle(Server.java:326) 
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146) 
at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447) 
at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:466) 
at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:473) 
at com.google.tracing.TraceContext.runInContext(TraceContext.java:694) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338) 
at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330) 
at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:470) 
at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
at java.lang.Thread.run(Thread.java:679) 

任何解決方案?

回答

0

好吧,我解決我的問題。我關閉了OutputStream的與 resp.getOutputStream().close();數據被髮送之前....

0
resp.setContentLength(json.toString().getBytes("UTF8").length); 

可能不是相同的長度,你用.toString()送什麼,尤其是如果它不是純ASCII,這我猜你要發送的ASCII字符集以外的擴展字符。

wr.write(json.toString()); 

並且服務器可能在整個字符串被寫入之前關閉連接。 要麼獲得String的實際長度,要麼發送獲得長度的.getBytes("UTF8")版本。你不能像你一樣做到一半。

您沒有顯示足夠的代碼來實際診斷問題,我們所能做的只是猜測。

+0

我改成了(我犯同樣的錯誤,JSON發送到服務器時): resp.setContentLength(json.toString()長度(),但該IOException的問題仍然存在還\t resp.getOutputStream()寫(json.toString()的getBytes());。。。。 \t \t \t \t resp.getOutputStream( ).flush(); does not't。在本地環境一切工作正常。 – user2242982 2013-04-04 03:34:24