Erlang 聊天室程序(三) 数据交换格式---json的decode
来源:互联网 发布:mac系统镜像文件下载 编辑:程序博客网 时间:2024/04/30 10:16
霸哥的blog中提到过Erlang服务器在通信中与客户端的数据交换方式:yufeng
为了简单起见这个聊天室程序采用json,要使用到rfc4627这个库
先定义一个Message类:
public class Message {String id; //消息IDString type; //消息类型String from; //发送方String to; //接收方String subject; //主题String content; //内容Date creationDate; //时间public Message(String type,String from,String to,String subject,String content){this.id =MessageIdGenerator.nextId();this.type=type;this.from=from;this.to=to;this.subject=subject;this.content=content;this.creationDate=new Date();}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getFrom() {return from;}public void setFrom(String from) {this.from = from;}public String getTo() {return to;}public void setTo(String to) {this.to = to;}public String getSubject() {return subject;}public void setSubject(String subject) {this.subject = subject;}public String getContent() {return content;}public void setContent(String content) {this.content = content;}public Date getCreationDate() {return creationDate;}public void setCreationDate(Date creationDate) {this.creationDate = creationDate;}}再定义一个JSON的工具类:
public class JSONParaser {public static JSONObject getJSON(Object content){try{JSONObject result = JSONObject.fromObject(content);return result;}catch(Exception ex){return null;}}public static Object getString(String json){try{JSONObject jobj=JSONObject.fromObject(json);return JSONObject.toBean(jobj);}catch(Exception ex){return null;}}}再修改SOCKET 发送部分代码:
public void sendMsg(Message msg){try {String data=(JSONParaser.getJSON(msg)).toString();oust.write(data.getBytes());oust.flush();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}测试下发送后服务器端接收到的数据:
client_session dwmsg recived {message,undefined,msg, [6], undefined,undefined, <<"{\"content\":\"aaaaa\",\"creationDate\":{\"date\":27,\"day\":1,\"hours\":13,\"minutes\":10,\"month\":1,\"seconds\":26,\"time\":1330319426281,\"timezoneOffset\":-480,\"year\":112},\"from\":\"client1\",\"id\":\"x8yL-2\",\"subject\":\"chat\",\"to\":\"\",\"type\":\"msg\"}">>, undefined}client_session dwmsg sended
服务器端新建一个模块util_MessageParas,将收到的json数据转成内部可识的message:
%% Author: Administrator%% Created: 2012-2-27%% Description: TODO: Add description to util_MessageParas-module(util_MessageParas).%%%% Include files%%%%-include("json.hrl").-include("message.hrl").%%%% Exported Functions%%<<"{\"content\":\"aaa\",\"creationDate\":{\"date\":27,\"day\":1,\"hours\":18,\"minutes\":8,\"month\":1,\"seconds\":26,\"time\":1330337306984,\"timezoneOffset\":-480,\"year\":112},\"from\":\"client1\",\"id\":\"289n-2\",\"subject\":\"chat\",\"to\":\"\",\"type\":\"msg\"}">>-export([paraseDecode/1]).%%%% API Functions%%%%%% Local Functions%%%paras json data to messageparaseDecode(Bin)->case rfc4627:decode(Bin) of{ok,Obj,_Re}->paraElements(Obj);{error,Reason}->{error,Reason}end.%we get elements from decoded json,%it has to be 7 elementsparaElements(Obj)->{obj,List}=Obj,Data =#message{},%catch exception heretry paraEle(List,Data)catch{error,Reason,NewData}->io:format("Format"),{error,Reason,NewData}end.paraEle([Ele|Els],Data)->NewData=para(Ele,Data),paraEle(Els,NewData);paraEle([],Data)->Data.%length of content should not more than 1000para({"content",Val},Data) when is_binary(Val)->io:format("para content:~p~n",[Data]),Content=binary_to_list(Val),if length(Content)<1000 -> NewData=Data#message{content=Content}, io:format("paraed content:~p~n",[NewData]), NewData; true -> throw({error,"illegal Content value",Data})end;para({"to",Val},Data) when is_binary(Val)->io:format("para to:~p~n",[Data]),To =binary_to_list(Val),NewData=Data#message{to=To};para({"id",Val},Data) when is_binary(Val)->io:format("para id:~p~n",[Data]),Id=binary_to_list(Val),NewData=Data#message{id=Id};para({"subject",Val},Data) when is_binary(Val)->io:format("para subject:~p~n",[Data]),Sub=binary_to_list(Val),%we should validate subject here if Sub=:="chat" -> NewData=Data#message{subject=Sub}; true -> %throw exception throw({error,"illegal subject value",Data})end;para({"type",Val},Data) when is_binary(Val)->io:format("para type:~p~n",[Data]),Type = binary_to_list(Val),if Type=:="msg"-> NewData=Data#message{type=Type}; true -> %throw exception throw({error,"illegal type value",Data})end;para({"from",Val},Data) when is_binary(Val)->io:format("para from:~p~n",[Data]),From=binary_to_list(Val),NewData=Data#message{from=From};para({"creationDate",Val},Data)->Data;para({Key,Val},Data)->%no mache %throw exceptionthrow({error,"unkown element",Data}).paraseEncode()->ok.
做下测试:
util_MessageParas:paraseDecode(<<"{\"content\":\"aaa\",\"creationDate\":{\"date\":27,\"day\":1,\"hours\":18,\"minutes\":8,\"month\":1,\"seconds\":26,\"time\":1330337306984,\"timezoneOffset\":-480,\"year\":112},\"from\":\"client1\",\"id\":\"289n-2\",\"subject\":\"chat\",\"to\":\"\",\"type\":\"msg\"}">>).para content:{message,undefined,undefined,undefined,undefined,undefined, undefined,undefined}paraed content:{message,undefined,undefined,undefined,undefined,undefined, "aaa",undefined}para from:{message,undefined,undefined,undefined,undefined,undefined,"aaa", undefined}para id:{message,undefined,undefined,"client1",undefined,undefined,"aaa", undefined}para subject:{message,"289n-2",undefined,"client1",undefined,undefined,"aaa", undefined}para to:{message,"289n-2",undefined,"client1",undefined,"chat","aaa", undefined}para type:{message,"289n-2",undefined,"client1",[],"chat","aaa",undefined}{message,"289n-2","msg","client1",[],"chat","aaa",undefined}
OK,收到的数据可以正常地解析为message了。
注:
在此处只需要将json数据的外层转换为message消息。message消息针对不同的类型和作用会有不同的json内容,所以内层数据应该在具体的消息处理部分再调用相应的paras处理。
- Erlang 聊天室程序(三) 数据交换格式---json的decode
- Erlang 聊天室程序(四) 数据交换格式---json的encode
- JSON数据交换格式
- JSON数据交换格式
- JSON - 轻量级的数据交换格式
- JSON:一种轻量级的数据交换格式
- JSON:一种轻量级的数据交换格式
- JSON --- 一种轻量级的数据交换格式
- 文本数据交换格式:JSON
- Json轻量级数据交换格式
- Erlang 聊天室程序(二) 客户端的退出
- JSON数据模式--轻量级的数据交换格式!
- Erlang 聊天室程序( 一)
- Erlang 聊天室程序( 一)
- Erlang 聊天室程序
- 关于数据交换格式XML和JSON的比较
- JSON——基于javascript的轻量级数据交换格式
- 于数据交换格式XML和JSON的比较
- C语言排序算法总结
- vmware 挂起再恢复报错
- 设计模式六大原则(3):依赖倒置原则
- 常用的二级导航样式
- java的HashCode方法
- Erlang 聊天室程序(三) 数据交换格式---json的decode
- 【Cortex-M0】16串行外围设备接口(SPI)控制器
- C# lock关键字叙述
- Seasar2 2.新建项目说明
- boost regex 超详细教程
- 云计算之存储即服务-结构化数据存储(1)
- 位图文件(BMP)格式分析以及程序实现
- 【Cortex-M0】17模拟数字转换
- 下拉滑动门