服务端和Android客户端利用Socket传输JSON数据

JSON是一种组织数据的结构模型(和XML类似),当需要在服务端和Android客户端之间传递大量字符串数据时,采用JSON往往比较高效。
服务端(核心代码):

byte[] jsonByte = polmanListStr.getBytes("GB2312");
DataOutputStream  output = new DataOutputStream(socket.getOutputStream());
output.write(jsonByte);
System.out.println("发送的数据的长度:" + jsonByte.length);
System.out.println("-----------------------------------------");
output.flush();
socket.shutdownOutput();

这里的polmanListStr是javabean类型转换成json类型后的json字符串:

{"policelist":[{"name":"胡亮","phoneNumber":"456789","type":"协警"},{"name":"孙明","phoneNumber":"345678","type":"刑警"},{"name":"钱伟","phoneNumber":"234567","type":"民警"},{"name":"赵亮","phoneNumber":"123456","type":"民警"},{"name":"胡敏","phoneNumber":"567890","type":"协警"}]}

1、先将polmanListStr这个字符串转换成字节流:

//指定转换成字节流的编码格式:GB2312(Android默认的编码格式)
byte[] jsonByte = polmanListStr.getBytes("GB2312");

2、将得到的字节流写入socket的输出流传给Android客户端

DataOutputStream  output = new DataOutputStream(socket.getOutputStream());
output.write(jsonByte);

Android客户端(核心代码):

updateSocket = new Socket(ip, port);
DataInputStream in = new DataInputStream(updateSocket.getInputStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String JsonStr = null;
byte[] by = new byte[2048];
int n;
while ((n = in.read(by)) != -1)
{
    baos.write(by, 0, n);
}
JsonStr = new String(baos.toByteArray(),"GB2312");
JSONObject polListJsonObj = new JSONObject(JsonStr);
JSONArray polArray = polListJsonObj
                            .getJSONArray("policelist");
JSONObject jsonObj = polArray.getJSONObject(1);
PoliceMan policeman = new PoliceMan(
                            jsonObj.getString("name"),
                            jsonObj.getString("type"),                          jsonObj.getString("phoneNumber"));

1、先从socket输入流中得到从服务端传输过来的字节流:

DataInputStream in = new DataInputStream(updateSocket.getInputStream());

2、将得到的字节流读取出来,并写到字符串数组输出流中:

while ((n = in.read(by)) != -1)
{
    baos.write(by, 0, n);
}

3、将字符串数组输出流转换成字符串:

//这里的编码格式和服务端的编码格式保持一致(GB2312)
JsonStr = new String(baos.toByteArray(),"GB2312");

最后得到的JsonStr 是服务端的polmanListStr一样的json字符串:

{"policelist":[{"name":"胡亮","phoneNumber":"456789","type":"协警"},{"name":"孙明","phoneNumber":"345678","type":"刑警"},{"name":"钱伟","phoneNumber":"234567","type":"民警"},{"name":"赵亮","phoneNumber":"123456","type":"民警"},{"name":"胡敏","phoneNumber":"567890","type":"协警"}]}

4、利用json字符串构建JSONObject:

//将得到的字符串转换化成了JSONObject,里面存放的是数组
JSONObject polListJsonObj = new JSONObject(JsonStr);
//得到JSONObject的数组
JSONArray polArray = polListJsonObj
                            .getJSONArray("policelist");
//取出数组中的JSONObject对象(这里取出的是第1个)
JSONObject jsonObj = polArray.getJSONObject(1);

5、利用JSONObject对象来构建JavaBean对象

//和map集合类似(key-value)
PoliceMan policeman = new PoliceMan(jsonObj.getString("name"), jsonObj.getString("type"), jsonObj.getString("phoneNumber"));

需要注意的地方
1、在服务端需要导入相应的JSON的jar包:
服务端:
服务端
2、Android客户端中自带有JSON的jar包:org.json.*。专门用来处理JSON数据。
如果需要额外导入第三方的JSON jar包,不要将这些第三jar包放在工程的libs文件夹下,这个文件夹是工程创建时自带的,当把第三方jar包复制到该文件夹下后就算导入到工程下了,在工程中可以使用:
这里写图片描述
这里的android-support-v4.jar就是android sdk已经给我们打包并提供给我们使用的jar包。存放在下面的位置下:
这里写图片描述
当需要使用第三方的JSON jar包时,我首先是将第三方的JSON jar包复制到libs文件夹下,但因为这个第三方的jar中定义的类和android sdk提供的类有重复,所以报出以下文件重复定义的错误:

[2015-04-09 10:26:31 - Dex Loader] Unable to execute dex: Multiple dex files define Lorg/apache/commons/collections/FastHashMap;
[2015-04-09 10:26:31 - MobileOA] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/apache/commons/collections/FastHashMap;

这时,只需要在工程目录下另外新建一个文件夹(json),并把第三方JSON jar包复制到该文件夹下,然后右键工程导入第三方jar包。这样就能在程序中使用自己想要用的jar包了。
这里写图片描述
需要使用哪个就import哪一个就可以啦:

import net.sf.json.JSONArray;//这是导入的第三方jar包
import org.json.JSONArray;//这是系统默认的jar包

2、调用socket的shutdownOutput()和shutdownIutput()来关闭输入、输出流。如果调用输入、输出流的close()函数,会默认地关闭socket,导致通信中断。

猜你喜欢

转载自blog.csdn.net/whurs/article/details/44948117