最佳的线程联网类

来源:互联网 发布:淘宝买到阿普唑仑片 编辑:程序博客网 时间:2024/05/18 03:42
首先看看例子,代码注释写的很清楚,看懂还是比较容易的。代码import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import javax.microedition.io.Connector;import javax.microedition.io.HttpConnection;import javax.microedition.lcdui.Alert;import javax.microedition.lcdui.AlertType;import javax.microedition.lcdui.Choice;import javax.microedition.lcdui.ChoiceGroup;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.TextField;import javax.microedition.midlet.MIDlet;/*** HttpDemo 增加网址输入以及取消功能** @author kf156(亚日)**/public class HttpTest extends MIDlet implements CommandListener {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");// StringBuffer sb = new StringBuffer("");// StringItem si = new StringItem(null, sb.toString());Command connect = new Command("联网", Command.OK, 1);Command cls = new Command("清除网址", Command.OK, 1);Command cancel = new Command("取消", Command.CANCEL, 1);Command exit = new Command("退出", Command.EXIT, 1);Command back = new Command("返回", Command.BACK, 1);ChoiceGroup cmwapCG;// 接入方式TextField urlTF;// 网址输入框String url;// 网址Http http;// 网络线程Form page;// 页面Alert waitPage;// 等待界面public HttpTest() {state = WAIT;// 等待状态// 初始化等待界面waitPage = new Alert("请等待", "网络连接中...", null, AlertType.INFO);waitPage.addCommand(cancel);waitPage.setCommandListener(this);waitPage.setTimeout(Alert.FOREVER);// 初始化页面page = new Form("访问的页面");page.addCommand(back);page.setCommandListener(this);// 初始化cmwapCG = new ChoiceGroup("网络接入方式:", Choice.MULTIPLE,new String[] { "CMWAP" }, null);urlTF = new TextField("请输入网址:","http://avatar.csdn.net/5/F/0/2_kf156.jpg", 100, TextField.URL);form.append(cmwapCG);form.append(urlTF);// form.append(si);form.addCommand(connect);form.addCommand(cls);// form.addCommand(cancel);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 == connect) {// 联网if (checkError())return;// display.setCurrent(waitPage);http = new Http();new Thread(http).start();} else if (c == cancel) {// 取消http.cancel();http = null;display.setCurrent(form);} else if (c == back) {// 返回page.deleteAll();display.setCurrent(form);} else if (c == cls) {// 清除数据// cls();urlTF.setString("");} else if (c == exit) {// 退出destroyApp(true);notifyDestroyed();}}// private void cls() {// form.deleteAll();// 删除日志// sb.delete(0, sb.length());// si.setText(null);// form.append(cmwapCG);// form.append(urlTF);// form.append(si);// }/*** 判断是否正确** @return*/private boolean checkError() {url = urlTF.getString();if (state == CONNECT) {addStr("当前已有网络连接,请稍候");return true;} else if (url == null || url.trim().equals("")) {addStr("url不能为空");return true;}if (!url.toLowerCase().startsWith("http://")) {// 添加http://url = "http://" + url;}System.out.println(url);return false;}/*** 添加文字** @param str* 要添加的文字*/private void addStr(String str) {// sb.append(str + "/n");// si.setText(sb.toString());System.out.println(str);}/*** 获取URL域名** @param srcUrl* @param domain* true为截域名,false为截地址* @return*/private String getURLhost(String srcUrl) {int k = srcUrl.toLowerCase().indexOf("/", 7);if (k == -1)return srcUrl.substring(7);return srcUrl.substring(7, k);}/**** 字符串替换方法(字符串替换字符串)** @author kf156** @param text* 文本* @param oldStr* 旧字符串* @param newStr* 新字符串* @return*/public static String replace(String text, String oldStr, String newStr) {int oldLen = oldStr.length();int k = 0;while (k + oldLen <= text.length()) {// 检测到字符串末尾k = text.indexOf(oldStr, k);// 从k处查找oldStr,并返回位置if (k == -1)// 若查不到,则跳出return text;// 若有,则将其替换为newStrtext = text.substring(0, k) + newStr+ text.substring(k += oldLen, text.length());}return text;}class Http implements Runnable {HttpConnection http;boolean cancel;// 是否取消public void cancel() {cancel = true;state = WAIT;// 等待状态}public void run() {// cls();state = CONNECT;addStr("网络连接中...");InputStream is = null;try {boolean cmwap = cmwapCG.isSelected(0);// 是否走CMWAPString host = getURLhost(url);System.out.println(host);String _url = cmwap ? replace(url, host, "10.0.0.172:80") : url;http = (HttpConnection) Connector.open(_url, Connector.READ,true);if (cmwap)http.setRequestProperty("X-Online-Host", host);http.setRequestMethod(HttpConnection.GET);cmwapCG.setSelectedIndex(0, true);String contentType = http.getHeaderField("Content-Type");// System.out.println(contentType);addStr("Content-Type=" + contentType);if (cancel) {// 中途结束addStr("已取消");return;}if (contentType != null&& contentType.indexOf("text/vnd.wap.wml") != -1) {// 过滤移动资费页面addStr("移动资费页面,过滤!");http.close();http = null;http = (HttpConnection) Connector.open(_url,Connector.READ, true);if (cmwap)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();byte[] b = new byte[1024];int len = 0;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(baos);while ((len = is.read(b)) != -1) {if (cancel) {// 中途结束addStr("已取消");return;}dos.write(b, 0, len);}byte[] data = baos.toByteArray();if (contentType != null&& contentType.toLowerCase().indexOf("image") != -1) {// 图片try {Image image = Image.createImage(data, 0,data.length);addStr("数据接收完毕,显示图片");// form.append(image);page.append(image);} catch (Exception e) {addStr("生成图片失败 " + e.toString());page.append("生成图片失败 " + e.toString());}} else { // 文字addStr("数据接收完毕,显示内容");String s = null;if (contentType != null&& contentType.toLowerCase().indexOf("utf-8") != -1)s = new String(data, "UTF-8");elses = new String(data);// form.append(s);page.append(s);}data = null;dos.close();dos = null;baos.close();baos = null;is.close();is = null;state = SUCCESS;} else {addStr("访问页面失败");page.append("访问页面失败: " + code);state = FAIL;}} catch (IOException e) {addStr("联网发生异常:" + e.toString());e.printStackTrace();if (!cancel)page.append("网络异常:" + e.toString());state = FAIL;} catch (Exception e) {addStr("发生异常:" + e.toString());e.printStackTrace();if (!cancel)page.append("异常:" + e.toString());state = FAIL;} finally {if (is != null) {// 关闭istry {is.close();} catch (IOException e) {e.printStackTrace();}is = null;}if (http != null) {// 关闭httptry {http.close();} catch (IOException e) {e.printStackTrace();}http = null;}}if (!cancel)display.setCurrent(page);// 显示页面}}} 下面的代码是我用LWUIT改造的代码,代码可以自己修改一下,让代码结构更良好,可以把Http类抽出来。 代码import com.sun.lwuit.CheckBox;import com.sun.lwuit.Command;import com.sun.lwuit.Display;import com.sun.lwuit.Form;import com.sun.lwuit.Image;import com.sun.lwuit.Label;import com.sun.lwuit.TextField;import com.sun.lwuit.events.ActionEvent;import com.sun.lwuit.events.ActionListener;import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import java.io.IOException;import java.io.InputStream;import javax.microedition.io.Connector;import javax.microedition.io.HttpConnection;import javax.microedition.midlet.*;/*** @author 水货程序员* Demo作为学习交流使用*/public class HttpTest extends MIDlet implements ActionListener {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;Command connect = new Command("联网", 1);Command cls = new Command("清除网址", 2);Command cancel = new Command("取消", 3);Command exit = new Command("退出", 4);Command back = new Command("返回", 5);CheckBox cmwapCG;//接入方式TextField urlTF;//网址输入框String url;//网址Http http;//网络线程Form page;//页面Form waitPage;//等待界面public void actionPerformed(ActionEvent evt) {int cmdId = evt.getCommand().getId();switch (cmdId) {case 1://连接if (checkError()) {return;}http = new Http();new Thread(http).start();break;case 2://清除网址urlTF.setText("");break;case 3://取消http.cancel();http = null;showTestForm();break;case 4://退出destroyApp(true);notifyDestroyed();break;case 5://返回showTestForm();break;}}/*** 在LWUIT的主类里面,Form不能声明为属性,否则会出现NullPointerException。* 取得图片后,再返回时,重新new一下cmwapCB,urlTF,否则会报* Component is already contained in Container的异常。*/public void showTestForm() {Form form = new Form("HttpTest");cmwapCG = new CheckBox("CMWAP");urlTF = new TextField("http://avatar.csdn.net/5/F/0/2_kf156.jpg");form.addComponent(cmwapCG);form.addComponent(urlTF);form.addCommand(connect);form.addCommand(cls);form.addCommand(exit);form.addCommandListener(this);form.show();}public void startApp() {Display.init(this);state = WAIT;//等待//waitPage = new Form()page = new Form("访问的页面");page.addCommand(back);page.addCommandListener(this);cmwapCG = new CheckBox("CMWAP");urlTF = new TextField("http://avatar.csdn.net/5/F/0/2_kf156.jpg");url = urlTF.getText();showTestForm();}public void pauseApp() {}public void destroyApp(boolean unconditional) {}/*** 检验URL正确性* @return*/private boolean checkError() {url = urlTF.getText();if (state == CONNECT) {System.out.println("当前已有网络连接,请稍后");return true;} else if (url == null || url.trim().equals("")) {return true;}if (!url.toLowerCase().startsWith("http://")) {// 添加http://url = "http://" + http;}System.out.println(url);return false;}/*** 获取URL域名* 例如http://www.google.cn,域名为www.google.cn* http://blog.csdn.net/pjw100,域名为blog.csdn.net,会把/pjw100截掉。* @param srcUrl* @return*/private String getURLhost(String srcUrl) {int k = srcUrl.toLowerCase().indexOf("/", 7);if (k == -1) {return srcUrl.substring(7);}return srcUrl.substring(7, k);}public static String replace(String text, String oldStr, String newStr) {int oldLen = oldStr.length();int k = 0;while (k + oldLen < text.length()) {//检测到字符串末尾k = text.indexOf(oldStr, k);//查找字符串if (k == -1) {//若查不到,跳出return text;}//有则替换text = text.substring(0, k) + newStr + text.substring(k += oldLen, text.length());}return text;}class Http implements Runnable {HttpConnection http;boolean cancel;//是否取消public void cancel() {cancel = true;state = WAIT;//等待状态}public void run() {state = CONNECT;System.out.println("网络连接中...");InputStream is = null;try {boolean cmwap = cmwapCG.isSelected();String host = getURLhost(url);System.out.println(host);String _url = cmwap ? replace(url, host, "10.0.0.172:80") : url;http = (HttpConnection) Connector.open(_url, Connector.READ, true);if (cmwap) {http.setRequestProperty("X-Online-Host", host);}http.setRequestMethod(HttpConnection.GET);String contentType = http.getHeaderField("Content-Type");if (cancel) {//中途取消return;}if (contentType != null && contentType.indexOf("text/vnd.wap.wml") != -1) {//过滤移动资费http.close();http = null;http = (HttpConnection) Connector.open(_url, Connector.READ, true);if (cmwap) {http.setRequestProperty("X-Online-Host", host);}http.setRequestMethod(HttpConnection.GET);contentType = http.getHeaderField("Content-Type");}int code = http.getResponseCode();if (code == 200) {//联网成功is = http.openInputStream();byte[] b = new byte[1024];int len = 0;ByteArrayOutputStream baos = new ByteArrayOutputStream();DataOutputStream dos = new DataOutputStream(baos);while ((len = is.read(b)) != -1) {if (cancel) {//取消return;}dos.write(b, 0, len);}byte[] data = baos.toByteArray();if (contentType != null && contentType.toLowerCase().indexOf("image") != -1) {try {Image image = Image.createImage(data, 0, data.length);System.out.println("数据接收完毕,显示图片");Label l = new Label(image);page.addComponent(l);} catch (Exception ex) {System.out.println("生成图片失败" + ex.toString());Label err = new Label("生成图片失败" + ex.toString());page.addComponent(err);}} else {//文字System.out.println("数据接收完毕,显示内容");String s = null;if (contentType != null && contentType.toLowerCase().indexOf("utf-8") != -1) {s = new String(data, "UTF-8");} else {s = new String(data);}page.addComponent(new Label(s));}data = null;dos.close();dos = null;baos.close();baos = null;is.close();is = null;state = SUCCESS;} else {page.addComponent(new Label("访问页面失败:" + code));state = FAIL;}} catch (IOException ex) {System.out.println("联网发生异常:" + ex.toString());ex.printStackTrace();if (!cancel) {page.addComponent(new Label("网络异常:" + ex.toString()));}state = FAIL;} catch (Exception ex) {System.out.println("发生异常" + ex.toString());ex.printStackTrace();if (!cancel) {page.addComponent(new Label("异常:" + ex.toString()));}state = FAIL;} finally {if (is != null) {//关闭istry {is.close();} catch (IOException ex) {ex.printStackTrace();}is = null;}if (http != null) {//关闭httptry {http.close();} catch (IOException ex) {ex.printStackTrace();}http = null;}}if (!cancel) {page.show();}}}}