android之Http协议编程01
2014-01-26 01:31
246 查看
今天,我来粗略的讲解下Http协议,并实现,以Android为客服端,Web为服务端,在Android上读取Web服务上一段简单的字符串。
Http协议是应用层端的协议,Http的英文名称为HyperText Transfer Protocol,意思就是超为文本传输协议。Http可以通过传输层的Tcp协议在客服端和服务端进行数据的传输。它在Java
Web开发运用上最为常见。在以Jsp/Servelet的Java Web开发中,我们在Jsp界面数据和Servelet数据传输采用的就是这种http协议编程,使用三大框架进行J2EE开发过程中,在Jsp界面和ActionServelet中的数据传输也是采用的Http协议编程的。
我们平时做的web项目,当我们部署到tomcat服务器上,这时我们一般都是在浏览器输入我们要访问的地址(URL(Uniform
Resource Locator统一资源定位符),这个请读者自己参考相关知识,了解URL各部分的相关含义),浏览器得到这个地址后,会把这个地址发送到DNS进行域名解析,解析成其相对应的ip地址,然后由ip地址就可以连接到相对应的地方,当然其底层是通过Tcp/Ip协议的,当两者建立连接时,我们在两者之间可以采用流的方式在两者之间进行数据的传输。
在Java(android)中进行Http编程,我们一般有两种方式:
1. 标准的Java接口(path->URL->HttpConnection->inputStream)。
2. 采用Apache接口来实现两者之间的通信(这个下次介绍,这里先采用第一种方法);
当然,还可以采用主拼Http协议的编程来实现,就是利用某些工具得到http协议中请求体的信息和回复体的信息,然后我们主拼这段信息来实现,当然这个实现起来很麻烦,也很容易出错,一般都不建议。
现在,我们要首先在MyElipse中建立一个web项目,并将其部署到Tomcat服务器中,其通过URL(http://192.168.1.100:8080/HttpTest//servlet/LoginServlet)访问后的效果图如下。
图 1
然后我们要在elipse中建立一个Android项目,其运行后的截图如下
图2
我们要做的就是把图1上的数据‘这时测试用的数据’显示在图2上,这也就达到了在android中获取服务端的数据。
现在贴出代码:
MyElipse的Web项目的部分代码,因为我们只是简单的加条数据,所以只需再Servelet中加入如下代码即可
Servelet代码:
package com.kun.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class LoginServlet extendsHttpServlet {
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has itstag value method equals to get.
*
* @param request the request send by theclient to the server
* @param response the response send by theserver to the client
* @throws ServletException if an erroroccurred
* @throws IOException if an error occurred
*/
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
this.doPost(request,response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has itstag value method equals to post.
*
* @param request the request send by theclient to the server
* @param response the response send by theserver to the client
* @throws ServletException if an erroroccurred
* @throws IOException if an error occurred
*/
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriterout = response.getWriter();
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
out.println("这是测试用的数据");
out.flush();
out.close();
}
}
Elipse中的Android项目代码:
布局文件:main.xml
<?xml
version="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="@string/button_name"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/textView"
/>
</LinearLayout>
主Activity:
package com.kun.gethttp01;
import com.kun.http.HttpUtils;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class GetHttpData01Activity extendsActivity {
/** Called when the activity is first created. */
Buttonbutton = null;
TextViewtextView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button);
textView = (TextView)findViewById(R.id.textView);
button.setOnClickListener(new CliclListener());
}
private class CliclListener implements OnClickListener{
@Override
publicvoid onClick(View v) {
Stringpath = "http://192.168.1.100:8080/HttpTest/servlet/LoginServlet";
Stringmsg = HttpUtils.getHttpData(path);
System.out.println(msg);
textView.setText(msg);
}
}
}
HttpUtils代码,将Http操作封装到这个类中,我们最关键的也是这个类:
package com.kun.http;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import
java.net.MalformedURLException;
import java.net.URL;
publicclass HttpUtils {
/**
*
通过Http协议获取服务端的数据
* @param path
路径
* @return字符串
*/
publicstatic String getHttpData(String path){
String msg =
"";
try {
//由地址栏输入的地址生成URL对象
URL url = new URL(path);
//JDK为我们提供的Http协议编程的所封装好的类,我们只需设置几个方法属性就可以进行连接到服务端了
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
//设置连接超时时间,这里5s没有反应就会断开和服务的器的连接请求
System.out.println("444444444444444444444444444");
connection.setConnectTimeout(5000);
//设置这个属性,表示是允许从服务端获取数据
connection.setDoInput(true);
//以GET的方式获取数据
connection.setRequestMethod("GET");
System.out.println("33333333333333333333333");
//服务端返回的结果码
int responseCode = connection.getResponseCode();
System.out.println(responseCode);
if(responseCode==200){//表示连接成功
msg = changeInputStream(connection.getInputStream());//得到输入流,并通过自己写的changeInputStream方法转化成String
}
} catch (Exception e) {
System.out.println("出错啦");
}
return msg;
}
/**
*
讲输入流转化成字符串
* @param inputStream
输入流
* @return字符串
*/
privatestatic String changeInputStream(InputStream inputStream) {
System.out.println("22222222222222222222222");
//字节数组输出流,可以再内存中缓存一些数据
ByteArrayOutputStream arrayOutputStream =
newByteArrayOutputStream();
//下面几行的意思是把输入流的数据读出,并写入到ByteArrayOutputStream中
byte[] data =
newbyte[1024];
int len = 0;
try {
while((len = inputStream.read(data))!=-1){
arrayOutputStream.write(data, 0, len);
}
} catch (IOException e) {
//
TODO Auto-generatedcatch block
e.printStackTrace();
}
returnnew String(arrayOutputStream.toByteArray());//讲输出流中的数据转化成String返回
}
}
最后我们需要在清单文件中加入访问网络的权限:
<!--
添加网络访问权限 -->
<uses-permission
android:name="android.permission.INTERNET"/>
最后运行效果图:
Ps:上述文件我们只是简单的http协议编程,在实际开发过程中,我们一般不这么做,因为访问网络获取其中的数据是一件耗时的工作,所以我们一般是采用多线程的方式来做,所以我们下次讲解以多线程的方式获取服务端的数据。
Http协议是应用层端的协议,Http的英文名称为HyperText Transfer Protocol,意思就是超为文本传输协议。Http可以通过传输层的Tcp协议在客服端和服务端进行数据的传输。它在Java
Web开发运用上最为常见。在以Jsp/Servelet的Java Web开发中,我们在Jsp界面数据和Servelet数据传输采用的就是这种http协议编程,使用三大框架进行J2EE开发过程中,在Jsp界面和ActionServelet中的数据传输也是采用的Http协议编程的。
我们平时做的web项目,当我们部署到tomcat服务器上,这时我们一般都是在浏览器输入我们要访问的地址(URL(Uniform
Resource Locator统一资源定位符),这个请读者自己参考相关知识,了解URL各部分的相关含义),浏览器得到这个地址后,会把这个地址发送到DNS进行域名解析,解析成其相对应的ip地址,然后由ip地址就可以连接到相对应的地方,当然其底层是通过Tcp/Ip协议的,当两者建立连接时,我们在两者之间可以采用流的方式在两者之间进行数据的传输。
在Java(android)中进行Http编程,我们一般有两种方式:
1. 标准的Java接口(path->URL->HttpConnection->inputStream)。
2. 采用Apache接口来实现两者之间的通信(这个下次介绍,这里先采用第一种方法);
当然,还可以采用主拼Http协议的编程来实现,就是利用某些工具得到http协议中请求体的信息和回复体的信息,然后我们主拼这段信息来实现,当然这个实现起来很麻烦,也很容易出错,一般都不建议。
现在,我们要首先在MyElipse中建立一个web项目,并将其部署到Tomcat服务器中,其通过URL(http://192.168.1.100:8080/HttpTest//servlet/LoginServlet)访问后的效果图如下。
图 1
然后我们要在elipse中建立一个Android项目,其运行后的截图如下
图2
我们要做的就是把图1上的数据‘这时测试用的数据’显示在图2上,这也就达到了在android中获取服务端的数据。
现在贴出代码:
MyElipse的Web项目的部分代码,因为我们只是简单的加条数据,所以只需再Servelet中加入如下代码即可
Servelet代码:
package com.kun.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class LoginServlet extendsHttpServlet {
/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has itstag value method equals to get.
*
* @param request the request send by theclient to the server
* @param response the response send by theserver to the client
* @throws ServletException if an erroroccurred
* @throws IOException if an error occurred
*/
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
this.doPost(request,response);
}
/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has itstag value method equals to post.
*
* @param request the request send by theclient to the server
* @param response the response send by theserver to the client
* @throws ServletException if an erroroccurred
* @throws IOException if an error occurred
*/
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriterout = response.getWriter();
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
out.println("这是测试用的数据");
out.flush();
out.close();
}
}
Elipse中的Android项目代码:
布局文件:main.xml
<?xml
version="1.0"encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="@string/button_name"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/textView"
/>
</LinearLayout>
主Activity:
package com.kun.gethttp01;
import com.kun.http.HttpUtils;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class GetHttpData01Activity extendsActivity {
/** Called when the activity is first created. */
Buttonbutton = null;
TextViewtextView = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button)findViewById(R.id.button);
textView = (TextView)findViewById(R.id.textView);
button.setOnClickListener(new CliclListener());
}
private class CliclListener implements OnClickListener{
@Override
publicvoid onClick(View v) {
Stringpath = "http://192.168.1.100:8080/HttpTest/servlet/LoginServlet";
Stringmsg = HttpUtils.getHttpData(path);
System.out.println(msg);
textView.setText(msg);
}
}
}
HttpUtils代码,将Http操作封装到这个类中,我们最关键的也是这个类:
package com.kun.http;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import
java.net.MalformedURLException;
import java.net.URL;
publicclass HttpUtils {
/**
*
通过Http协议获取服务端的数据
* @param path
路径
* @return字符串
*/
publicstatic String getHttpData(String path){
String msg =
"";
try {
//由地址栏输入的地址生成URL对象
URL url = new URL(path);
//JDK为我们提供的Http协议编程的所封装好的类,我们只需设置几个方法属性就可以进行连接到服务端了
HttpURLConnection connection =(HttpURLConnection)url.openConnection();
//设置连接超时时间,这里5s没有反应就会断开和服务的器的连接请求
System.out.println("444444444444444444444444444");
connection.setConnectTimeout(5000);
//设置这个属性,表示是允许从服务端获取数据
connection.setDoInput(true);
//以GET的方式获取数据
connection.setRequestMethod("GET");
System.out.println("33333333333333333333333");
//服务端返回的结果码
int responseCode = connection.getResponseCode();
System.out.println(responseCode);
if(responseCode==200){//表示连接成功
msg = changeInputStream(connection.getInputStream());//得到输入流,并通过自己写的changeInputStream方法转化成String
}
} catch (Exception e) {
System.out.println("出错啦");
}
return msg;
}
/**
*
讲输入流转化成字符串
* @param inputStream
输入流
* @return字符串
*/
privatestatic String changeInputStream(InputStream inputStream) {
System.out.println("22222222222222222222222");
//字节数组输出流,可以再内存中缓存一些数据
ByteArrayOutputStream arrayOutputStream =
newByteArrayOutputStream();
//下面几行的意思是把输入流的数据读出,并写入到ByteArrayOutputStream中
byte[] data =
newbyte[1024];
int len = 0;
try {
while((len = inputStream.read(data))!=-1){
arrayOutputStream.write(data, 0, len);
}
} catch (IOException e) {
//
TODO Auto-generatedcatch block
e.printStackTrace();
}
returnnew String(arrayOutputStream.toByteArray());//讲输出流中的数据转化成String返回
}
}
最后我们需要在清单文件中加入访问网络的权限:
<!--
添加网络访问权限 -->
<uses-permission
android:name="android.permission.INTERNET"/>
最后运行效果图:
Ps:上述文件我们只是简单的http协议编程,在实际开发过程中,我们一般不这么做,因为访问网络获取其中的数据是一件耗时的工作,所以我们一般是采用多线程的方式来做,所以我们下次讲解以多线程的方式获取服务端的数据。
相关文章推荐
- android网络编程 -- HTTP通信(01)TOMCAT HTTP服务器搭建
- android HTTP协议编程的学习
- Android网络编程之TCP/IP,HTTP,HTTPS协议了解
- Android之Http协议编程04-HttpURLConnection
- Android网络编程专栏--Http协议详细解析
- Android网络编程之socket和http协议的区别
- Android之Http协议编程03-多线程下载
- Android 网络编程 - HTTP协议
- android网络编程学习的一些东西和http协议学习
- HTTP超详细解析——01【协议详解】
- android的http协议
- android 网络编程 HttpGet类和HttpPost类使用详解
- android之旅10 网络编程2: HttpClient与github的封装
- Android HTTP通信协议
- mars老师[Android开发视频教学]01_24 Socket编程
- Android中进行基于HTTP协议的网络访问基础
- Android 网络编程之---HttpClient 与 HttpURLConnection 共用cookie
- 在Android上通过模拟HTTP multipart/form-data请求协议信息实现图片上传
- Android基础入门教程——7.1.1 Android网络编程要学的东西与Http协议学习
- HTTP协议的C语言编程实现实例