分享一个实用的网络连接类

手机开发中常常需要用到网络连接发送数据,像web一样,手机中的请求也有GET请求和POST请求之分。
 以下是一个HttpProcess类,它提供了POST和GET请求的方式。 

 

package com.thinkrace.UCHome.network;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;

/**
 *
 * @author Administrator
 */
public class HttpProcess {

    /**
     * HTTP GET请求方式
     * 此方法读取返回的xml时是一个字符一个字符读取的。
     * @param url
     * @return
     */
    public static String HttpGET(String url) {
        String content = null;
        try {
            //打开网络连接
            HttpConnection hc = (HttpConnection) Connector.open(url);
            hc.setRequestMethod(HttpConnection.GET);
            InputStreamReader isr = new InputStreamReader(hc.openInputStream(), "UTF-8");
            int ch = 0;
            StringBuffer buf = new StringBuffer();
            while ((ch = isr.read()) != -1) {
                buf.append((char) ch);
            }
            //关闭流
            isr.close();
            hc.close();
        } catch (IOException ex) {
            System.out.println("HttpGET方法出现异常");
            ex.printStackTrace();
        }
        return content;
    }

    /**
     * 分配固定内存的GET请求,无论返回的xml有多大,总是只显示5k
     * 超出的部分会被截断,剩余的将会用空白补齐
     * @param url
     * @return
     */
    public static String HttpGETByAssignMemory(String url) {
        String content = null;
        try {
            HttpConnection hc = (HttpConnection) Connector.open(url);
            hc.setRequestMethod(HttpConnection.GET);
            DataInputStream dis = new DataInputStream(hc.openDataInputStream());
            //分配5K的内存
            byte[] data = new byte[1024 * 5];
            dis.read(data);
            content = new String(data, "UTF-8");
        } catch (IOException ex) {
            System.out.println("HttpGETByAllocateMemory方法出现异常");
            ex.printStackTrace();
        }
        return content;
    }

    public static String HttpPOST(String url, String argument) {
        String xml = null;
        try {
            HttpConnection hc = (HttpConnection) Connector.open(url, Connector.READ_WRITE);
            hc.setRequestMethod(HttpConnection.POST);
            //设置POST的头信息,UserAgent(设置代理),Content-Language(语言),Content-Type(类型),Content-Length(POST的长度)
            hc.setRequestProperty("User-Agent", "Profile/MIDP-2.0 Configuration/CLDC-1.1");
            hc.setRequestProperty("Content-Language", "en-US");
            hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            byte[] postData = argument.getBytes("UTF-8");
            hc.setRequestProperty("Content-Length",
                            Integer.toString(postData != null ? postData.length : 0));

            OutputStream out = hc.openOutputStream();
            out.write(postData);
            InputStream in = hc.openInputStream();
            DataInputStream dis = new DataInputStream(in);
            int ch = 0;
            StringBuffer buf = new StringBuffer();
            while((ch = dis.read()) != -1){
                buf.append((char)ch);
            }
            xml = buf.toString();
        } catch (IOException ex) {
            System.out.println("HttpPOST方法出现异常");
            ex.printStackTrace();
        }
        return xml;
    }

    /**
     * String转换成byte数组
     * @param str
     * @return
     */
    public static byte[] StringtoBytes(String str) {
        byte[] data = null;
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeUTF(str);
            data = baos.toByteArray();
            baos.close();
            dos.close();
        } catch (Exception ex) {
            System.out.println("StringtoBytes方法出现异常");
            ex.printStackTrace();
        }
        return data;
    }

    /**
     * byte[]数组转换成String
     * @param data
     * @return
     */
    public static String BytesToString(byte[] data) {
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        DataInputStream dis = new DataInputStream(bais);
        String str = null;
        try {
            str = dis.readUTF();
            bais.close();
            dis.close();
        } catch (Exception ex) {
            System.out.println("BytesToString方法出现异常");
            ex.printStackTrace();
        }
        return str;
    }
}

 

以下载一张小图片为例子,一个较为简单的HTTP连接的demo。
支持CMNET及CMWAP两种不同的接入方式,以及在CMWAP接入方式下,过滤移动资费页面。
在6120c上测试通过。

以下载一张小图片为例子,一个较为简单的HTTP连接的demo。
支持CMNET及CMWAP两种不同的接入方式,以及在CMWAP接入方式下,过滤移动资费页面。
在6120c上测试通过。

 

 
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.HttpConnection;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.StringItem;
import javax.microedition.midlet.MIDlet;
/**
 * HttpDemo
 * 
 * @author kf156(亚日)
 * 
 */
