- 浏览: 799640 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
107x:
不错,谢谢!
log4j.properties配置详解 -
gzklyzf:
为啥我解析的PDF文档没有作者、文章题目等信息啊,下面是我的代 ...
Apache Lucene Tika 文件内容提取工具 -
mervyn1024:
解压密码是啥
ictclas4j调整 -
百卉含英:
如果我的文件输出路径是这个log4j.appender.Fil ...
log4j.properties配置详解 -
lxhxklyy:
mark……
log4j.properties配置详解
Json在Ajax中已得到广泛的应用。相比XML,它有如下的优点:
1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小;
2. 易于解析这种语言, 客户端Javascript可以简单的通过eval()进行JSON数据的读取;
3. 支持多种语言, 包括Actionscript, C, C#, ColdFusion, Java, Javascript, Perl, PHP, Python, Ruby等语言服务器端语言, 便于服务器端的解析;
4. 在PHP世界, 已经有PHP-JSON和JSON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生JSON格式, 便于客户端的访问提取。
除了BS模式,CS模式自然也可以使用JSON的格式。毕竟,我们可以简单的将其视为一个hashmap。那么,与一般的传送byte[]方式比较,JSON的优劣又体现在哪里?
带宽算劣势么?直接的JSON文本显然比byte[]占用更多空间,但JSON的格式在传送时候是压缩的,会不会有改善?
解析。JSON对多种语言提供了支持,便于解析。而python的pack和unpack风格,需要我们在各种语言中自行构建代码来支持。
String rule = "4'int'smallendian'time,1'int'smallendian'package_type,1'int'smallendian'msgType,6'string'bigendian'srcMAC," +"4'int'smallendian'nodeID,4'string'bigendian'nodeIP,4'string'bigendian'srcIP," +"4'int'smallendian'srcPort,1'int'smallendian'srcIDlen,-1'string'bigendian'srcID," + "6'string'bigendian'destMAC,4'string'bigendian'destIP,4'int'smallendian'destPort," + "1'byte'smallendian'languageFlag,2'int'smallendian'contentlen,-1'string'bigendian'msgcontent";
这是一个java对python的struct.unpack的模拟。当然,经过改良,我们可以相信其可以具有更好的可读性。类似如下的形式:
String rule = "4!i1!i1!i…"
至少在基本类型的处理上,我认为此形式可以很好的表达CS两端通信的接口。视此rule,则通信规则已了然于心。
需要注意的地方在与‘变长’和‘复杂类型’。
当传递一个变长字符串。可能需要如下的结构:
Len+Body
这样让我们的rule写起来就会费事。又如传递一个未知size的List,也是一个难处理的任务。
下面有一个简单的例子。Server端用python接收数据,以unpack方式接收数据,并以MysqlDB插入Mysql数据库;Client端用Erlang发送数据,以list_to_binary发送数据。
'''
Created on 2009-3-18
@author: Administrator
'''
from twisted.internet import protocol, reactor
from time import ctime
import struct
import MySQLdb
PORT = 9090
class TSServProtocol(protocol.Protocol):
'''Data1 = [<<1:32/little, 1, 10>>, "srcmac", <<1234:32/little, 1, 2, 3, 4, 1, 2, 3, 4, 1234:32/little, 5>>,
"abcde", "dstmac", <<1, 2, 3, 4, 1234:32/little, 1, 4:16/little>>, "love"],'''
'''icc6si4s4sic5s6s4sich4s'''
receiveData = "";
fieldname = ['time', 'protocoltype', 'msgtype',
'srcmac', 'nodeid', 'nodeip', 'srcip', 'srcport', 'srcid_len', 'srcid',
'dstmac', 'dstip', 'dstport', 'language_flag', 'msg_len1', 'msg_len2', 'msftext']
def connectionMade(self):
clnt = self.clnt = self.transport.getPeer().host
print '...connected from:', clnt
def dataReceived(self, data):
#self.transport.write('[%s] %s'% (ctime(),data))
#self.transport.write('[%s] %s' % (ctime(), 'x'))
self.receiveData = self.receiveData + data
#receiveData = receiveData + data
#print self.receiveData
length = 0
head = 0
head_len = 4
body = 0
while len(self.receiveData) >= head_len:
head = self.receiveData[0:head_len]
length = struct.unpack('i', head)[0]
print 'length', length
if len(self.receiveData) >= length & length != 0:
print 'head', head
self.onepckgdt = self.receiveData[0:length]
self.receiveData = self.receiveData[length:]
###
i1 = struct.unpack("c", self.onepckgdt[32])[0]
print 'i1', ord(i1)
tmp1 = self.onepckgdt[32 + 1 + ord(i1) + 15:32 + 1 + ord(i1) + 15 + 2]
print 'length of tmp1', len(tmp1)
tmp2 = struct.unpack("BB", tmp1)
i2 = tmp2[0] + tmp2[1] * 256
print 'i2', i2
###
self.onepckgdt = self.onepckgdt[head_len:length]
print "!iBB6si4s4siB" + str(ord(i1)) + "s" + "6s4siB" + "BB" + str(i2) + "s"
body1 = struct.unpack("iBB6si4s4siB" + str(ord(i1)) + "s" + "6s4siB" + "BB" + str(i2) + "s", self.onepckgdt)
insrt2MySQL(self.fieldname,body1)
print self.receiveData
print len(self.receiveData)
###
else:
break
#print receiveData
#for data in receiveData:
# print ord(data)
print '==='
def insrt2MySQL(fieldname, fieldvalue):
print "-" * 66
print 'len of fieldname', len(fieldname)
print 'len of fieldvalue', len(fieldvalue)
dict = {}
for i in range(len(fieldvalue)):
print fieldname[i], ":", type(fieldvalue[i]), fieldvalue[i]
dict[fieldname[i]]=fieldvalue[i]
print fieldname[i], ":", type(dict[fieldname[i]]), dict[fieldname[i]]
print
print "insert into msn(time, protocoltype)"
print " values(",dict['time'],",",dict['protocoltype'],")"
print "insert into msn(time, protocoltype)"+" values("+str(dict['time'])+","+str(dict['protocoltype'])+")"
###
db=MySQLdb.connect(host="192.168.0.231",user="root",passwd="admin",db="test",charset="utf8")
cursor=db.cursor()
#sql statement
#cursor.execute("insert into person(name, age, gender) values('wangzhi','25','male')")
sql = "insert into msn(time, protocoltype) values(%s, %s)"
cursor.execute(sql,(dict['time'], dict['protocoltype']))
cursor.execute("select * from msn")
#get the result set
result=cursor.fetchall()
#iterate thtough the result set
for i in result:
print(i)
print
cursor.execute("select LAST_INSERT_ID()")
result = cursor.fetchall()
for i in result:
print(i)
print
cursor.close
pass
factory = protocol.Factory()
factory.protocol = TSServProtocol
print 'waiting for connection...'
reactor.listenTCP(PORT, factory)
reactor.run()
%% Author: Administrator
%% Created: 2009-3-10
%% Description: TODO: Add description to kvs
-module(kvs6).
%%
%% Include files
%%
%%
%% Exported Functions
%%
-export([start/0, st/2]).
-export([start1/0]).
-export([start_/0]).
-export([m/2, q/2, y/2]).
%%
%% API Functions
%%
%% Return the Socket Handler.
start() ->
{ok, Socket} = gen_tcp:connect("192.168.0.93", 9090, [binary, {packet, 0}]),
Socket.
start1() ->
{ok, Socket} = gen_tcp:connect("localhost", 9090, [binary, {packet, 0}]),
Socket.
start_() ->
{ok, Socket} = gen_tcp:connect("localhost", 9090, [binary, {packet, 0}]),
Data1 = [<<2:32, 1, 10>>, "srcmac", <<1234:32/little, 1, 2, 3, 4, 1, 2, 3, 4, 1234:32/little, 5>>, "abcde", "dstmac", <<1, 2, 3, 4, 1234:32/little, 1, 4:16/little>>, "hate"],
sdpckg(Socket, Data1, 1).
st(Socket, Data) ->
_data = list_to_binary(Data),
gen_tcp:send(Socket, _data).
m(Socket, Repeate) ->
Data1 = [<<Repeate:32/little, 1, 10>>, "srcmac", <<1234:32/little, 1, 2, 3, 4, 1, 2, 3, 4, 1234:32/little, 5>>, "abcde", "dstmac", <<1, 2, 3, 4, 1234:32/little, 1, 4:16/little>>, "love"],
sdpckg(Socket, Data1, Repeate).
q(Socket, Repeate) ->
Data1 = [<<1:32/little, 2, 34, 1234:32/little, 1, 2, 3, 4>>, "srcmac", <<1, 2, 3, 4, 12345678:32/little>>],
sdpckg(Socket, Data1, Repeate).
y(Socket, Repeate) ->
Data1 = [<<1:32/little, 3, 1234:32/little, 1, 2, 3, 4>>, "srcmac", <<1, 2, 3, 4, 1234:32/little>>, "dstmac", <<1, 2, 3, 4, 1234:32/little, 1, 5>>, "abcde", <<5>>, "fghij",<<4:16/little>>, "love"],
sdpckg(Socket, Data1, Repeate).
sdpckg(Socket, Data1, Repeate) ->
_data = list_to_binary(Data1),
Head = [<<(size(_data)+4):32/little>>],
_head = list_to_binary(Head),
L = lib_misc:for(1, Repeate, fun(I)->_data end),
mylists:map(fun(X)->gen_tcp:send(Socket, _head), gen_tcp:send(Socket, X) end, L).
很明显Python本身的基础unpack在解决一些复杂问题时候力有不逮。struct模块允许创建一个等效于C结构的字符串,可以读写那些非Python程序生成的二进制文件。或者用于不同程序的网络通信。
在其他语言中,我们完全可以为变长类型和复杂类型定义新的标示,如“2X”,或者“nList”等等。
总而言之,JSON系列和byte[]系列的处理,进过一些考虑和工具类的构建,应该为各自找到较合适的应用场景。
- JSON和byte__.rar (2.1 KB)
- 下载次数: 24
发表评论
-
JAVA调用VB6.0爬取网页
2019-09-23 12:18 389用VB6.0解决网页获取问题,在一些情况下可以省点事。 ... -
java正则判断字符串是否包含中文
2012-08-16 21:02 2920java正则判断字符串是否包含中文 ... -
字符集编码的识别(zz)
2012-08-15 12:20 5572字符集编码的识别(zz) 读取文本文件或者接收字节流 ... -
Unicode字碼分佈表(zz)
2012-08-15 11:54 1238Unicode字碼分佈表(zz) 0000-0 ... -
Unicode语系字碼分佈表(zz)
2012-08-15 11:51 1312Unicode语系字碼分佈表(zz) 英文 0041 ... -
各種語系的unicode對應以及local編碼方式(zz)
2012-08-15 11:48 2694各種語系的unicode對應以及local編碼方式(zz) ... -
WEB开发性能随笔zz
2010-03-26 21:38 1076WEB开发性能随笔 目标: 开发高性能,可扩展的WE ... -
关键词扩展词表
2010-02-02 11:10 2077关键词扩展词表 根据目前网络语言的特点,一些敏感词会以诸如拼 ... -
史上最全最强的正则表达式
2010-01-05 16:31 1783史上最全最强的正则表达式 评注:匹配中文还真是个头疼的 ... -
unicode中文范围
2010-01-05 16:27 2100unicode中文范围 在网上搜索了一下汉字的Unic ... -
网络陷阱的预防
2009-10-17 22:55 1168网络陷阱的预防 ... -
MapReduce & Hadoop
2009-09-23 22:56 2154MapReduce & Hadoop ... -
Google通配符的意义与用法
2009-09-16 10:03 1982Google通配符的意义与用法 通配符(wil ... -
求浮点运算代价
2009-09-13 21:20 1223在很多芯片上浮点数运 ... -
搜索引擎也开源
2009-08-23 18:11 3230搜索引擎也开源 From:http://www2.ccw.c ...
相关推荐
主要介绍了基于JSON实现传输byte数组过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Delphi10 JSon 基本读写例子,Delphi11 JSON 读写Demo
Byte[] data = client.DownloadData(sUrl); string str = Encoding.UTF8.GetString(data); MyClass obj= JsonConvert.DeserializeObject(str); this.message = obj.message; this.nu = obj.nu; this.ischeck =...
只要对json和序列化和反序列化总结,以及代码的案例:我们很多时候会涉及到几个序列化对象的使用:DataContractJsonSerializer,JavaScriptSerializer 和 Json.NET。
Delphi XE + IdHTTPServer + utf8转换 + json解析(源码+测试可用)
游戏开发中客户端与服务器... byte[] data = StreamTool.readInputStream(inStream); String json = new String(data); //构建Json数组对象 JSONArray array = new JSONArray(json); //从Json数组对象读取数据
jsonParsed, err := gabs.ParseJSON([]byte(`{ "outter":{ "inner":{ "value1":10, "value2":22 }, "alsoInner":{ "value1":20 } } }`)) var value float64 var ok bool ...
安装gojson go get github.com/swaraj1802/GoJSON/gojson用法导入import“ github.com/swaraj1802/GoJSON/gojson”示例代码jsonParsed,err:= gojson.ParseJSON([] byte(`{“ glossary”:{“ title“:”示例...
DSL-JSON库最快的JVM... 与最快的二进制JVM编解码器相当适用于字节级别-反序列化可以适用于byte []或InputStream。 它不需要中间的char表示可扩展性-支持自定义类型,自定义分析器,注释处理器扩展... 流支持-大型JSO
.toPath, Array(0x81, 0xa3, 0x61, 0x62, 0x63, 0x92, 0xc2, 0x2a).map(_.toByte))' $ curl -X POST -d @msgpack_data1 https://msgpack-json.appspot.com/msgpack2json {"abc":[false,42]} json字符串=> msgpack二...
其余部分与 this 之间的区别在于,它不是使用补丁来创建 JSON []byte 数组,而是将补丁应用于 go 类型。 该库公开了两个 API Apply和Diff (待完成)。 func Apply(data []byte, x interface{}) errorfunc Diff(a, ...
今天小编就为大家分享一篇关于MongoDB使用mongoexport和mongoimport命令,批量导出和导入JSON数据到同一张表的实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
byte[] byts = new byte[Request.InputStream.Length]; Request.InputStream.Read(byts,0,byts.Length); string req = System.Text.Encoding.Default.GetString(byts); req = Server.UrlDecode(req);
Key key = new SecretKeySpec ( new byte [ 16 ], " AES " ); // this is a null key, obviously don't do that, use a CSPRNG or PBKDF or scrypt for your key JsonEncrypter eCrypter = new JsonEncrypter (key,...
当某个struct存在某个字段为string或者[]byte类型但是实际上保存的内容是json格式的数据时,对其进行json序列化,比如 type Message struct { From string `json:from` To string `json:to` Data string `json:...
jsonschema golang实现,可让您编写可验证其他JSON的JSON。 拉德 包装特点 将架构编码回JSON 提供您自己的自定义验证器 使用标准Go习语 ... var schemaData = [] byte ( `{ "$id": "https://qri
List<TrainingImplement> ,转为json后,客户端和服务端如何操作 1、json对象与C#泛型相互转换代码 代码如下: //将json数据转换为泛型 public static T ConvertByteDataToObject(string byteData) { T obj; using ...
NET,.NET Core,Unity和Xamarin)的绝对最快和零分配的JSON序列化程序,该序列化程序直接对UTF8二进制文件进行写入/读取,从而提高了性能。 而且,我采用与我开发的最快的二进制序列化程序相同的体系结构。 此基准...
该项目支持使用使用进行流式 JSON 解析和解码, 是一个用于将 JSON 编码和解码为 Scala 类型的 Scala 库。 解析 Circe-fs2 提供不同的管道来解析您的 JSON 流,具体取决于您的流是否为: \n 分隔的 JSON 值流或值...