服务端和Android客户端利用Socket传输JSON数据
2015-04-08 22:37
573 查看
JSON是一种组织数据的结构模型(和XML类似),当需要在服务端和Android客户端之间传递大量字符串数据时,采用JSON往往比较高效。
服务端(核心代码):
这里的polmanListStr是javabean类型转换成json类型后的json字符串:
1、先将polmanListStr这个字符串转换成字节流:
2、将得到的字节流写入socket的输出流传给Android客户端
Android客户端(核心代码):
1、先从socket输入流中得到从服务端传输过来的字节流:
2、将得到的字节流读取出来,并写到字符串数组输出流中:
3、将字符串数组输出流转换成字符串:
最后得到的JsonStr 是服务端的polmanListStr一样的json字符串:
4、利用json字符串构建JSONObject:
5、利用JSONObject对象来构建JavaBean对象
需要注意的地方
1、在服务端需要导入相应的JSON的jar包:
服务端:
![](http://img.blog.csdn.net/20150408223041262)
2、Android客户端中自带有JSON的jar包:org.json.*。专门用来处理JSON数据。
如果需要额外导入第三方的JSON jar包,不要将这些第三jar包放在工程的libs文件夹下,这个文件夹是工程创建时自带的,当把第三方jar包复制到该文件夹下后就算导入到工程下了,在工程中可以使用:
![](http://img.blog.csdn.net/20150409125617198)
这里的android-support-v4.jar就是android sdk已经给我们打包并提供给我们使用的jar包。存放在下面的位置下:
![](http://img.blog.csdn.net/20150409125931138)
当需要使用第三方的JSON jar包时,我首先是将第三方的JSON jar包复制到libs文件夹下,但因为这个第三方的jar中定义的类和android sdk提供的类有重复,所以报出以下文件重复定义的错误:
这时,只需要在工程目录下另外新建一个文件夹(json),并把第三方JSON jar包复制到该文件夹下,然后右键工程导入第三方jar包。这样就能在程序中使用自己想要用的jar包了。
![](http://img.blog.csdn.net/20150409130425467)
需要使用哪个就import哪一个就可以啦:
2、调用socket的shutdownOutput()和shutdownIutput()来关闭输入、输出流。如果调用输入、输出流的close()函数,会默认地关闭socket,导致通信中断。
服务端(核心代码):
[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,导致通信中断。
相关文章推荐
- Android客户端与服务器端通过SOCKET连接进行读写(将JSON数据转化为字符串后传输)
- android客户端和java服务端之间用socket来传输图片
- Android与Java 服务器使用Socket协议实现Json数据传输
- [Android通信]基于socket的聊天app(三):传输json数据
- Android利用Json来进行网络数据传输
- android客户端和java服务端之间用socket来传输图片
- Android客户端从服务端获取数据JSON解析
- 【Android 开发】: Android客户端与服务端之间使用JSON交互数据。
- android客户端和java服务端之间用socket来传输图片(示例代码)
- SpringMvc 服务端发布json数据+android客户端解析json数据
- 用.Net打造一个移动客户端(Android/IOS)的服务端框架NHM(二)——“请求”“交互”与传输数据(服务器端)
- 实践Android客户端与服务端之间使用JSON交互数据。
- Android客户端与服务端(jsp)之间json的传输与解析【附效果图附源码】
- Android 对Android客户端与服务端传递的Json数据进行加密、解密操作
- Android客户端与服务端之间传递json数据
- Android客户端与服务器HTTP交互,数据以json格式传输
- Android客户端和Servlet服务端的JSON传输(注释详细到啰嗦的地步,欢迎新手学习)
- android客户端和java服务端之间用socket来传输图片(示例代码)
- android使用JSON进行网络数据交换(服务端、客户端)的实现
- Struts2服务器和Android客户端利用JSON进行数据的传递