public class HttpTest extends MIDlet implements CommandListener, Runnable {
 public static final byte WAIT = 0;// 等待
 public static final byte CONNECT = 1;// 连接中
 public static final byte SUCCESS = 2;// 成功
 public static final byte FAIL = 3;// 失败
 int state;// 当前状态
 Display display = Display.getDisplay(this);
 Form form = new Form("HttpTest");
 boolean cmnet = true;// 接入点为cmnet还是cmwap
 StringBuffer sb = new StringBuffer("当前接入方式为:CMNET\n");
 StringItem si = new StringItem(null, sb.toString());
 Command connect = new Command("联网", Command.OK, 1);
 Command change = new Command("改变接入点方式", Command.OK, 2);
 Command exit = new Command("退出", Command.EXIT, 1);
 HttpConnection http;
 String host = "wiki.huihoo.com";
 String path = "/images/9/9c/Java.gif";
 public HttpTest() {
  state = WAIT;// 等待状态
  form.append(si);
  form.addCommand(connect);
  form.addCommand(change);
  form.addCommand(exit);
  form.setCommandListener(this);
 }
 protected void destroyApp(boolean b) {
 }
 protected void pauseApp() {
 }
 protected void startApp() {
  display.setCurrent(form);
 }
 public void commandAction(Command c, Displayable d) {
  if (c == change) {// 改变接入点
   if (isConnect())
    return;
   cmnet = !cmnet;
   form.deleteAll();
   sb.delete(0, sb.length());
   addStr("当前接入方式为:" + (cmnet ? "CMNET" : "CMWAP"));
   form.append(si);
  } else if (c == connect) {// 联网
   if (isConnect())
    return;
   new Thread(this).start();
  } else if (c == exit) {// 退出
   destroyApp(true);
   notifyDestroyed();
  }
 }
 public void run() {
  form.deleteAll();
  sb.delete(0, sb.length());
  addStr("当前接入方式为:" + (cmnet ? "CMNET" : "CMWAP"));
  form.append(si);
  state = CONNECT;
  addStr("网络连接中...");
  InputStream is = null;
  try {
   String url = null;
   url = cmnet ? ("http://" + host + path)
     : ("http://10.0.0.172:80" + path);
   http = (HttpConnection) Connector.open(url, Connector.READ_WRITE,
     true);
   if (!cmnet)
    http.setRequestProperty("X-Online-Host", host);
   http.setRequestMethod(HttpConnection.GET);
   String contentType = http.getHeaderField("Content-Type");
   System.out.println(contentType);
   addStr(contentType);
   if (contentType != null
     && contentType.indexOf("text/vnd.wap.wml") != -1) {// 过滤移动资费页面
    addStr("移动资费页面,过滤!");
    http.close();
    http = null;
    http = (HttpConnection) Connector.open(url,
      Connector.READ_WRITE, true);
    if (!cmnet)
     http.setRequestProperty("X-Online-Host", host);
    http.setRequestMethod(HttpConnection.GET);
    contentType = http.getHeaderField("Content-Type");
   }
   addStr("Content-Type=" + contentType);
   int code = http.getResponseCode();
   addStr("HTTP Code :" + code);
   if (code == 200) {
    addStr("网络联网成功,接收数据...");
    is = http.openInputStream();
    Image image = Image.createImage(is);
    addStr("数据接收完毕,显示图片");
    form.append(image);
    // 普通字节数据接收
    // byte[] b = new byte[1024];
    // int len = 0;
    // ByteArrayOutputStream baos = new ByteArrayOutputStream();
    // DataOutputStream dos = new DataOutputStream(baos);
    // while ((len = is.read(b)) != -1) {
    // dos.write(b, 0, len);
    // }
    // dos.close();
    // dos = null;
    // is.close();
    // is = null;
    state = SUCCESS;
    return;
   } else {
    addStr("访问页面失败");
   }
  } catch (IOException e) {
   addStr("联网发生异常:" + e.toString());
   e.printStackTrace();
  } catch (Exception e) {
   addStr("发生异常:" + e.toString());
   e.printStackTrace();
  } finally {
   if (is != null) {
    try {
     is.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
    is = null;
   }
   if (http != null)
    try {
     http.close();
    } catch (IOException e) {
     e.printStackTrace();
    }
   http = null;
  }
  state = FAIL;
 }
 /**
  * 判断是否正在连接
  * 
  * @return
  */
 private boolean isConnect() {
  if (state == CONNECT) {
   addStr("网络连接中,请稍候...");
   return true;
  }
  return false;
 }
 /**
  * 添加文字
  * 
  * @param str
  *            要添加的文字
  */
 private void addStr(String str) {
  sb.append(str + "\n");
  si.setText(sb.toString());
 }
}

 

posted @ 2009-12-06 02:09  Sunny Peng  阅读(2814)  评论(2编辑  收藏  举报