2011-09-03 92 views
0

Im有困难与HttpConnection发布数据到我的服务器。第一次一切顺利。第二次它说; '流已经打开',但是我在响应后关闭了所有内容。j2me openOutputStream流已经打开

这里是我的代码:

import javax.microedition.io.Connector; 
import javax.microedition.io.HttpConnection; 
import javax.microedition.location.*; 
import java.io.*; 

class GetSnowheights 
{  
    HttpConnection http = null; 
    QualifiedCoordinates q = null; 
    public String result = "Geen data"; 
    private boolean running; 

    public GetSnowheights(QualifiedCoordinates q) {   
     try 
     { 
      /* 
      this.http = (HttpConnection)Connector.open("http://www.diamond4it.nl/bb/");     
      this.http.setRequestMethod(HttpConnection.POST); 
      this.http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
      */ 
      //Internet.getInstance(); 
      this.http = Internet.getConnection(); 
     }catch(Exception err){ 
      err.printStackTrace(); 
     } 
     this.q = q; 
     this.result = "Running"; 
    } 

    public void GetResult(){ 
     StringBuffer sb = new StringBuffer();   
     this.result = "GetResult"; 

     if(this.http != null){ 

      OutputStream os = null; 
      InputStream is = null; 
      try 
      { 
       //Send request 
       os = this.http.openOutputStream(); 
       String data = "lat=1&lng=1"; 
       //String data = "lat=" + this.q.getLatitude() + "&lng=" + this.q.getLongitude(); 
       os.write(data.getBytes()); 
       os.flush(); 
       os.close(); 
       this.result = "dataSend";     

       //Check response and read data 
       int res = this.http.getResponseCode(); 
       this.result = "Result: " + res; 
       if(res == 200){ 
        is = this.http.openInputStream(); 
        int ch; 
        // Check the Content-Length first 
        long len = this.http.getLength(); 
        if(len!=-1) { 
         for(int i = 0;i<len;i++){ 
          if((ch = is.read())!= -1){ 
           sb.append((char)ch); 
          } 
         } 
        } else { 
         // if the content-length is not available 
         while ((ch = is.read()) != -1){ 
          sb.append((char)ch); 
         } 
        } 
        is.close(); 
       } 

       this.result = sb.toString(); 

      }catch(Exception err){ 
       //err.printStackTrace(); 
       this.result = err.toString() + "\r\n" + err.getMessage(); 
      }finally{ 
       if(is != null){ 
        try{ 
         is.close(); 
        }catch(Exception err){ 
         err.printStackTrace(); 
        } 
       } 
       if(os != null){ 
        try{ 
         //os.flush(); 
         os.close(); 
        }catch(Exception err){ 
         err.printStackTrace(); 
        } 
       } 

       /* 
       if(http != null){ 
        try{ 
         http.close(); 
        }catch(Exception err){ 
         err.printStackTrace(); 
        } 
       } 
       */ 
      } 

     }else{ 
      this.result = "No connection"; 
     } 
    }  

} 
+0

你想重复使用'this.http'吗?也就是说,你是否不需要一个新的'HttpConnection'就多次调用'GetResult()'?我不认为这是允许的。 –

+0

它是一个Singleton类Internet,它返回一个有效的httpconnection。这个.http是这个类中的一个私有的,所以是的,我重用了它。 –

+0

好的,你可以为'GetSnowheights'类的每个实例调用'GetResult()'多次?这意味着你正试图重用'HttpConnection'。我自己从来没有这样做过,但它将我视为一个潜在的问题。如果在每次调用GetResult()之前重构代码以创建新的GetSnowheights实例呢? –

回答

0

2个想法:

  1. 你为什么在finally块注释掉http.close()?我们应该总是关闭HttpConnections。

  2. 难道你不能同时从几个线程调用GetResult()吗?如果是,则通过在其定义中添加​​关键字来使该方法同步。

P.S.我觉得这个班的设计有点误导。错误地使用它是很容易犯的错误。我将GetSnowheightsGetResult合并成唯一的同步方法。

+0

不行不行。仍然是同样的消息。即使与sinchronized void –

+0

然后,我只是不知道要提出什么。 –