Android连接Tomcat服务器

来源:互联网 发布:再生聚酯切片进口数据 编辑:程序博客网 时间:2024/06/07 03:10

在保证服务器是正常状态时,将从Android模拟器上发送请求给服务端并接收服务端返回来的响应。

保证HttpServlet配置正常。可以通过在浏览器输入配置的地址,若能正常响应,那么在Android中去请求的话也是能正常响应的。

这里列举的Demo是在activity中有两个按钮,分别执行get请求和post请求的同时传递参数到服务端,并将服务端返回的信息显示到textview上。

客户端

一、get请求:

第一步:建立请求,连接服务器。

<span style="white-space:pre"></span>String name = URLEncoder.encode("小红", "utf-8");   //中文输入先指定编码,不然会出现乱码//get请求带参数的URL地址   http://192.168.1.112:8080/app/myweb?username=小红&password=abcd  URL url = new URL(httpUrl+"?username="+name+"&password=abcd"); HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//请求方式conn.setConnectTimeout(15000);  //设置连接超时conn.setReadTimeout(10000);  //设置读取超时conn.connect();  //建立连接
这里已经将参数加进去了。由于get请求的参数是直接加在URL地址之后,形式如同 http://192.168.1.112:8080/app/myweb?username=小红&password=abcd    问号后面就是携带的参数,中文参数需要先指定编码集,防止乱码。若没有参数则构造URL时就只需要协议地址。

第二步:服务器请求连接成功后,服务器接到参数,并作出响应,客户端只需从连接中的流中读出响应即可。

<span style="white-space:pre"></span>InputStream in = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));  //得到连接服务器的缓冲流String line;StringBuilder sb = new StringBuilder();while((line=br.readLine()) != null){    //从服务中读取请求返回的数据sb.append(line);}

最后看看get请求的完整Demo:

