国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用J2ME中的page進行編碼轉化

2019-11-18 12:44:04
字體:
來源:轉載
供稿:網友

一、摘要

  根據xinshouj2me在j2me版提出的“httpconnection網絡連接的問題”,本人分析了一下:由于www.163.com上的頁面編碼為gb2312,所以使用utf8讀取由于編碼方式不同會得到亂碼。于是本人根據page的編碼靈活進行編碼轉化,在此與大家共享、討論。

二、代碼分析

1.HttpConnectionHandler接口類
  最好根據page的編碼靈活進行編碼轉化,于是本人定義了一個HttpConnectionHandler接口類:

HttpConnectionHandler.java
package com.bjinfotech.PRactice.j2me.httpConnection;

import java.util.Hashtable;
import javax.microedition.io.HttpConnection;

/**
* Http連接處理器接口
* @author cleverpig
*
*/
public interface HttpConnectionHandler {
        //http請求常量
        public static final String RQH_HOST="X-Online-Host";
        public static final String RQH_ACCEPT="Accept";
        public static final String RQH_CONTENT_LANGUAGE="Content-Language";
        public static final String RQH_CONTENT_TYPE="Content-Type";
        public static final String RQH_CONNECTION_OPTION="Connection";
        //http回應常量
        public static final String RSH_DATE="Date";
        public static final String RSH_SERVER="Server";
        public static final String RSH_MODIFIEDDATE="Last-Modified";
        public static final String RSH_CONTENT_ENCODING="Content-Encoding";
        public static final String RSH_CONTENT_LENGTH="Content-Length";
        public static final String RSH_CONTENT_TYPE="Content-Type";
        
        public boolean putRequestHeaderProperty(
                        HttpConnection conn,
                        String key,
                        String keyValue);
        
        public String getResponseHeaderProperty(
                        HttpConnection conn,
                        String key);
        
        public boolean setRequestMethod(
                        HttpConnection conn,
                        String methodName);
        
        public boolean putRequestHeader(
                        HttpConnection conn,
                        Hashtable propertiesPair);
        
        public Hashtable getResponseHeader(
                        HttpConnection conn,
                        String[] propertyNames);
        
        public boolean sendRequestData(
                        HttpConnection conn,
                        Object sendData);
        
        public Object getResponseData(HttpConnection conn);
        
}

2.Html_HttpConnectionHandlerImpl類

  根據HttpConnectionHandler接口規范實現了該接口——HTML_HttpConnectionHandlerImpl類。

HTML_HttpConnectionHandlerImpl.java
package com.bjinfotech.practice.j2me.httpConnection;

import java.io.DataOutputStream;
import java.io.DataInputStream;
import java.util.Hashtable;
import java.util.Vector;
import java.util.Enumeration;
import javax.microedition.io.HttpConnection;

/**
* http連接處理器實現
* @author cleverpig
*
*/
public class HTML_HttpConnectionHandlerImpl implements HttpConnectionHandler{
        private String message="";
        
        public HTML_HttpConnectionHandlerImpl(){
        }
        
        public boolean putRequestHeaderProperty(
                        HttpConnection conn,
                        String key,
                        String keyValue){
                message="";
                try{
                        conn.setRequestProperty(key,keyValue);
                        return true;
                }
                catch(Exception ex){
                        message=ex.getMessage();
                }
                return false;
        }
        
        public String getResponseHeaderProperty(
                        HttpConnection conn,
                        String key){
                return conn.getRequestProperty(key);
        }
        
        public boolean putRequestHeader(
                        HttpConnection conn,
                        Hashtable propertiesPair){
                Enumeration keyEnumer=propertiesPair.keys();
                boolean result=true;
                while(keyEnumer.hasMoreElements()){
                        String keyName=(String)keyEnumer.nextElement();
                        String keyValue=(String)propertiesPair.get(keyName);
                        if (putRequestHeaderProperty(conn,keyName,keyValue)==false){
                                result=false;
                        }
                }
                return result;
        }
        
        public boolean setRequestMethod(
                        HttpConnection conn,
                        String methodName){
                message="";
                try{
                        conn.setRequestMethod(methodName);
                        return true;
                }
                catch(Exception ex){
                        message=ex.getMessage();
                        return false;
                }
        }
        
        public Hashtable getResponseHeader(
                        HttpConnection conn,
                        String[] propertyNames){
                Hashtable result=new Hashtable();
                for(int i=0;i<propertyNames.length;i++){
                        String keyValue=conn.getRequestProperty(propertyNames[i]);
                        result.put(propertyNames[i],keyValue);
                }
                return result;
        }
        
        public boolean sendRequestData(
                        HttpConnection conn,
                        Object sendData){
                message="";
                try{
                        DataOutputStream os=conn.openDataOutputStream();
                        os.writeUTF((String)(sendData));
                        os.flush();
                        return true;
                }
                catch(Exception ex){
                        message=ex.getMessage();
                        return false;
                }
        }
        
