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

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

2015-04-08 22:37 573 查看
JSON是一种组织数据的结构模型(和XML类似),当需要在服务端和Android客户端之间传递大量字符串数据时,采用JSON往往比较高效。

服务端(核心代码):

[code]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字符串:

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


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

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


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

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


Android客户端(核心代码):

[code]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输入流中得到从服务端传输过来的字节流:

[code]DataInputStream in = new DataInputStream(updateSocket.getInputStream());


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

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


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

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


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

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


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

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


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

[code]//和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提供的类有重复,所以报出以下文件重复定义的错误:

[code][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哪一个就可以啦:

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


2、调用socket的shutdownOutput()和shutdownIutput()来关闭输入、输出流。如果调用输入、输出流的close()函数,会默认地关闭socket,导致通信中断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