好久没玩安卓了,这两天又把以前一个未完成了小程序拿出来完善下,前面已经完成了socket通信,但只能传输简单的字符串信息,不能传递复杂的数据,如类似C++里的结构体,网上查了一遍,都说实现serializable接口来序列化,还有的用NDK,这个说太复杂,没试,最后问别人说用Json方便些,于是在网上找了下,发现真的比较简单,于是打算用它,刚开始找这个库花了点时间,最后干脆自己下了个源码自己编,最后总算能传递类信息了,下面说下我的步骤:
一、PC端
1.在网上好json的源码,我下的是0.5版本的,http://www.oschina.net/p/jsoncpp/,我在这里下的,目录内容如下:
2.我用VC++6.0创建了个静态库工程(空工程),然后把源码包里的src\lib_json和include\json下的所有文件都拷到该工程目录下,然后把这些文件添加到工程里,注意我不是把include\json目录拷过来的,所以要把几个文件中的#include啥的改成#include
"writer.h",各位编一下就能找到是哪几处地方了,好像只有4-5个地方。然后就能编出静态库来了。我编出来是buildjson.lib
3.然后把头文件和库放到自己的项目中去,这步最简单了
4.在自己的项目中添加要用到的jsonu头文件和库:
#include "json.h"
...
#pragma comment(lib, "buildjson.lib")
...
5.然后把socket接收到的Buf里的数据一个个取出来,我要android端定义了一个这样的类:
public class login_info implements Serializable
{
public String user_count;
public String
user_passwd;
public int user_id;
public login_info(String
user_count, String user_passwd, int user_id)
{
this.user_count = user_count;
this.user_passwd = user_passwd;
this.user_id = user_id;
}
}
然后在PC端我是这样解析的(这里只贴部分代码):
Json::Reader
reader; Json::Value
root; std::string
user_count;
std::string
user_passwd;
int
user_id ;
OutputDebugString(buf);//这里的buf是recv的参数。
if
(reader.parse(buf, root)) //
reader将Json字符串解析到root,root将包含Json里所有子元素 { user_count
= root["user_count"].asString(); //
访问节点user_count
user_passwd
= root["user_passwd"].asString(); //
访问节点user_passwd user_id
= root["user_id"].asInt(); //
访问节点user_id } OutputDebugString(user_count.c_str());
OutputDebugString(user_passwd.c_str());
这样,安卓端发送过来的数据就都能解析出来了
二。安卓端的实现
安卓端也是通过socket将json数据发送过来的,建立工程之类的我这里就不说了,大家自己去完成,这里我只说要socket传输json数据的部分。
1.首先你得把第三方gson的Jar包放到android工程里的libs目录下,我用的是gson-2.2.4.jar
2.首先定义如下的待传送的类:
public class login_info implements Serializable
{
public String user_count;
public String
user_passwd;
public int user_id;
public login_info(String
user_count, String user_passwd, int user_id)
{
this.user_count = user_count;
this.user_passwd = user_passwd;
this.user_id = user_id;
}
}
3.然后在socket发送数据时的处理:
s_writer = new BufferedWriter(new
OutputStreamWriter(s_socket.getOutputStream()));
login_info li = new login_info("wangwu","123456",111);
String
str=new Gson().toJson(li);
s_writer.write(str);
s_writer.flush();
好了,利用json传输和解析类信息就完成了。