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

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

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

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

 通信关键:

         C#和java用Socket通信,发送数据和接收数据可以统一采用UTF-8编码,经过测试,使用UTF-8编码可以成功传递对象。

         对于Socket技术,发送数据之前,一般将字符串转换成字节数组,然后发送字节数组;接收数据时,收到的也是字节数组,很多时候需要转换成字符串后使用。

         下边是一些常用的转换。

         C#语言字符串转换成UTF-8字节数组:

         ");

         C#语言UTF-8字节数组转换成字符串:

         // receiveData是字节数组,receiveN是字节数组length

         , 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 = , 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 = ;

            ResMessage resMsg = newTcpConnection.SendReceiveObject<User, ResMessage>(, 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.cnblogs.com/leonwang/archive/2011/08/12/2136497.html

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

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

NetworkComms V3 使用Json序列化器进行网络通信的更多相关文章

  1. ASP.NET MVC4 json序列化器

    ASP.NET MVC4中调用WEB API的四个方法 2012年06月07日00:05 it168网站原创 作者:廖煜嵘 编辑:景保玉 我要评论(0) [IT168技术]当今的软件开发中,设计软件的 ...

  2. Newtonsoft.Json 序列化器的重写

    public class TestConverter : JsonConverter { public override void WriteJson(JsonWriter writer, objec ...

  3. json序列化时datetime的处理方法

    .net自带的json序列化器,JavaScriptSerializer和DataContractJsonSerializer,都是序列化成微软的datetime json格式,e.g. " ...

  4. Xml、Json序列化

    Xml序列化: public class XmlHelper { private static string XmlPath = Path.Combine(AppDomain.CurrentDomai ...

  5. NetworkComms V3 序列化器之Protobuf.net和 JSONSerializer

    NetworkComms v3版本中,默认使用的是protobuf.net序列化器. 即当您没有指定序列化的时候,系统自动使用默认的protobuf.net序列化器. 当然我们也可以自己指定序列化器 ...

  6. IOSerialize,xml和json,soap序列化器,二进制序列化器,XML序列化器,文件 检查、新增、复制、移动、删除

    1 文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/读取配置文件3 三种序列化器4 xml和json1.文件夹/文件 检查.新增.复制.移动.删除,2 文件读写,记录文本日志/ ...

  7. 跟着ALEX 学python day4集合 装饰器 生成器 迭代器 json序列化

    文档内容学习于 http://www.cnblogs.com/xiaozhiqi/  装饰器 : 定义: 装饰器 本质是函数,功能是装饰其他函数,就是为其他函数添加附加功能. 原则: 1.不能修改被装 ...

  8. SpringBoot 默认json解析器详解和字段序列化自定义

    前言 在我们开发项目API接口的时候,一些没有数据的字段会默认返回NULL,数字类型也会是NULL,这个时候前端希望字符串能够统一返回空字符,数字默认返回0,那我们就需要自定义json序列化处理 Sp ...

  9. ajax发送json格式与文件数据、django自带的序列化器(了解)

    上期内容回顾 聚合查询和分组查询 # 聚合查询 max min sum avg count # 查询关键字:aggregate from django.db.models import Max, Mi ...

随机推荐

  1. 微信小程序开发感受

    研究了大概有一个多星期的小程序了,说一下感受,之后会随时更新,一边学习,一边加上一部分学习代码和心得.我是一个前端厂里的新手,搬砖的时间不是很长,所以到一部分知识的理解浅之又浅,所以只能说自己的理解, ...

  2. 深入理解 '0' "0" '\0' 0 之间的区别

    看来基础还是很重要的,基础不扎实就难以学好c语言,就别说写出高质量的c语言代码了.今天,我就被这个问题折磨的不行了,哈哈,不过现在终于明白了‘\0’ ,‘0’, “0” 之间的区别了.困惑和快乐与你分 ...

  3. MySQL数据表操作

    创建数据表 打开数据库 USE 数据库名称 mysql> USE D1; Database changed 使用 USE D1:表示打开数据库D1,我们可以通过SELECT DATABASE() ...

  4. XML文件解析

    eclipse新建源文件的文件夹,编译后和src文件夹中放在一起 源文件 源文件的配置文件 测试文件 源文件的测试文件 一般用maven进行管理的时候就是这样 如果是小项目的话可能就src和resou ...

  5. windows平台解决quick3.5final + sublimeText3 模拟器找不到的问题

    下载了quick3.5 准备在sublime上进行开发,结果发现quick3.5中的player模拟器不见了,原来模拟器移到了quick引擎主目录下的 /tools/simulator/runtime ...

  6. 设置hr标签的粗细

    hr {border:0px;border-bottom:1px solid #5c5c3d;}

  7. OC中字符串的提取与替换-四种不同方法实现

    /* 1.将可变字符串 @"When I was young, I loved a girl in neighbor class."中,从 young提取到girl.替换 成@&q ...

  8. React 快速入门小记

    大约半个月前,我一直在思考一个问题,Angular.React 和 Vue,究竟该学什么? 听取了几位前辈的意见,也综合考虑了各方面的原因,最终选择了 React,希望我"没有选错" ...

  9. [Android] keystore生成

    keytool -genkey -alias agg_keystore -keyalg RSA -validity 20000 -keystore agg.keystore keytool -expo ...

  10. Knockout 官网翻译

    Knockout 新版应用开发教程之创建view models与监控属性 章节导航 最近抽出点时间研究MVVM,包括司徒正美的avalon,google的angular,以及Knockout,博客园T ...