实验7:Android网络编程

7.1 知识点

1.

2.

7.2 实例步骤

1. 根据位置信息从中国天气网获取天气信息

简要说明……
详细步骤……

2. Socket编程

简要说明
  这个例子只用了TCP协议下的Socket编程,因此这里只讨论TCP的情况。
  在java中,服务器端socket、bind、listen等操作被封装在ServerSocket类库中,客户端socket、connect等操作被封装在Socket类库中。如需了解这些操作细节,可学习C语言下的socket编程。

详细步骤
服务器端步骤
1). servs = new ServerSocket(port);   //创建套接字,port 为指定的端口号
2). socket = servs.accept();       //等待连接,主线程会阻塞在这里
3). 为每个连接创建线程来服务;
4). 线程中进行读写socket【通信】。

客户端步骤
1). socket = Socket(“ip_str”, port);  //创建套接字,ip_str 为服务器端IP,port为端口号,和服务器端指定的要一样
2). 读写socket。            //1).中已经执行连接服务器的操作,所以接下来可以直接读写。
注意:
1). 客户端连接服务器的操作要放在新线程里面。
2). 需要添加权限:

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

3). 真机调试的时候,真机和主机要在同一个局域网。
核心代码
服务器端:(所有源码)

  1. public class Myserver {
  2. //定义保存所有的Socket的ArrayList
  3. public static ArrayList<Socket> socketList = new ArrayList<Socket>();
  4. public static void main(String[] args)
  5. throws IOException
  6. {
  7. ServerSocket ss = new ServerSocket(9402); //端口号为9402
  8. while (true)
  9. {
  10. Socket s = ss.accept();
  11. socketList.add(s);           //把新连接加入ArrayList中。
  12. //每连接一个客户端就开一个线程为之服务
  13. new Thread(new ServerThread(s)).start();
  14. }
  15. }
  16. }

客户端代码:(所有源码)

  1. public void run()
  2. {
  3. try {
  4. s = new Socket("192.168.240.22", 9402); //IP是服务器IP, 端口号和服务器一致
  5. br = new BufferedReader((new InputStreamReader(s.getInputStream())));
  6. os = s.getOutputStream();
  7. //do something
  8. }
  9. catch (...)
  10. {
  11. //...
  12. }
  13. }

另一个例子:https://github.com/hzuapps/android-labs/tree/master/app/src/main/java/edu/hzuapps/androidworks/homeworks/net1314080903204/tcp_tester

3. 从aqicn.org获取PM2.5信息@ZhengQZ123

简要说明……
利用aqicn.org提供的接口,显示pm2.5的数值
详细步骤……

  1. 获取网络权限
    1. <uses-permission android:name="android.permission.INTERNET"/>
    2.读取http://aqicn.org/publishingdata/json提供的json数据
    1. BufferedReader reader = new BufferedReader(new InputStreamReader(new
    2. URL("http://aqicn.org/publishingdata/json").openStream(), "utf-8"));
    3. String line=null;
    4. StringBuffer content =new StringBuffer();
    5. while((line=reader.readLine())!=null)
    6. {
    7. content.append(line);
    8. }
    3.解析获取到的json数据
    1. try {
    2. JSONArray jsonarr=new JSONArray(s);
    3. JSONObject firstJO=jsonarr.getJSONObject(0);
    4. JSONArray pollutants=firstJO.getJSONArray("pollutants");
    5. JSONObject firstPollutants=pollutants.getJSONObject(0);
    6. System.out.println("cityName=" firstJO.getString("cityName") ",local=" firstJO.getString("localName"));
    7. String cityName= firstJO.getString("cityName");
    8. String localName= firstJO.getString("localName");
    9. Double pollutant=firstPollutants.getDouble("value");
    10. String a=cityName+" "+localName+":"+pollutant;
    11. firstJO.getString("localName"),firstPollutants.getDouble("value"));
    12. tvPmData.setText(a);
    13. } catch (JSONException e) {
    14. e.printStackTrace();
    15. }
    4.将获取到的数据按照需要显示出来 tvPmData.setText(a)

activity代码:(https://github.com/ZhengQZ123/android-labs/blob/master/app/src/main/java/edu/hzuapps/androidworks/homeworks/net1314080903247/Net1314080903247Activity.java)

AndroidManifest代码:(https://github.com/ZhengQZ123/android-labs/blob/master/app/src/main/java/edu/hzuapps/androidworks/homeworks/net1314080903247/AndroidManifest.xml)

activity xml代码:(https://github.com/ZhengQZ123/android-labs/blob/master/app/src/main/res/layout/activity_net1314080903247.xml)