失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android使用json和Http实现与服务器的简单交互

Android使用json和Http实现与服务器的简单交互

时间:2022-08-02 20:04:28

相关推荐

Android使用json和Http实现与服务器的简单交互

自己学习android与服务器数据交互时,在网上看了很多例子,要么是例子代码太多没耐心看,要么是代码没发全,对于一个白手来说理解起来有困难,所以我在自己成功后决定写一篇博客来讲解android与服务器数据交互。由于刚学,解释很多时我自己的理解,有可能有错误,大家看完后有助于自己的理解就好必要太较真。

代码与解释如下:

服务器端(jsp+java+tomcat):

(1)servlet(Service .java)

import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import com.mysql.jdbc.Connection;import .apache.xpath.internal.operations.Bool;import DBSql.DBUtil;import DBSql.Write;import Student.Serv;import Student.Tools;@WebServlet("/Service")public class Service extends HttpServlet {private static final long serialVersionUID = 1L; //Serv类用于模拟一些进行交互的数据private Serv service1 = new Serv(); /*** @see HttpServlet#HttpServlet()*/public Service() {super(); }/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub//获取值String username = request.getParameter("Message");String password = request.getParameter("password");Student student=new Student();student.setName("wang");student.setNum("");//System.out.print(Write.panduan(username, password));if("123".equals(username)&&"789".equals(password)){//账号:123 密码:789System.out.print(Tools.createJsonString("listMap", service1.getListMaps()));response.setContentType("text/html;charset=UTF-8");response.getWriter().print("success");}else{response.setContentType("text/html;charset=UTF-8");//密码错误后,原来是返回false,现在为了测试json,我将下面换成了一个json数组response.getWriter().print(Tools.createJsonString("listMap", service1.getListString()));}}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stub }}

(2)Serv.java用于生成一些json数据,以供servlert调用

以下代码中有4个函数生成不同的json数据,本例中Service .java中使用的是第三个函数

package Student;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Serv {public Serv() { // TODO Auto-generated constructor stub } //json中值使用""引起来的所以下面用转义字符\"来将数据包起来,若无\"同样可以传过去但是jsonArray中无法解析public Person getPerson(){ Person person = new Person(23, "\"AHuier\"", "\"XIAMEN\""); return person; } //json中值使用""引起来的所以下面用转义字符\"来将数据包起来,若无\"同样可以传过去但是jsonArray中无法解析 public List<Person> getListPerson(){ List<Person> list = new ArrayList<Person>(); Person person1 = new Person(1001, "\"AHuier1\"", "\"Beijing\""); Person person2 = new Person(1002, "\"AHuier2\"", "\"shenzheng\""); list.add(person1); list.add(person2); return list; } //json中值使用""引起来的所以下面用转义字符\"来将数据包起来,若无\"同样可以传过去但是jsonArray中无法解析public List<String> getListString(){ List<String> list = new ArrayList<String>(); list.add("\"Hello\""); list.add("\"World\""); list.add("\"AHuier\""); return list; } //json中值使用""引起来的所以下面用转义字符\"来将数据包起来,若无\"同样可以传过去但是jsonArray中无法解析 public List<Map<String, Object>> getListMaps(){ List<Map<String, Object>> listMap = new ArrayList<Map<String,Object>>(); Map<String, Object> map1 = new HashMap<String, Object>(); map1.put("color", "\"red\""); map1.put("id", 01); map1.put("name", "\"Polu\""); listMap.add(map1); Map<String, Object> map2 = new HashMap<String, Object>(); map2.put("id", 07); map2.put("color", "\"green\""); map2.put("name", "\"Zark\""); listMap.add(map2); return listMap; } }

此时服务器端已经写完了,下面我们使用安卓客户端访问这个服务器来实现数据交互

服务器端(jsp+java+tomcat):

首先添加网络依赖

<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

然后导入包

这些包是与json有关的,一下是包的下载链接

链接:/s/1_3KN2NQ7DihzgNedfHQDyA

提取码:derr

(1)NetUtil类来实现与服务器的交互函数

package com.example.myapplication;/*** Created by 海绵宝宝 on /4/20.*/import java.io.ByteArrayOutputStream;import java.io.InputStream;import .HttpURLConnection;import .URL;public class NetUtil {/*** 发送http请求* @param username* @param password*/public static String loginOfGet(String username,String password){HttpURLConnection conn=null;//一下为自己的服务器ip,10.0.2.2:8081是本机的ip,android中本机ip不是localhostString myurl = "http://10.0.2.2:8081/ajaxchuazhi/Service?";try {//拼接字符串向服务器传值String data="Message="+username+"&password="+password;URL url=new URL(myurl+data);conn=(HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(10000);conn.setReadTimeout(5000);conn.connect();int code=conn.getResponseCode();if(code==200){//接受数据InputStream is=conn.getInputStream();String state=getStringFromInputStream(is);return state;}} catch (Exception e) {e.printStackTrace();}finally{if(conn!=null){conn.disconnect();}}return null;}/*** 根据输入流返回一个字符串* @param is* @throws Exception*///接受数据的函数private static String getStringFromInputStream(InputStream is) throws Exception{ByteArrayOutputStream baos=new ByteArrayOutputStream();byte[] buff=new byte[1024];int len=-1;while((len=is.read(buff))!=-1){baos.write(buff, 0, len);}is.close();String mes=baos.toString();baos.close();return mes;}}

MianActivity.java代码

package com.example.myapplication;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;import android.widget.Toast;import android.widget.EditText;import net.sf.json.JSONObject;import org.json.JSONArray;public class MainActivity extends AppCompatActivity {public Button bt;public EditText et_username;public EditText et_password;public TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bt = (Button)findViewById(R.id.button);tv = (TextView)findViewById(R.id.textView);et_username = (EditText)findViewById(R.id.username);et_password = (EditText)findViewById(R.id.password);//按钮设置点击事件bt.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//主线程无法访问网络,开启一个新线程new Thread(new Runnable() {//获取账号密码final String username = et_username.getText().toString();final String password = et_password.getText().toString();@Overridepublic void run() {//访问网络要在子线程中实现,使用get取数final String state=NetUtil.loginOfGet(username,password);//执行在主线程上(返回主线程显示)runOnUiThread(new Runnable() {public void run() {//就是在主线程上操作,弹出结果if(state.equals("success")){tv.setText(state);}else{try {//将数据转化成JSONObjectJSONObject jsonObject = JSONObject.fromObject(state);//将JSONObject中数据放入JSONArray数组中net.sf.json.JSONArray family = jsonObject.getJSONArray("listMap");for (int i = 0; i < family.size(); i++) { //提取出family中的所有String s1 = (String) family.get(i);System.out.println("currentFamily:" + s1);}}catch (Exception e){e.printStackTrace();}Toast.makeText(MainActivity.this, state ,Toast.LENGTH_LONG).show();}}});}}).start();}});}}

(3)布局文件中的代码

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:id="@+id/textView"android:layout_marginBottom="49dp"android:layout_above="@+id/button"android:layout_centerHorizontal="true" /><Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="confirm"tools:layout_editor_absoluteX="148dp"tools:layout_editor_absoluteY="153dp"android:layout_marginBottom="100dp"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true" /><EditTextandroid:id="@+id/username"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:layout_marginTop="72dp"android:ems="10"android:inputType="textPersonName"android:hint="username" /><EditTextandroid:id="@+id/password"android:layout_width="wrap_content"android:layout_height="wrap_content"android:ems="10"android:inputType="textPersonName"android:hint="password"android:layout_below="@+id/username"android:layout_alignLeft="@+id/username"android:layout_alignStart="@+id/username"android:layout_marginTop="58dp" /></RelativeLayout>

此时代码就完成了

可以看到json数据已经接收到

json的解析

如果觉得《Android使用json和Http实现与服务器的简单交互》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。