JAVA服务器与C#客户端的通信技术调研
JAVA服务器与C#客户端的通信技术调研
研究背景及目的:
ARPG项目的需求:需要将现有的服务器从C++的编写平台换为java语言。
在对需求进行分析的过程中,发现几点需要研究实现的问题
- java与c+语言特性迥异,相比c+ 和c#关系的密切性,java需要对c#风格的一些数据结构和编码格式进行兼容;
- c#拥有的无符号数据类型如 ushort unint java并不存在,需要对数据类型进行转换;
- 根据开发需要 客户端现有的通信协议不能更改,所以在java中进行各类型的兼容操作
- 在项目中底层通信报文的类 是由名叫PROTOGEN的现有工程进行生成,生成方式是以生成字符串文本类的方式,原工程已经可以同时生成c#及c++的类(.cs及.h文件),但并没有生成迁移后的服务器java的相关代码和类的功能。故需要二次开发。
工作任务:
综上所述,工作任务有两点:
- 重构java的 数据流输入和输出类,使其兼容c#客户端传输过来的 二进制数据结构;(以下简称PJIO)
- 对PROTOGEN进行二次开发,使其能够生成java的 底层协议类(.java文件),并不破坏其现有生成其他语言的类的功能;(以下简称PGPLUS)
- 进行测试和验证,确保前两项工作任务的有效和后续开发工作的顺利开展。
工作开展中遇到的技术问题和技术细节:
PJIO:
- 在测试和开发过程中,通过查阅资料,发现c#和C++的数据存储格式为小端类型而java是大端类型(即字节序问题)
在几乎所有的机器上,多字节对象都被存储为连续的字节序列。例如在C语言中,一个类型为int的变量x地址为0x100,那么其对应地址表达式&x的值为0x100。且x的四个字节将被存储在存储器的0x100, 0x101, 0x102, 0x103位置。[1]
而存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效位在最高有效位的前面,则称小端序;反之则称大端序。在网络应用中,字节序是一个必须被考虑的因素,因为不同机器类型可能采用不同标准的字节序,所以均按照网络标准转化。
例如假设上述变量x类型为int,位于地址0x100处,它的十六进制为0x01234567,地址范围为0x100~0x103字节,其内部排列顺序依赖于机器的类型。大端法从首位开始将是:0x100: 01, 0x101: 23,..。而小端法将是:0x100: 67, 0x101: 45,..。
大端序
大端序(英:big-endian)或称大尾序。
数据以8bit为单位:
地址增长方向 →
...
0x0A
0x0B
0x0C
0x0D
...
示例中,最高位字节是0x0A 存储在最低的内存地址处。下一个字节0x0B存在后面的地址处。正类似于十六进制字节从左到右的阅读顺序。
数据以16bit为单位:
地址增长方向 →
...
0x0A0B
0x0C0D
...
最高的16bit单元0x0A0B存储在低位。
小端序
小端序(英:little-endian)或称小尾序。
数据以8bit为单位:
地址增长方向 →
...
0x0D
0x0C
0x0B
0x0A
...
最低位字节是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
数据以16bit为单位:
地址增长方向 →
...
0x0C0D
0x0A0B
...
最低的16bit单元0x0D0C存储在低位。
- 更改地址的增长方向:
当更改地址的增长方向,使之由右至左时,表格更具有可阅读性。
← 地址增长方向 |
|||||
... |
0x0A |
0x0B |
0x0C |
0x0D |
... |
最低有效位(LSB)是0x0D 存储在最低的内存地址处。后面字节依次存在后面的地址处。
← 地址增长方向 |
||||||
... |
0x0A0B |
0x0C0D |
... |
最低的16bit单元0x0C0D存储在低位。
本部分具体内容详见https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F
所以在PJIO中对报文对象进行传输之前和接收报文之后 都会对报文的BYTE数组进行反转,以兼容c#的字节序,这也是对java的输入输出流进行重构的主要目的;
- java并不包含无字符数 所以全由对应宽度(字节长度)的数进行代替;
例如 ushort>>short;
PGPLUS:
1,这个项目主要是遇到一个问题,java 不能在同一个文件里 生成多个公共类
还有关于驼峰式命名法的 语言规范与C#不同。C#函数首字母大写,比如a.ReadInt16();
Java中的方法(函数)首字母要小写即 a.readInt16();
- 关于枚举,c#中枚举可以赋予初始值例如:
而java 则不允许,如果非要实现:结果很不令人满意
所以枚举统一转换成仅含有常量的公共类
如上图
暂时未解决的问题:
java在读取c#传输过来的报文的时候 后面会有两个字节的0;
JAVA服务器与C#客户端的通信技术调研的更多相关文章
- Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端
Java和Android Http连接程序:使用java.net.URL 下载服务器图片到客户端 本博客前面博文中利用org.apache.http包中API进行Android客户端HTTP连接的例子 ...
- 在C#客户端用HTTP上传文件到Java服务器
在C#客户端用HTTP上传文件到Java服务器 来源:http://www.cnblogs.com/AndyDai/p/5135294.html 最近在做C / S 开发,需要在C#客户端上传文件到 ...
- Java Socket实现HTTP客户端来理解Session和Cookie的区别和联系
HTTP协议本身是无状态的,即使是同一台电脑同一个浏览器打开同一个页面两次,服务器不知道这两次请求是同一个客户端发送过来的,两次请求是完全独立的.例如,第一次请求时已经登录了,第二次再请求服务器会“忘 ...
- SLG手游Java服务器的设计与开发——架构分析
微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...
- Java泛型与Restlet客户端
写一个与restlet服务器通信的客户端类,用于测试通信是否成功,并且进行交互.为了方便其他人使用,于是,写一个通用的方法封装起来,可是中途却放生了一些问题. 按照正常写法,顺序走下来是这样的: pu ...
- Java实验五(客户端)
一. 实验内容 1. 运行教材上TCP代码,结对进行,一人服务器,一人客户端: 2. 利用加解密代码包,编译运行代码,客户端加密,服务器解密: 3. 客户端加密明文后将密文通过 ...
- SLG手游Java服务器的设计与开发——数据管理
文章版权归腾讯GAD所有,禁止匿名转载:禁止商业使用:禁止个人使用. 一.前言 上文介绍了我们的SLG手游的服务器架构设计以及网络通信部分,本文介绍数据管理部分,在数据存储方面,我选择了Mysql.M ...
- Cloudera Manager安装之时间服务器和时间客户端(Ubuntu14.04)(二)
第二步: Cloudera Manager安装之时间服务器和时间客户端(二) 找一台机器作为时间服务器 我这里,放到ubuntucmbigdata1这台机器! 注意,之前是已经做了集群时间同步了. 在 ...
- java集成jpush实现客户端推送
代码地址如下:http://www.demodashi.com/demo/13700.html 前言 java 集成jpush 实现客户端推送 一.准备工作 开发环境: jdk1.6 Eclipse ...
随机推荐
- python引入模块时import与from ... import的区别(转)
import datetime是引入整个datetime包,如果使用datetime包中的datetime类,需要加上模块名的限定. 1 import datetime 2 3 print datet ...
- 导出 java.io.IOException: 权限不够
项目原先都是开发使用root账号登陆服务器,人肉部署. 今天改成了自动部署,部署之后发现导出用不了了,查看服务器日志提示: 查看项目启动用户是app,推断是app用户的权限不够,导致导出无法在服务器创 ...
- 大型运输行业实战_day06_1_购票功能简单实现
1.添加购票按钮 对应的html代码 因为列表是js函数动态填充的,故添加按钮应该在js函数中,完整代码如下: /** * 注意在调用该函数时必须输入参数 * 查询+ 分页 * */ function ...
- SQL查询效率where语句条件
有索引的列优先,都有索引的看查询出来的数据量,少的优先 in ,not in,<>,is null,is not null 等由于不会走索引,尽量不要使用. WHERE子句后面的条件顺序对 ...
- ASP.NET Forms身份认证详解
ASP.NET身份认证基础 在开始今天的内容之前,我想有二个最基础的问题首先要明确: 1. 如何判断当前请求是一个已登录用户发起的? 2. 如何获取当前登录用户的登录名? 在标准的ASP.NET身份认 ...
- python之ftp作业【还未完成】
作业要求 0.实现用户登陆 1.实现上传和下载 3.每个用户都有自己的家目录,且只可以访问自己的家目录 4.对用户进行磁盘配额,每个用户的空间不同,超过配额不允许下载和上传 5.允许用户在指定的家目录 ...
- iis 应用程序连接池 在计算机“.”上没有找到WAS服务
重新打开控制面板----打开或关闭windows功能,全部勾选internet information services 可承载的web核心. internet信息服务.microsoft.net f ...
- C# .net MD5加密函数
using System.Web.Security; string password =FormsAuthentication.HashPasswordForStoringInConfigFile(t ...
- C# 发送电子邮件(含附件)用到的类 system.web.mail
主要是用到了System.Web.Mail命名空间,用到了此空间的三个类,分别是: ●MailMessage类,用于构造电子邮件●MailAttachment类,用于构造电子邮件附件●SmtpMail ...
- 实现Quartz的动态增删改查
1. Maven依赖 <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId> ...