次元画社(四),与服务器聊聊天

张天宇 on 2018-03-11

一、前

​ 对于一个图片社区来说,仅使用自带的图片当然是远远不够的。现在来加入图片从服务器获取的功能,因为对保密性及性能要求不高,这里采用Servlet传输数据,Json解析,本次介绍暂不涉及数据库操作。

​ 流程简要如下:

效果图

二、服务器设置

1.准备

​ 这里我们为了临时测试Android,使用已经写好的Json字符串放置在Servlet等待访问。

1
2
//192.168.1.106为我的局域网IP,请根据自己情况自行配置
[{"url":"http://192.168.1.106/Cyhs/1.jpg","author":"cyhs"},{"url":"http://192.168.1.106/Cyhs/2.jpg","author":"cyhs"},{"url":"http://192.168.1.106/Cyhs/3.jpg","author":"cyhs"},{"url":"http://192.168.1.106/Cyhs/4.jpg","author":"cyhs"},{"url":"http://192.168.1.106/Cyhs/5.jpg","author":"cyhs"}]

2.Servlet

​ ImgServlet:直接将上述字符串打印输出即可。

1
2
3
4
5
6
response.getWriter().write("[");
for (int i=1;i<5;i++){
response.getWriter().append("{\"url\":\"http://192.168.1.106/Cyhs/"+i+".jpg\","+"\"author\":\"cyhs\"},");
}
response.getWriter().append("{\"url\":\"http://192.168.1.106/Cyhs/"+4+".jpg\","+"\"author\":\"cyhs\"}");
response.getWriter().append("]");

三、实体类

​ 为了方便我们在Android端对数据更好的解析和处理,使用实体类将数据规格化。

1
2
3
4
5
public class Images {
public String sURL;
public String sAuthor;
//省略了get、set函数
}

四、解析

1.网络访问HttpUtils

​ 这里我们设置了一个HttpUtils工具类,用来存放网络相关操作,今天用到了获取Servlet返回值,暂且写一个getServer()函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static String getServer(String URL){
boolean loginValidate = false;
String responseMsg="网络出错";
//servlet服务器地址URL
HttpPost request = new HttpPost(URL);
try {
HttpClient client = getHttpClient();
//执行请求
HttpResponse response = client.execute(request);
//response是servlet给出的返回结果
if(response.getStatusLine().getStatusCode() == 200){
loginValidate = true;
responseMsg = EntityUtils.toString(response.getEntity());
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return responseMsg;
}

2.解析类ImageParse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class ImageParse {
public static ArrayList<Images> imageParse(String imaData) {
ArrayList<Images> imagesArrayList = new ArrayList<>();
try {
JSONArray jsonArray = new JSONArray(imaData);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String sURL = jsonObject.getString("url");
String sAuthor = jsonObject.getString("author");
Images images = new Images(sURL, sAuthor);
imagesArrayList.add(images);
}
} catch (Exception e) {
e.printStackTrace();
}
return imagesArrayList;
}
}

3.使用

​ 因为Android网络操作不能在主线程中使用,将其放入另一个线程开启。

1
2
3
4
5
6
class ImaThread implements Runnable {
public void run() {
//msg服务器返回的信息
msg = HttpUtils.getServer(StaticData.getImgServer());
}
}

​ 合适的地方使用,我采取了在启动动画中解析。

1
2
3
Thread imaThread = new Thread(new ImaThread());
imaThread.start();
ArrayList<Images> imagesArrayList = ImageParse.imageParse(msg);

五、后

​ 这样,简单的与服务器通信功能就写好了。

​ 同样的,你还可以使用AES加密等方式给ID、pwd加密,从而实现登陆的操作。

​ 有不好的地方欢迎大家指出,祝好!