android做客户端连接web服务器
android要想实现应用肯定是离不开连接网络
一、android客户端:
(1)配置文件(AndroidMainfest):
加入下列代码:
<uses-permission android:name="android.permission.INTERNET"/>
添加位置只要在< application>标签外面就可以了
(2)MainActivity:
public class MainActivity extends Activity {
String result = "";
String url="http://192.168.0.6:8909/ServletTest/servlet2";
/*这里是连接服务器的url,如果不懂后面还有更详细地解释*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*点击button执行连接网络代码*/
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
connectInternet();
/*连接网络,result会被赋值*/
Log.e("asdaa", result);
/*在控制台输出result*/
}
});
}
public void connectInternet() {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
HttpClient hc = new DefaultHttpClient();
HttpPost hp = new HttpPost(
url);
JSONObject jo = new JSONObject();
/*JSONObject在连接网络传递数据是最常用的包装数据方式,当然也可以直接发送String类型的*/
try {
jo.put("name", "zwq");
/*给jo赋值,jo中是以键值对的形式存在*/
StringEntity se = new StringEntity(jo.toString());
/*包装可以通过网络发送的数据*/
hp.setEntity(se);
/*将包装好的数据放在hp中*/
HttpResponse hr = hc.execute(hp);
/*执行连接语句并获得返回数据*/
if (hr.getStatusLine().getStatusCode() == 200)
/*200是固定的,如果等于200,就说明服务器连接成功并有返回值*/
{
result = EntityUtils.toString(hr.getEntity());
/*解析获得的数据并赋值给result*/
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
另外说明一下:android4.0以后不能在主线程中连接网络,所以需要重新创建线程;还有除主线程外,其他线程不能改主界面显示的内容,需要用handler配合使用。
二web客户端:
我主要用的是javaee和myeclipse,插件是tomcat,如何配置环境,可以百度搜一下,资料挺多的。
先看一下我的项目目录:
(1)配置文件中(web.xml):
<servlet>
<servlet-name>MMM</servlet-name>
<!-- 服务名字-->
<servlet-class>com.test.servlet2</servlet-class>
<!-- 服务路径,后面有解释-->
</servlet>
<servlet-mapping>
<servlet-name>MMM</servlet-name>
<!-- 服务名字-->
<url-pattern>/servlet2</url-pattern>
<!-- 捕获什么样的url-->
</servlet-mapping>
</web-app>
前面也提到了url是 “http://192.168.0.6:8909/ServletTest/servlet2”(别点开,点开也没用),192.168.0.6是服务器的IP地址;8909是Tomcat端口号;ServletTest是我自己创建的项目的名字;重点是/servlet2,在配置文件中 < url-pattern>/servlet2< / url-pattern>就是要捕获这个,如果url中符合全部的条件即IP地址没错,端口号没错,项目名称没错,最后面url与< url-pattern>中的对应起来,那客户端就可以访问< servlet-class>com.test.servlet2< /servlet-class>中的这个类了。
(2)servlet2.java中:
public class servlet2 extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = -8739666074906935331L;
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
/*从客户端传来的数据放在request,如果传数据方式是doGet,就把request和response传给doPost并执行*/
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String result = "";
String b="";
BufferedReader br = new BufferedReader(new InputStreamReader(
(ServletInputStream) request.getInputStream(), "utf-8"));
StringBuffer sb = new StringBuffer("");
String temp;
while ((temp = br.readLine()) != null) {
sb.append(temp);
}
br.close();
/*上述代码都是一样的,我用的时候都是复制的,无外乎就是对数据的截取*/
System.out.println("请求报文:" + sb.toString());
System.out.println("请求成功");
try {
JSONObject jo=new JSONObject(sb.toString());
/*把获得String类型数据转化成JSONObject方便操作*/
if(jo.getString("name").equals("zwq")){
b="ok";
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("返回报文:" + b.toString());
PrintWriter pw = response.getWriter();
pw.write(b.toString());
/*返回数据*/
pw.flush();
pw.close();
}
}
服务端ok了
需要特别注意的是乱码问题,也百度搜一搜吧。
分享一下我在连接网络的时候经常碰到的问题:
①:配置文件中没有添加网络权限:
< uses-permission android:name=”android.permission.INTERNET”/>
②:服务端出错,现在主要是用tomcat做服务,做好服务端之后可以先用浏览器试用链接
③:不能在主线程连接网络:
android 4.0以后需要添加一个线程去访问网络
④:注意HttpPost中的url,这次因为忽略了”http:”后的”//”弄了半天才纠结过来
因为目前我现在主要研究android,javaweb方面也接触过,看看以后有空的话再详细地解释下javaweb。
这里代码的客户端,使用的是安卓的HttpClient,也可以使用java的HttpURLConnection