<span style="white-space:pre"></span>/*get请求方式连接服务器   get请求传递参数在url后面加参数*/public String getHttpDoget(String httpUrl){try {String name = URLEncoder.encode("小红", "utf-8");   //中文输入先指定编码,不然会出现乱码//get请求带参数的URL地址   http://192.168.1.112:8080/app/myweb?username=小红&password=abcd  URL url = new URL(httpUrl+"?username="+name+"&password=abcd"); HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//请求方式conn.setConnectTimeout(15000);  //设置连接超时conn.setReadTimeout(10000);  //设置读取超时conn.connect();  //建立连接InputStream in = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));  //得到连接服务器的缓冲流String line;StringBuilder sb = new StringBuilder();while((line=br.readLine()) != null){    //从服务中读取请求返回的数据sb.append(line);}return sb.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}

按钮监听中,由于请求服务器连接是耗时操作,需要放到子线程中,这里采用的是AsyncTask异步操作实现,若需要学习AsyncTask异步操作请参见:http://blog.csdn.net/tom_xiaoxie/article/details/49803413

<span style="white-space:pre"></span>mConnecyBtn = (Button) findViewById(R.id.http_doget_btn);mConnecyBtn.setOnClickListener(new OnClickListener() {String httpUrl = "http://192.168.1.112:8080/app/myweb";@Overridepublic void onClick(View v) {new AsyncTask<String, Void, String>(){@Overrideprotected String doInBackground(String... params) {return getHttpDoget(params[0]);  //调用请求响应方法}protected void onPostExecute(String result) {mShowMsgTxt.setText(result);};}.execute(httpUrl);}});


二、doPost请求:代码实现Post请求服务器响应跟get请求区别不大,只是Post请求在向服务器传参的时候,需要重新构造流来写入参数。这是由于Get请求只有一个流,参数是直接附加在url后,而Post请求的参数是通过另外的流来传递的,不通过URL,所以可以很大。也可以传递二进制数据。如文件的上传。Post建立连接及上传参数Demo如下:

<span style="white-space:pre"></span>URL url = new URL(httpUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");  //请求方法conn.setConnectTimeout(15000);  //设置连接超时conn.setReadTimeout(10000);  //设置读取超时conn.connect();  //建立连接/*得到流向服务器传数据*/OutputStream out = conn.getOutputStream();PrintWriter pr = new PrintWriter(out);pr.print("username=小明&password=1234");pr.flush();

获取服务器响应的数据跟gen请求一样。直接获取输入流来读取数据即可。

<span style="white-space:pre"></span>/*读取服务端数据*/InputStream in = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));  //得到连接服务器的缓冲流String line;StringBuilder sb = new StringBuilder();while((line=br.readLine()) != null){    //从服务中读取请求返回的数据sb.append(line);}

还是贴上整个方法的Demo和按钮事件Demo:

post方式请求:

<span style="white-space:pre"></span>/*post请求方式连接服务器,给服务器传递参数用流写入的方式*/public String getHttpDopost(String httpUrl){try {URL url = new URL(httpUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");  //请求方法conn.setConnectTimeout(15000);  //设置连接超时conn.setReadTimeout(10000);  //设置读取超时conn.connect();  //建立连接/*得到流向服务器传数据*/OutputStream out = conn.getOutputStream();PrintWriter pr = new PrintWriter(out);pr.print("username=小明&password=1234");pr.flush();/*读取服务端数据*/InputStream in = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));  //得到连接服务器的缓冲流String line;StringBuilder sb = new StringBuilder();while((line=br.readLine()) != null){    //从服务中读取请求返回的数据sb.append(line);}return sb.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}

按钮监听:

<span style="white-space:pre"></span>mDopostBtn = (Button) findViewById(R.id.http_dopost_btn);mDopostBtn.setOnClickListener(new OnClickListener() {String http = "http://192.168.1.112:8080/app/myweb";@Overridepublic void onClick(View v) {new AsyncTask<String, Void, String>(){@Overrideprotected String doInBackground(String... params) {return getHttpDopost(params[0]);}protected void onPostExecute(String result) {mShowMsgTxt.setText(result);};}.execute(http);}});



服务端

最后看看服务端做了什么?服务端就是将客服端传来的参数获取到并且返回给客服端。

package CatServelet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class WebTestServelet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");  //防止中文乱码String name = req.getParameter("username");//name = new String(name.getBytes("ISO-8859-1"),"UTF-8");   //解决乱码问题方式一System.out.println(name);String password = req.getParameter("password");resp.getWriter().print("password:" + password +"\n" +"username:"+name);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("UTF-8");//设定请求编码resp.setContentType("text/html;charset=utf-8");  //设定响应编码 防止中文乱码String name = req.getParameter("username");String password = req.getParameter("password");System.out.println(name);resp.getWriter().print("password:" + password +"\n" +"username:"+name);}}


乱码问题:首先肯定是统一所有编译器的编码集如UTF-8.

解决doGet请求乱码问题,这里设置了两处的编码集,一是在客户端请求服务端是传入的参数先指定编码集UTF-8。

String name = URLEncoder.encode("小红", "utf-8");   //中文输入先指定编码,不然会出现乱码

二是服务端响应时设置响应编码集。

resp.setContentType("text/html;charset=utf-8");  //设置响应编码集 防止中文乱码

至于doPost请求的乱码,只需要在服务端设定请求编码和响应编码就行了。

<span style="white-space:pre"></span>req.setCharacterEncoding("UTF-8");//设定请求编码resp.setContentType("text/html;charset=utf-8");  //设定响应编码 防止中文乱码

延生:

get请求和post请求的区别与比较:
Get请求只有一个流,参数附加在url后面,地址行显示要传送的信息,大小个数有严格的限制且只能是字符串。

Post请求的参数通过另外的流传递,不通过URL,所以可以很大,也可以传递二进制数据如文件。

就是参数传递方式,参数大小,参数类型有区别。

1、安全性:get请求参数显示在url地址后面,可能存在安全性。如密码,post请求可以解决这个问题。

2、服务器接收方式  服务器随机接收get请求的数据,一旦断电等意外原因,服务器不会知道信息是否传送完毕。而post请求是服务器先接收数据信息长度,在接受数据。

3、form运行方式。当form框里面的method为get时,执行doGet()方法。为post时,执行doPost()方法。

4、信息容量限制  get请求的参数信息有限制,post请求没有限制。

get请求乱码:

设定接受参数(客服端发送来的参数)编码集有两种方式,一是更改服务器配置文件,打开Tomcat--->conf目录下的server.xml文件

找到<Connector>标签在里面加一行URIEncoding="UTF-8"设定编码集。

另一种方式是得到参数后转码

<span style="white-space:pre"></span>String name = req.getParameter("username");name = new String(name.getBytes("ISO-8859-1"),"UTF-8");   //解决乱码问题方式一
而响应请求(发送给客户端的参数)参数则用resp.setContentType("text/html;charset=utf-8");  //防止中文乱码


post请求乱码:

设定接受参数(客服端发送来的参数)编码集   req.setCharacterEncoding("UTF-8");//设定请求编码

响应请求(发送给客户端的参数)参数  resp.setContentType("text/html;charset=utf-8");  //设定响应编码 防止中文乱码


特别注意在doget()中req.setCharacterEncoding("UTF-8")来设置接收参数编码是没有作用的。还是需要name = new String(name.getBytes("ISO-8859-1"),"UTF-8");   这种方式来转码。req.setCharacterEncoding("UTF-8")只在post()中有作用。



最后上图并贴上完整代码:


activity代码:主布局就只有两个按钮加一个textview控件。

package webview;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLEncoder;import java.sql.Connection;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;import com.example.call.R;public class HttpServeletActivity extends Activity {private TextView mShowMsgTxt;private Button mConnecyBtn,mDopostBtn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.httpservelet_main_layout);mShowMsgTxt = (TextView) findViewById(R.id.http_text);mConnecyBtn = (Button) findViewById(R.id.http_doget_btn);mConnecyBtn.setOnClickListener(new OnClickListener() {String httpUrl = "http://192.168.1.112:8080/app/myweb";@Overridepublic void onClick(View v) {new AsyncTask<String, Void, String>(){@Overrideprotected String doInBackground(String... params) {return getHttpDoget(params[0]);}protected void onPostExecute(String result) {mShowMsgTxt.setText(result);};}.execute(httpUrl);}});mDopostBtn = (Button) findViewById(R.id.http_dopost_btn);mDopostBtn.setOnClickListener(new OnClickListener() {String http = "http://192.168.1.112:8080/app/myweb";@Overridepublic void onClick(View v) {new AsyncTask<String, Void, String>(){@Overrideprotected String doInBackground(String... params) {return getHttpDopost(params[0]);}protected void onPostExecute(String result) {mShowMsgTxt.setText(result);};}.execute(http);}});}/*post请求方式连接服务器,给服务器传递参数用流写入的方式*/public String getHttpDopost(String httpUrl){try {URL url = new URL(httpUrl);HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("POST");  //请求方法conn.setConnectTimeout(15000);  //设置连接超时conn.setReadTimeout(10000);  //设置读取超时conn.connect();  //建立连接/*得到流向服务器传数据*/OutputStream out = conn.getOutputStream();PrintWriter pr = new PrintWriter(out);pr.print("username=小明&password=1234");pr.flush();/*读取服务端数据*/InputStream in = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));  //得到连接服务器的缓冲流String line;StringBuilder sb = new StringBuilder();while((line=br.readLine()) != null){    //从服务中读取请求返回的数据sb.append(line);}return sb.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}/*get请求方式连接服务器   get请求传递参数在url后面加参数*/public String getHttpDoget(String httpUrl){try {String name = URLEncoder.encode("小红", "utf-8");   //中文输入先指定编码,不然会出现乱码//get请求带参数的URL地址   http://192.168.1.112:8080/app/myweb?username=小红&password=abcd  URL url = new URL(httpUrl+"?username="+name+"&password=abcd"); HttpURLConnection conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");//请求方式conn.setConnectTimeout(15000);  //设置连接超时conn.setReadTimeout(10000);  //设置读取超时conn.connect();  //建立连接InputStream in = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));  //得到连接服务器的缓冲流String line;StringBuilder sb = new StringBuilder();while((line=br.readLine()) != null){    //从服务中读取请求返回的数据sb.append(line);}return sb.toString();} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return null;}}

服务端代码:

package CatServelet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class WebTestServelet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {resp.setContentType("text/html;charset=utf-8");  //防止中文乱码String name = req.getParameter("username");//name = new String(name.getBytes("ISO-8859-1"),"UTF-8");   //解决乱码问题方式一System.out.println(name);String password = req.getParameter("password");resp.getWriter().print("password:" + password +"\n" +"username:"+name);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {req.setCharacterEncoding("UTF-8");//设定请求编码resp.setContentType("text/html;charset=utf-8");  //设定响应编码 防止中文乱码String name = req.getParameter("username");String password = req.getParameter("password");System.out.println(name);resp.getWriter().print("password:" + password +"\n" +"username:"+name);}}




0 0
原创粉丝点击