分享一个实用的网络连接类
手机开发中常常需要用到网络连接发送数据,像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()); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器