首页 > 学院 > 开发设计 > 正文

NetworkComms V3 使用Json序列化器进行网络通信

2019-11-17 02:31:51
字体:
来源:转载
供稿:网友

NetworkComms V3 使用Json序列化器进行网络通信

刚才在网上闲逛,偶然看到一篇文章

C#(服务器)与java(客户端)通过Socket传递对象

网址是:http://www.VEVb.com/iyangyuan/archive/2012/12/23/2829712.html#3140522

其中提到了C#与java如通过传递对象通信的问题 摘引如下:

 通信关键:          C#和java用Socket通信,发送数据和接收数据可以统一采用UTF-8编码,经过测试,使用UTF-8编码可以成功传递对象。         对于Socket技术,发送数据之前,一般将字符串转换成字节数组,然后发送字节数组;接收数据时,收到的也是字节数组,很多时候需要转换成字符串后使用。         下边是一些常用的转换。          C#语言字符串转换成UTF-8字节数组:          byte[] b = Encoding.UTF8.GetBytes("123");          C#语言UTF-8字节数组转换成字符串:          // receiveData是字节数组,receiveN是字节数组length         string removeMsg = Encoding.UTF8.GetString(receiveData, 0, receiveN);          Java语言字符串转换成UTF-8字节数组:          /* strContent 是要转换的字符串*/         byte[] bs = strContent.getBytes("UTF-8");          Java语言UTF-8字节数组转换成字符串:          /* charArray 是UTF-8格式的字节数组,一般从IO流中获取的时候就指定为UTF-8,read_rst 是字节数组length*/         String resultStr = new String(charArray, 0, read_rst);             序列化关键:          大家都知道,对象是保存在内存中的,具体点说是内存中的堆区。因此当我们尝试保存、传递对象时,必须先把对象序列化,变成字符表示,把无形变成有形。         由于是跨语言的交互,我们即不能用Java特有的序列化方式,也不能用C#特有的序列化方式,必须找一个通用的序列化格式才能交互。显然,Json是不二的选择。         由此可知,我们需要Json完成以下功能:          经过测试,用如下方法可实现上述转换。          C#端可以用开源项目JSON.NET,下载后根据自己的.NET版本,选择相应的Newtonsoft.Json.dll,引用后再添加:using Newtonsoft.Json;using Newtonsoft.Json.Converters;即可使用。          C#用Json序列化对象方法:          //te是要序列化的对象;obj是对象序列化后的字符串         string obj = JsonConvert.SerializeObject(te);          C#用Json反序列化对象方法:          //TestEntity是目标类型;obj是经过Json序列化的对象,字符串形式         TestEntity te = JsonConvert.DeserializeObject<TestEntity>(obj);          Java端可以用开源项目google-gson,下载后是一个jar格式的包,直接在项目中导入这个包,并添加引用:import com.google.gson.Gson;即可使用。          Java用Json序列化对象方法:          Gson gson = new Gson();         /*te是需要序列化的对象*/         String s = gson.toJson(te);          Java用Json反序列化对象方法:          Gson gson = new Gson();         /*s是经过Json序列化的对象,字符串类型;TestEntity是目标类型*/         /*注意:使用fromJson方法反序列化一个对象时,该对象的类型必须显示的声明一个不带参数的构造方法*/         TestEntity te = gson.fromJson(s,TestEntity.class);
摘引

想起来 NetworkComms V3中自带了JSONSerializer 序列化器

NetworkComms V3中的JsonSerializer是对Newtonsoft.Json的包装,使其更加方便的在networkComms V3框架中使用

先来做一个c#客户端与c#服务器端通过json序列化方式通信的示例.

于是做了一个测试,新建工程文件如下:

MessageContract 中的 User类用于传递信息

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MessageContract{    public class User    {        public User()        { }        public string Name { get; set; }        public int Age { get; set; }            }}

ResMessag类,用于存储返回的信息

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace MessageContract{   public  class ResMessage    {       public ResMessage() { }       public string Message { get; set; }    }}

客户端代码:

 SendReceiveOptions sro = new SendReceiveOptions(DPSManager.GetDataSerializer<JSONSerializer>(), null, null);
 MessageContract.User theUser = new MessageContract.User();            theUser.Name = "名山大川网络工作室 ";            theUser.Age = 30;            ResMessage resMsg = newTcpConnection.SendReceiveObject<User, ResMessage>("ReqUser", "ResUser", 5000, theUser, sro, sro);            MessageBox.Show("从服务器返回的信息是:"+resMsg.Message);

服务器端代码:

 SendReceiveOptions sro = new SendReceiveOptions(DPSManager.GetDataSerializer<JSONSerializer>(), null, null);
  NetworkComms.AppendGlobalIncomingPacketHandler<User>("ReqUser", IncomingUserHandle);
   PRivate void IncomingUserHandle(PacketHeader header, Connection connection, User msg)        {            try            {                ResMessage resMessage = new ResMessage();                resMessage.Message = msg.Name + "欢迎您";                connection.SendObject("ResUser", resMessage, sro);            }            catch (Exception ex)            {                LogTools.LogException(ex, "IncomingMsgHandle");            }        }

示例运行成功,画面如下:

Java好多年不用了,改天试试用java编写个安卓的客户端看看能不能与c#编写的服务器通信,如果能这样就太好了。

如果有写的不对的地方,万望您指出来,我好及时改正,不然有的网友又要说浪费他的时间了:)

www.networkComms.cn编辑

参考:

http://www.VEVb.com/leonwang/archive/2011/08/12/2136497.html

http://www.VEVb.com/wgp13x/p/0effafd9f5283cbf36e62b4fb5e94c81.html

http://www.VEVb.com/zhanghaomars/p/3557644.html


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表