        public Object getResponseData(HttpConnection conn){
                DataInputStream is=null;
                message="";
                try{
                        is=conn.openDataInputStream();
                }
                catch(Exception ex){
                        message=ex.getMessage();
                        return null;
                }
                
                byte[] data=null;
                String type=getResponseHeaderProperty(conn,RSH_CONTENT_TYPE);
                int len = 0;
                try{
                        len=Integer.parseInt(getResponseHeaderProperty(conn,RSH_CONTENT_LENGTH));
                }
                catch(Exception ex){
                        len=0;
                }
                if (len > 0) {
             int actual = 0;
             int bytesread = 0 ;
             data = new byte[len];
             while ((bytesread != len) && (actual != -1)) {
                     try{
                             actual = is.read(data, bytesread, len - bytesread);
                             bytesread += actual;
                     }
                     catch(Exception ex){
                             message=ex.getMessage();
                             return null;
                     }
             }
        } else {
            int ch;
            Vector vbuffer=new Vector();
            try{
                    while ((ch = is.read()) != -1) {
                            vbuffer.addElement(new Integer(ch));
                    }
            }
                       catch(Exception ex){
                                message=ex.getMessage();
                                return null;
                       }
            len=vbuffer.size();
            data = new byte[len];
            for(int i=0;i<len;i++){
                    data[i]=((Integer)vbuffer.elementAt(i)).byteValue();
            }
        }
        
        String result=new String(data);
        int flagBeginPosition=result.indexOf("charset=");
        int flagEndPosition=result.indexOf("/">",flagBeginPosition);
        if (flagEndPosition>flagBeginPosition){
                type=result.substring(flagBeginPosition+"charset=".length(),flagEndPosition);
        }
        System.out.println("獲得html字符集:"+type);
        if (type!=null){
                
                try{
                        result=new String(data,type);
                }
                catch(Exception ex){
                        message=ex.getMessage();
                }
        }
        return result;
        }
        
        public String getMessage(){
                return message;
        }
        
        
}
上面實現類中根據page中的實際編碼類型對html字符串進行了編碼轉化,這樣就實現了page編碼的靈活轉化。
雖然靈活性加強了,但是對于內存的占用也隨之增加了一倍。

三.測試代碼

package com.bjinfotech.practice.j2me.httpConnection;

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.io.HttpConnection;
import javax.microedition.io.Connector;
import java.util.Hashtable;

public class HttpConnectionMIDlet extends MIDlet {

        public HttpConnectionMIDlet() {
                super();
        }

        
        protected void startApp() throws MIDletStateChangeException {
                HTML_HttpConnectionHandlerImpl handler=new HTML_HttpConnectionHandlerImpl();
                try{
                        String host="10.11.3.99";
                        String url="http://10.11.3.99:8080/test_gbk.html";
//                        String url="http://10.11.3.99:8080/test_gb2312.html";
//                        String url="http://10.11.3.99:8080/test_utf8.html";
                        
                        HttpConnection conn=(HttpConnection)Connector.open(url);
                        if (conn.getResponseCode()==HttpConnection.HTTP_OK){
                                System.out.println("建立連接成功");
                                
                                Hashtable requestHeaderPair=new Hashtable();
                                requestHeaderPair.put(
                                                HTML_HttpConnectionHandlerImpl.RQH_HOST,
                                                host);
                                requestHeaderPair.put(
                                                HTML_HttpConnectionHandlerImpl.RQH_CONTENT_TYPE,
                                                "application/octet-stream");
                                requestHeaderPair.put(
                                                HTML_HttpConnectionHandlerImpl.RQH_CONTENT_LANGUAGE,
                                                "en-US");
                                requestHeaderPair.put(
                                                HTML_HttpConnectionHandlerImpl.RQH_ACCEPT,
                                                "application/octet-stream");
                                requestHeaderPair.put(
                                                HTML_HttpConnectionHandlerImpl.RQH_CONNECTION_OPTION,
                                                "Keep-Alive");
                                handler.putRequestHeader(conn,requestHeaderPair);
                                handler.setRequestMethod(conn,HttpConnection.GET);
                                handler.sendRequestData(conn,"GET / HTTP/1.1");
                                if (conn.getResponseCode()==HttpConnection.HTTP_OK){
                                        System.out.println("發送請求成功");
                                        
                                        System.out.println("獲得回應數據");
                                        String reponseData=(String)handler.getResponseData(conn);
                                        System.out.println(reponseData);
                                }
                                else{
                                        System.out.println("發送請求失敗");
                                        System.out.println("錯誤信息:"+handler.getMessage());
                                }
                        }
                        else{
                                System.out.println("建立連接失敗");
                        }
                }
                catch(Exception ex){
                        System.out.println("錯誤信息:"+handler.getMessage());
                        ex.printStackTrace();
                }
                
        }       
        protected void pauseApp() {

        }
        protected void destroyApp(boolean arg0) throws MIDletStateChangeException {            
        }

}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 义马市| 宁津县| 马山县| 苏尼特左旗| 文昌市| 盐亭县| 桐柏县| 德令哈市| 铁岭市| 黄平县| 阿图什市| 宁津县| 昌乐县| 安岳县| 略阳县| 蕉岭县| 嘉鱼县| 江山市| 运城市| 昌平区| 闽清县| 隆化县| 庐江县| 定结县| 博湖县| 河东区| 楚雄市| 兴山县| 海阳市| 宜阳县| 自治县| 云霄县| 交口县| 班玛县| 崇左市| 连城县| 荣成市| 丽江市| 西宁市| 巩留县| 万山特区|