浅析J2ME终端使用http协议进行网络通信
- 格式:doc
- 大小:33.50 KB
- 文档页数:3
淮海工学院计算机工程学院实验报告书课程名:《手持设备软件开发》题目:实验4:J2ME网络程序设计班级:学号:姓名:statue评语:成绩:指导教师:批阅时间:年月日一、实验目的与要求掌握MIDP网络程序设计的一般方法。
能够使用GCF中的类和接口及多线程进行网络客户端应用程序的开发,掌握基于HTTP编程的方法,能够处理GET与POST请求。
理解MIDlet推注册及响应网络连接的步骤及方法。
二、实验内容使用Google Weather API开发一个可以显示连云港天气预报的J2ME网络程序。
具体的方法是请求网址:/ig/api?weather=lianyungang&hl=zh-cn然后处理响应返回的XML文档。
样例文档如下:<xml_api_reply version="1"><weather module_id="0" tab_id="0" mobile_row="0" mobile_zipped="1"row="0" section="0"><forecast_information><city data="Lianyungang, Jiangsu" /><postal_code data="lianyungang" /><latitude_e6 data="" /><longitude_e6 data="" /><forecast_date data="2010-06-03" /><current_date_time data="2010-06-03 11:00:00 +0000" /><unit_system data="SI" /></forecast_information><current_conditions><condition data="雨" /><temp_f data="58" /><temp_c data="14" /><humidity data="湿度:89%" /><icon data="/ig/images/weather/cn_heavyrain.gif" /><wind_condition data="风向:米/秒" /></current_conditions><forecast_conditions><day_of_week data="周五" /><low data="14" /><high data="23" /><icon data="/ig/images/weather/sunny.gif" /><condition data="晴" /></forecast_conditions>……</weather></xml_api_reply>三、实验步骤import javax.microedition.midlet.*;import javax.microedition.io.*;import javax.microedition.lcdui.*;import java.io.*;import java.util.Vector;public class pro4 extends MIDlet implements CommandListener{public static final String RESPONSE_HEADER_CONTENT_LENGTH = "Content-Length";public static final String RESPONSE_HEADER_CONTENT_TYPE = "Content-Type";private Display display;private TextBox tbxMain;private Command cmdExit;private Command cmdDisplay;private String msg="";String url="/ig/api?weather=lianyungang&hl=zh-cn";public pro4(){display=Display.getDisplay(this);cmdExit=new Command("Exit",Command.SCREEN,1);cmdDisplay=new Command("刷新",Command.ITEM,2);getWeather();tbxMain=new TextBox("天气预报",msg,2000,0);tbxMain.addCommand(cmdExit);tbxMain.addCommand(cmdDisplay);tbxMain.setCommandListener(this);}//建立连接public void getWeather(){HttpConnection conn=null;try{conn=(HttpConnection)Connector.open(url,Connector.READ);conn.setRequestMethod(HttpConnection.POST);conn.setRequestProperty("User_agent","Profile/MIDP-2.0 Configuration/CLDC-1.1");}catch(IOException ioe){System.out.println(ioe);}try{DataInputStream sIs = conn.openDataInputStream();String outString=getResponseData(conn,sIs);System.out.println(outString);msg=outString;msg=division(msg);}catch(IOException io){System.out.print(io);}}//分割提取字符串public String division(String str){String out="";int cityStrStart=str.indexOf("city data=")+"city data=".length()+1;int cityStrEnd=str.indexOf("/><postal_code")-1;out=out+"城市:"+str.substring(cityStrStart,cityStrEnd)+'\n';int dateStrStart=str.indexOf("orecast_date data=")+"orecast_date data=".length()+1;int dateStrEnd=str.indexOf("/><current_date")-1;out=out+"日期:"+str.substring(dateStrStart,dateStrEnd)+'\n';int wetStrStart=str.indexOf("湿度:")+"湿度:".length();int wetStrEnd=str.indexOf("/><icon data=")-1;out=out+"湿度:"+str.substring(wetStrStart,wetStrEnd)+'\n';if( str.regionMatches( true,str.indexOf("gif\"/><wind_condition data=")+1 ,"风向" ,0 ,"风向".length() ) ){int windStrStart=str.indexOf("风向:")+"风向:".length();int windStrEnd=str.indexOf("/></current_conditions>")-1;out=out+"风向:"+str.substring(windStrStart,windStrEnd)+'\n';}//第一天int week1StrStart=str.indexOf("day_of_week data=")+"day_of_week data=".length()+1;int week1StrEnd=str.indexOf("/><low data=")-1;out=out+str.substring(week1StrStart,week1StrEnd)+'\n';int low1StrStart=str.indexOf("low data=")+"low data=".length()+1;int low1StrEnd=str.indexOf("/><high data=")-1;out=out+"最低温度:"+str.substring(low1StrStart,low1StrEnd);int high1StrStart=str.indexOf("/><high data=")+"/><highdata=".length()+1;int high1StrEnd=str.indexOf("/><icon data=\"/ig")-1;out=out+"最高温度:"+str.substring(high1StrStart,high1StrEnd);int condition1StrStart=str.indexOf("gif\"/><conditiondata=")+"gif\"/><condition data=".length()+1;int condition1StrEnd=str.indexOf("/></forecast_conditions")-1;out=out+"总体概况:"+str.substring(condition1StrStart,condition1StrEnd)+'\n';//第二天int week2StrStart=str.indexOf("day_of_weekdata=",condition1StrEnd+5)+"day_of_week data=".length()+1;int week2StrEnd=str.indexOf("/><low data=",condition1StrEnd+5)-1; out=out+str.substring(week2StrStart,week2StrEnd)+'\n';int low2StrStart=str.indexOf("low data=",condition1StrEnd+5)+"low data=".length()+1;int low2StrEnd=str.indexOf("/><high data=",condition1StrEnd+5)-1;out=out+"最低温度:"+str.substring(low2StrStart,low2StrEnd);int high2StrStart=str.indexOf("/><highdata=",condition1StrEnd+5)+"/><high data=".length()+1;int high2StrEnd=str.indexOf("/><icon data=\"/ig",condition1StrEnd+5)-1;out=out+"最高温度:"+str.substring(high2StrStart,high2StrEnd);int condition2StrStart=str.indexOf("gif\"/><conditiondata=",condition1StrEnd+5)+"gif\"/><condition data=".length()+1;intcondition2StrEnd=str.indexOf("/></forecast_conditions",condition1StrEnd+5)-1;out=out+"总体概况:"+str.substring(condition2StrStart,condition2StrEnd)+'\n';//第三天int week3StrStart=str.indexOf("day_of_weekdata=",condition2StrEnd+5)+"day_of_week data=".length()+1;int week3StrEnd=str.indexOf("/><low data=",condition2StrEnd+5)-1;out=out+str.substring(week3StrStart,week3StrEnd)+'\n';int low3StrStart=str.indexOf("low data=",condition2StrEnd+5)+"lowdata=".length()+1;int low3StrEnd=str.indexOf("/><high data=",condition2StrEnd+5)-1;out=out+"最低温度:"+str.substring(low3StrStart,low3StrEnd);int high3StrStart=str.indexOf("/><highdata=",condition2StrEnd+5)+"/><high data=".length()+1;int high3StrEnd=str.indexOf("/><icon data=\"/ig",condition2StrEnd+5)-1;out=out+"最高温度:"+str.substring(high3StrStart,high3StrEnd);int condition3StrStart=str.indexOf("gif\"/><conditiondata=",condition2StrEnd+5)+"gif\"/><condition data=".length()+1;intcondition3StrEnd=str.indexOf("/></forecast_conditions",condition2StrEnd+5)-1;out=out+"总体概况:"+str.substring(condition3StrStart,condition3StrEnd)+'\n';//第四天int week4StrStart=str.indexOf("day_of_weekdata=",condition3StrEnd+5)+"day_of_week data=".length()+1;int week4StrEnd=str.indexOf("/><low data=",condition3StrEnd+5)-1;out=out+str.substring(week4StrStart,week4StrEnd)+'\n';int low4StrStart=str.indexOf("low data=",condition3StrEnd+5)+"lowdata=".length()+1;int low4StrEnd=str.indexOf("/><high data=",condition3StrEnd+5)-1;out=out+"最低温度:"+str.substring(low4StrStart,low4StrEnd);int high4StrStart=str.indexOf("/><highdata=",condition3StrEnd+5)+"/><high data=".length()+1;int high4StrEnd=str.indexOf("/><icon data=\"/ig",condition3StrEnd+5)-1;out=out+"最高温度:"+str.substring(high4StrStart,high4StrEnd);int condition4StrStart=str.indexOf("gif\"/><conditiondata=",condition3StrEnd+5)+"gif\"/><condition data=".length()+1;intcondition4StrEnd=str.indexOf("/></forecast_conditions",condition3StrEnd+5)-1;out=out+"总体概况:"+str.substring(condition4StrStart,condition4StrEnd)+'\n';return out;}//获取内容public String getResponseData(HttpConnection aConn, DataInputStream sIs) { boolean isWap = true;byte[] sData = null;String sType = null;int sLen = 0;try {sType = aConn.getHeaderField(RESPONSE_HEADER_CONTENT_TYPE);sLen = Integer.parseInt(getResponseHeaderProperty(aConn, RESPONSE_HEADER_CONTENT_LENGTH));} catch (IOException ex) {System.err.print(ex.toString());} catch (Exception ex) {System.err.print(ex.toString());sLen = 0;}if (sLen > 0) {int sActual = 0; //每一次实际读取的字节数int sBytesread = 0; //总读取的字节数sData = new byte[sLen];while ((sBytesread != sLen) && (sActual != -1)) {try {sActual = sIs.read(sData, sBytesread, sLen - sBytesread); sBytesread += sActual;} catch (Exception ex) {System.err.print(ex.toString());return null;}}} else {int sCh = 0;Vector sVbuffer = new Vector();try {while ((sCh = sIs.read()) != -1) {sVbuffer.addElement(new Integer(sCh));}} catch (Exception ex) {System.err.print(ex.toString());return null;}sLen = sVbuffer.size();sData = new byte[sLen];for (int i = 0; i < sLen; i++) {sData[i] = ((Integer) sVbuffer.elementAt(i)).byteValue();}}String sResult = new String(sData);isWap = false;return sResult;}public String getResponseHeaderProperty(HttpConnection aConn, String aKey) {return aConn.getRequestProperty(aKey);}public void startApp(){display.setCurrent(tbxMain);}public void pauseApp(){}public void destroyApp(boolean unconditional){}public void commandAction(Command c,Displayable s){if(c==cmdExit){destroyApp(false);notifyDestroyed();}if(c==cmdDisplay){getWeather();tbxMain.setString(msg);System.out.println("msg"+msg);}}}四、实验结果五、结果分析与实验体会本次实验可以分为三个部分:建立连接,取出字符串,提取字符串。
HTTP协议报文、工作原理及Java中的HTTP通信技术详解一、web及网络基础1、HTTP的历史1.1、HTTP的概念:HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器。
它是一个应用层协议,承载于TCP之上。
由请求和响应构成,是一个标准的客户端服务器模型1.2、HTTP的发展历史:作为Web文档传输协议的HTTP,它的版本更新十分缓慢,目前只更新了三个版本:HTTP/0.9: 1990年,并未建立标准HTTP/1.0: 1996年5月,HTTP/1.1: 1997年1月,目前主流的HTTP版本1.2、HTTP在Web应用中的重要性:HTTP协议是整个Web基础,许多应用都离不开对HTTP协议的认识:WebService = HTTP + XMLReset = HTTP + JSON各种API的实现:HTTP + XML/JSON采集、小偷站QQ、迅雷等桌面应用软件2、网络基础TCP/IP协议2.1、协议的概念:协议是指计算机通信网络中,两台计算机进行通信,所必须遵循的规定或规则。
计算机网络中有各种各样的协议,比如TCP协议、IP协议、HTTP协议、FTP协议等等,像这样把与互联网相关联的协议集合起来,就成为TCP/IP协议族。
2.2、TCP/IP的分层管理应用层:负责处理特定的应用程序,如FTP、DNS、HTTP等。
传输层:对上层应用层提供处于网络连接中两台计算机之间的数据连接。
该层有两种协议:TCP和UDP。
网络层:处理网络上流动的数据报。
该层协议有:IP、ICMP、IGMP。
数据链路层:处理连接网络的硬件部分。
包括操作系统、硬件设备驱动、网卡、光纤等。
2.3、TCP/IP通信传输流程3、IP、TCP、DNS与HTTP的密切关系3.1、IP协议的概念与作用IP(Internet Protocol),网际协议,位于网络层把各种数据包传送给对方。
网络协议之HTTP协议详解HTTP协议是一种以客户端-服务器模式运行的协议。
它被广泛用于Web应用程序的通信,但它也可以用于其他应用程序。
本文将深入探讨HTTP协议的背景、特点、请求方法、响应码等。
一、HTTP协议的背景HTTP协议的出现是为了解决早期互联网上不同的计算机系统之间进行通信的问题。
随着互联网的不断发展,HTTP协议也逐渐发展。
最初的HTTP协议的版本是0.9,支持最基本的功能,仅能支持ASCII字符。
后来,HTTP/1.0和HTTP/1.1分别发布了,HTTP/2和HTTP/3也已发布。
二、HTTP协议的特点HTTP协议是一个无状态的协议,它不维护关于客户端的任何信息。
这意味着每个请求都是一个独立的请求,而服务器并不会将之前的请求和之后的请求联系在一起。
HTTP协议是基于请求和响应模式的,每个请求都会提示服务器执行一个特定的操作,并返回一个相应的响应。
HTTP协议是基于TCP协议的,这意味着它提供了面向连接的服务。
TCP协议在客户端和服务器之间建立了一个实际的连接,并负责可靠地传输数据。
此外,HTTP协议还支持各种不同的媒体类型,如文本、HTML、图像和音频等。
它使用统一资源标识符(URI)来标识请求的资源,将一个URL视为特定的URI,使用URI来表示资源的位置。
三、HTTP协议的请求方法HTTP协议定义了一些请求方法,也被称为动词。
以下是最常用的方法:1. GET:用于从服务器检索数据,这也是HTTP应用程序最常用的方法。
2. POST:用于向服务器发送数据创建或更新资源。
3. PUT:用于向服务器上传新资源或更新现有资源的内容。
4. DELETE:用于从服务器上删除指定的资源。
5. HEAD:与GET方法类似,但只检索响应首部的信息。
6. OPTIONS:用于检索特定资源所支持的HTTP方法列表。
四、HTTP协议的响应码HTTP协议规定了一套标准的响应码,以表示客户端请求在服务器端处理的结果。
摘要介绍并分析了J2ME的通用网络连接框架(GCF),并以此为基础,指出了在J2ME网络连接编程中存在的问题,并提出了通过构建多线程的两种解决方法。
关键词J2MEGCF多线程网络连接0引言J2ME(Java2MicroEdition)是Java2的一个组成部分,它与J2SE、J2EE并称。
J2ME是一种高度优化的Java运行环境,主要针对消费类电子设备的,例如蜂窝电话、可视电话、数字机顶盒和汽车导航系统等等。
即J2ME是为消费电子产品和手持设备量身定制的Java专用版本。
J2ME的出现使开发跨平台的消费类电子产品的应用软件成为可能。
Java语言的与平台无关的特性移植到小型电子设备上,允许移动无线设备之间共享应用程序。
它提供了基于HTTP的高级Internet协议,使移动电话能以Client/Server方式直接访问Internet的全部信息,从而使得不同的Client访问不同的资源。
在将来的无线通信时代中,大量的网络应用程序将被开发出来去满足无线移动通讯的要求,而要充分的发挥无线移动通讯设备的通信能力,J2ME网络编程就变得尤为重要。
那么为了高效地进行网络编程,就要利用Java语言的多线程编程机制。
1J2ME的网络连接框架(GCF)通用连接框架(GenericConnectionFramework,GCF)为资源有限的设备提供了一个可扩展的、通用的I/O框架。
GCF 是一组在javax.microedition.io包中定义的接口。
图1显示了GCF的类层次结构。
图1GCF的类层次结构在GCF中共定义了七个接口,其中Connection是最基本的连接类型。
且同时提供了对数据包和流连接的支持。
沿着层次结构向下派生出提供更多功能的接口。
例如,StreamConnection接口支持输入流和输出流,ContentConnection接口又扩展了StreamConnection接口以支持对流的内容类型、数据长度和编码格式的确定,HttpConnection接口又扩展了ContentConnection接口以支持对于标准的HTTP请求。
[J2ME]J2ME连网&不同运营商网络的连网随着中国移动,联通,电信的先后获得3G牌照,移动软件开发必定会热起来,无论是现在热火朝天的J2ME 版的UCWEB,QQ,还是移动的飞信等都是必须连网的,因此掌握J2ME的网络编程是我们程序员的一门绝技,而通用连接框架则是网络编程的基础。
这篇文章主要介绍1. 通用连接框架的基础知识。
2. 中国环境下的网络开发请注意本文假定读者熟悉J2ME 环境中的MIDlet 开发。
需要在系统中安装J2ME 开发环境才能编译代码示例,以及J2ME Wireless Toolkit(WTK) 的安装指导,请参阅文章末尾参考资料的小结。
GCF 是一组在javax.microedition.io 包中定义的接口。
图 1 显示了GCF 的类层次结构。
通用连接框架介绍图 1. 通用连接框架的类层次结构在GCF 中共定义了七个接口,其中Connection 是根。
注意同时提供了对数据包(packet)和流连接的支持。
正如您设想的那样,沿着层次结构向下就会发现提供更多功能的接口。
例如,StreamConnection 支持输入和输出流,ContentConnection 扩展了StreamConnection 以支持对流的内容类型、数据长度和编码格式的确定。
Connector 类用于在GCF 中打开类型的连接。
下面可以看到Connector 类中的open() 方法的格式:Connector.Open("protocol:address;parameters"); Open方法会根据你提供的字符串参数进行Connection的绑定。
GCF 在支持不同的连接协议方面特别灵活。
在请求打开一个连接时,Connector 类使用其Class.forName() 方法搜索实现了所请求的协议的类。
如果找到这个类,就返回一个实现了Connection 接口的对象。
下面是一些常用打开一个Connection的方法:Connector.Open("socket://:80"); //TCP套接字通讯连接建立Connector.Open("");//通过Http协议数据通信Connector.Open("datagram://:1000");//数据报套接字通讯建立Connector.Open("file://makefile.txt");//访问手机文件Connection conn = Connector.open("comm:0; baudrate=5333");//基于串口协议的数据通信连接框架的用法七种创建连接的方法,下面是代码示例public static Connection open(String name)public static Connection open(String name)public static Connection open(String name, int mode, boolean timeouts) public static DataInputStream openDataInputStream(String name)public static DataOutputStream openDataOutputStream(String name) public static InputStream openInputStream(String name)public static OutputStream openOutputStream(String name)Connector 构建了7个静态的方法,上面方法,具体的相关用法以及参数说明可以查看APIs文档。
http协议详解HTTP协议(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议,它是计算机与计算机之间进行通信的一种规范。
HTTP协议是互联网的基础协议之一,它在Web浏览器和Web服务器之间进行数据的传输和交换,是Web应用的核心。
HTTP协议的主要特点包括以下几点:1. 简洁性:HTTP协议的信息传输以文本的形式进行,每个请求和响应都是基于文本的报文进行传输,使得它的传输效率较低。
但同时也极大地简化了协议的设计和实现。
2. 无状态性:HTTP协议是一种无状态协议,即服务器不会记录之前的请求和响应的信息。
这就需要客户端每次请求时都需要提供包含足够信息的完整请求,服务器完全不关心之前的请求是什么样的。
3. 可扩展性:HTTP协议通过请求方法、响应状态码、首部字段等实现了对协议的扩展,使得它可以适应不同的需求和场景。
HTTP协议的通信流程如下:1. 客户端发起请求:客户端使用HTTP协议生成一个请求报文,并将请求报文发送给服务器。
2. 服务器响应请求:服务器接收到请求报文后,生成一个响应报文,并将其发送给客户端。
3. 数据传输:客户端和服务器通过TCP协议进行数据传输,在传输过程中将请求和响应报文进行分割、压缩等优化处理。
4. 请求结束:服务端响应完成后,请求结束,断开TCP连接。
HTTP协议的请求方法包括GET、POST、PUT、DELETE等,每种请求方法对应不同的操作和语义。
其中GET方法用于请求服务器上的资源,POST方法用于向服务器提交数据,PUT方法用于存储资源,DELETE方法用于删除资源。
HTTP协议的请求和响应报文由请求行、首部字段和实体三部分组成。
请求行由请求方法、请求URI和HTTP协议版本组成,它描述了客户端向服务器请求的信息。
首部字段用于传递附加信息,如User-Agent、Accept-Language等。
实体用于传输请求或响应的具体内容。
HTTP协议详解浏览器与服务器之间的通信规范HTTP协议详解:浏览器与服务器之间的通信规范HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议,它定义了浏览器与服务器之间进行通信的规范。
通过HTTP协议,浏览器可以向服务器请求资源,并且服务器可以将这些资源传送给浏览器。
本文将详细解析HTTP协议,包括其请求与响应的格式、常见的请求方法、状态码及其含义以及HTTP的演进历程。
一、请求与响应的格式HTTP请求由浏览器发起,而HTTP响应是由服务器返回给浏览器的。
下面分别介绍请求和响应的格式。
1. 请求格式HTTP请求由请求行、请求头和请求体组成。
请求行包含请求方法、目标URL和协议版本。
常见的请求方法包括GET、POST、PUT、DELETE等,用于指定对资源的操作方式。
请求头包含了一些关于请求的附加信息,如Accept、User-Agent、Cookie等。
请求体可选,用于传递一些额外的数据,一般在POST请求中使用。
2. 响应格式HTTP响应由响应行、响应头和响应体组成。
响应行包含协议版本、状态码和状态短语。
状态码用于表示服务器对请求的处理结果,如200表示成功,404表示资源未找到。
响应头包含了一些关于响应的附加信息,如Server、Content-Type、Content-Length等。
响应体包含了服务器返回的实际数据。
二、常见的请求方法HTTP协议定义了几种常见的请求方法,下面介绍一些常用的方法:1. GET方法GET方法是最常见的HTTP请求方法之一,它用于请求指定的资源。
通过GET请求,浏览器可以向服务器获取资源的信息,但不对服务器上的资源进行任何修改操作。
2. POST方法POST方法用于向服务器发送数据,通常用于提交表单或者上传文件。
通过POST请求,浏览器将数据发送给服务器,并期望服务器对这些数据进行保存或处理。
3. PUT方法PUT方法用于向服务器上传文件。
说到J2ME网络编程的两种方法,相信多有进行Java培训的学员都不会陌生。
这个是java培训中较难理解的一个地方,下面就让达内的讲师为学员们介绍。
说到J2ME网络编程的两种方法,相信多有进行Java培训的学员都不会陌生。
这个是java培训中较难理解的一个地方,下面就让达内的讲师为学员们介绍。
本文描述了在J2me中开发主要使用的网络连接方法,分别详细介绍了使用http和socket两种方法。
HttpConnection首先我们先来看一个简单的例子吧:主要用到的java包:javax.microedition.io.*;public String requestGET(String URLString,String URL) throws IOException{// =============================================================// URLString是HTTP地址,URL为后面的参数// 这里的例子是发送用的用户名和密码到服务器端进行用户验证// 比如String URLString = "http://192.168.0.1:8080/login.jsp";// String URL = "?Name="+this.txtName+"&Pass="+this.txtPass// =============================================================HttpConnection hpc = null;DataInputStream dis = null;boolean newline = false;String content = "";try{// ===========================================================// 建立连接// ===========================================================hpc = (HttpConnection)Connector.open(URLString+URL);hpc.setRequestMethod(HttpConnection.GET);dis = new DataInputStream(hpc.openInputStream());int character;// =========================================================== // 读取返回的HTTP内容// =========================================================== while((character = dis.read()) != -1){if((char)character == '\\'){newline = true;continue;}else{if((char)character =='n'&& newline){content +="\n";newline = false;}else if(newline){content +="\\" +(char)character;newline = false;}else{content +=(char)character;newline = false;}}}}catch(IOException e){System.out.print("ERROR:"+e);}finally{if(hpc != null){hpc.close();hpc = null;}if(dis != null){dis.close();}}// =============================================================== // 由于内容可能有中文,所以在接受到信息后要对内容进行字符集的转换// =============================================================== content = (unicodeTogb2312(content)).trim();return content;}public static String unicodeTogb2312(String s){if (s==null){ return ""; }if (s.equals("")){ return s; }try{return new String(s.getBytes("ISO8859_1"),"gb2312");}catch(Exception uee){return s;}}以上就是一个简单的HTTP连接并且从服务器获取响应信息的例子,应该很简单了吧。
核心提示:1.http协议 HTTP协议在发送时可以根据传输数据的方式一般分为get、post两种方法。
Get方法和post方法的区别是传送数据时,数据所放置的位置不同。
Get方法把参数放置在协议内部的请求行中。
而post方法将提交的参数放置在实体数据部分中。
HTTP协议要分为三
1.http协议
HTTP协议在发送时可以根据传输数据的方式一般分为get、post两种方法。
Get方法和post方法的区别是传送数据时,数据所放置的位置不同。
Get方法把参数放置在协议内部的请求行中。
而post方法将提交的参数放置在实体数据部分中。
HTTP协议要分为三个部分:
a) 请求行/响应行:该部分只有一行,包含三个部分:请求方法请求资源使用的HTTP协议的版本。
例如:get /index.html http/1.1, 其中get为请求方法,/index.html是请求的资源,http/1.1是指客户端支持的HTTP协议的版本。
b) 头信息:头信息部分主要传输服务器或者客户端的一些设定信息,可以有任意多个,传输时使用“名称:值”的形式,如下:
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
conn.setRequestProperty("User-Agent",
"Profile/MIDP-1.0 Configuration/CLDC-1.0");
conn.setRequestProperty("Content-Language", "en-US");
conn.setRequestProperty("Accept", "application/octet-stream");
conn.setRequestProperty("Connection", "close");
c) 实体数据
2.使用J2ME进行无线网络编程
定义在javax.microedition.io类中的抽象网络和文件输入输出框架称为通用连接框架(Generic Connection Framework,简称GCF)。
GCF定义了一套有关抽象化的内容来描述不同的通信方法。
最高级的抽象被称作连接(Connection),还声明了六个接口(四个是直接的,两个是间接的)。
这七个接口就构成了J2ME的CLDC的一部分,CLDC是大多数的能使用Java的无线设备使用的配置。
设计这个配置的目的就是为所有的CLDC设备(手提电话,双向传呼机,低档的PDA等等)提供公用的网络和文件输入输出能力。
由于移动终端自身的限制,所支持的网络协议非常有限,仅限于HTTP,Socket,UDP等几种协议。
不同的厂家可能还支持其他网络协议,但是,MIDP 1.0规范规定,HTTP协议是必须实现的协议,而其他协议的实现都是可选的。
因此,为了能在不同类型的手机上移植,所以在移动应用开发时应尽量采用 HTTP作为网络连接的首选协议,这样还能重用服务器端的代码。
GCF的关键在于把所有的连接都按照url来处理,这样容易从Connector中得到不同类型的连接,如HttpConnection和SocketConnection.
3.J2ME使用http协议进行网络通信
3.1.发送一个HTTP GET请求
1)使用Connector类打开一个到服务器的连接
2)得到HttpConnection上的一个DataInputStream,用来读取服务器的响应数据。
3)将读取到的服务器的响应数据放入缓存
1.public String sendHttpGet(String url) throws IOException {
2. HttpConnection hcon = null;
3. DataInputStream dis = null;
4. String message = "";
5. try {
6. hcon = (HttpConnection) Connector.open(url);
7. dis = new DataInputStream(hcon.openInputStream());
8. int ch;
9. message = dis.readUTF();
10. } finally {
11. if (hcon != null)
12. hcon.close();
13. if (dis != null)
14. dis.close();
15. }
16. return message;
17. }
使用GET方式发送数据的时候数据只能通过URL传送到服务器,数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使
用“&”连接;如:
http://localhost:8080/mdbServer/servlet/myServlet?userName=staratsky&pa ssword=staratsky,
使用GET方式发送数据,参数还要受到URL长度的限制,不能超过256字
Get是HttpConnection 的默认方式
使用GET方式发送数据,用户可以在浏览器上直接看到提交的数据,数据安全性不高
3.2.发送一个HTTP POST请求
处理过程和发送一个HTTP GET请求的处理非常类似,但稍稍复杂些。
步骤如下:1)设置HttpConnection的请求方式为
2)使用Connector类打开一个到服务器的连接,打开时将连接设置为Connector.READ_WRITE 方式,允许客户端可以通过连接在服务器上读和写
3)得到一个用于现有的HTTP连接的DataOutputStream对象。
4)向指定的DataOutputStream写数据
5)得到HttpConnection上的一个DataInputStream,用来读取服务器的响应数据。
3)将读取到的服务器的响应数据放入缓存
1.public String sendHttpGet(String url,String requestBody
) throws IOException {
2. HttpConnection hcon = null;
3. DataInputStream dism = null;
4. OutputStream os = null;
5. String message = "";
6.try {
7.// Connector.READ_WRITE参数允许客户端可以通过连接在服务器
上读和写。
8. hcon = (HttpConnection) Connector.open(url, Connecto
r.READ_WRITE);
9.// 设置HttpConnection对象使用的请求方法为POST
10. hcon.setRequestMethod(HttpConnection.POST);
11.// 得到一个用于现有的HTTP连接的OutputStream对象。
12. os = hcon.openOutputStream();
13.byte[] byteRequest = requestBody.getBytes();
14.// 向指定的OutputStream写数据
15. os.write(byteRequest);
16.// 得到Http响应代码
17.int rc = hcon.getResponseCode();
18.// 正常响应
19.if (rc == HttpConnection.HTTP_OK) {
20.// 构建输入流
21. dism = new DataInputStream(hcon.openInputStream(
));
22.// 读取服务器返回的字节流
23. String result = dism.readUTF();
24. dism.close();
25.// 判断
26.if (result.equals("true")) {
27.// 显示登录成功
28. message = "success";
29. } else if (result.equals("false")) {
30. message = "fail";
31. }
32. }
33. } finally {
34.if (hcon != null)
35. hcon.close();
36.if (dism != null)
37. dism.close();
38.if (os != null)
39. os.close();
40. }
41.return message.toString();
42. }。