这里不在赘述http协议的具体内容,直接说如何使用用一个例子来说明:
1、先用Eclipse创建一个web项目,同时创建一个servlet,很简单只需一个表单,将数据提交到servlet中。在servlet中实现doPost和doGet方法,为了方便,只需实现一个dopost方法,在doget中调用都post方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String name=request.getParameter("name");
String age=request.getParameter("age");
PrintWriter out= response.getWriter();
out.print("name="+name+" age="+age);//返回数据
System.out.println("name="+name+" age="+age);
}
先测试此servlet是否可以正常工作。
2、接下来创建一个安卓项目。
在主Activity界面中创建两个EditText和一个Button。为Button设置一个点击监听器。
然后新建一个httpThread类继承于Thread(访问网络是一个耗时操作,需要在单独的线程中执行),在此类中创建两个String变量对应两个EditText的内容,再创建一个String对应URL。自己写一个构造函数来从外部传递这三个String。实现此线程的Run方法。
再单独写两个函数,doPos()t和doGet()
这里先说明大致流程:先实例化一个URL对象(new URL(String url)),通过此对象的openConnection方法获得一个HttpURLConnection对象。然后对此连接对象设置访问方式.setRequestMethod(" "),里面可以是POST或者GET,具体区别后面说,还可以设置此连接操作的TimeOut时间。都设置好了后就可以通过此连接获得输入输出流。如果想提交数据就通过输出流,如果想得到暑假就通过输入流。剩下的操作就和java中的 IO操作差不多了。接下来看代码
private void doPost(){
try {
URL httpURL=new URL(mUrl);
HttpURLConnection connection=(HttpURLConnection) httpURL.openConnection();
connection.setRequestMethod("POST");
connection.setConnectTimeout(5000);
OutputStream out=connection.getOutputStream();
//post提交数据的方式
String p="name="+mName+"&age="+mAge;//注意与get中不同 第一个参数前不用加?号
out.write(p.getBytes());
//得到之前servlet中返回的数据
BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
String string;
StringBuffer sBuffer=new StringBuffer();
while((string=reader.readLine())!=null){
sBuffer.append(string);
}
Log.i("result", sBuffer.toString());
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void doGet(){
//get是通过URL传递的参数,所以需要对URL进行改造,将需要传递的数据添加到后面
mUrl=mUrl+"?name="+mName+"&age="+mAge;
try {
URL httpURL=new URL(mUrl);
HttpURLConnection connc=(HttpURLConnection) httpURL.openConnection();//应该是在这一步就将参数传递到servlet中了吧
connc.setRequestMethod("GET");
connc.setConnectTimeout(5000);
//同样获取返回的数据
BufferedReader reader=new BufferedReader(new InputStreamReader(connc.getInputStream()));
String string;
StringBuffer sBuffer=new StringBuffer();
while((string=reader.readLine())!=null){
sBuffer.append(string);
}
Log.i("result", sBuffer.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3、接下来在run方法中调用doPost或者doGet方法。最后在Button的监听器中实例话此线程,new HttpThread(url,name,age),其中url通过测试web项目时的URL地址栏中找到,我的是http://localhost:8888/Http_server/MyServlet?name=bbb&age=10,其中只需要http://localhost:8888/Http_server/MyServlet,注意手机不能识别localhost,所以需要服务器的ip,也即是自己电脑的IP,可以在cmd中通过ipconfig查看自己的IP,最后不要忘了start()。
4、让程序在手机上运行或者模拟器上运行,如果是在手机上,要保证手机和电脑是在一个局域网中,具体方法可以百度手机如何访问电脑上tomcat所部署的项目页面,注意需要关掉电脑的防火墙。
5、输入数据后点击Button,观察Log中是否有tag为result的日志,同时可以看控制台是否有数据打印出来。如果说手机和电脑在一个局域网中,URL也没有写错的话,是有数据显示出来的。但是会发现输入的数据是英文时,服务器端在控制台打印出的收到的数据和Log中打印出服务器返回的数据都是正常的。但是当有中文时,数据就会出现乱码。所以还需要对数据进行编码操作。
6、
1)方法一:
对于服务器来说,需要使用request.setCharacterEncoding("utf-8");,这能保证服务器端收可以正确处理收到的中文数据。
对于手机端也就是客户端来说需要用response.setContentType("text/html;charset=utf-8");。这样重新部署web项目,在用手机发送中文数据,就可以发现服务器在控制台答应的收到的数据和log中打印的服务器返回的数据都是正常的了。
注意如果发送时用的get方法,一定要把URL中中文字符串转码,URLEncoder.encode(mName,"utf-8"); post不用。