您的位置:首页 > 移动开发 > Android开发

android做客户端连接web服务器

2015-11-23 20:28 337 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: