public class Packet这个数据包对象是C#里面定义的,客户端当然无法解析。我的意思是用字符串来表示,如json格式的字符串,如:
"packet{MaxLength:32000;InvalidLength:-1;NeedCompressMinLength:100;NoCryptHeaderLength:4...}"
JAVA客户端系统拿到这个字符串后,通过字符串处理,把它转换成JAVA对象。
首先谢谢你的回答,我也想到用数据流来操作了,但是服务器端现在写好的好像没有数据流相关操作,让我用数据包的方式跟服务器通信。服务器数据包代码如下:
/// <summary>
/// 消息包
/// 内存布局
/// {
/// short PacketFlag;//特殊的值
/// short PacketLength;//消息包的大小,消息不能大于32k
/// int PacketID;//消息包类型id;从这以后的数据可以加密
/// int SerialNumber;//消息包序列号,网络连接每发一个消息包,这个值+1
/// int DispatcherID;//发送者的id
/// //所以消息头的大小是2+2+4+4+4 = 16
/// }
/// </summary>
public class Packet
{
public const short MaxLength = 32000;//32k
public const short InvalidLength = -1;
public const short NeedCompressMinLength = 100;
public const short NoCryptHeaderLength = 4; // 2+2
//消息包标志
public PacketFlag PacketFlag = PacketFlag.Normal;
public int PacketID;
/// <summary>
/// 消息序列号
/// </summary>
public int SerialNumber;
public int DispatcherID;//if id <0 ,is -serverid
protected PacketWriter m_writer;
public Packet(int packetID)
:this(packetID,0)
{
}
public Packet(int packetID,int dispatcherid)
{
PacketID = packetID;
DispatcherID = dispatcherid;
m_writer = new PacketWriter();/*PacketWriter.CreateInstance()*/;
}
private byte[] m_databuffer; //已经有的数据的缓冲
private int m_datalength; //已经有的数据的大小
/// <summary>
/// 消息总长度
/// </summary>
public int Length
{
get{
if (m_databuffer == null)
return Packet.HeaderSize + m_writer.Length;
else
return m_datalength + m_writer.Length;
}
set{
if (m_databuffer == null)
return;
m_datalength = value;
}
}
服务端数据报结构如下:
struct PacketHeader
{
/// 标志位
short PacketFlag;
//Packet Length
/// 消息包长度(消息包头)
short Length;
//Packet ID
union{
/// 消息ID
int PacketID;//为了方便和别的程序通讯,消息id还是采用枚举定义,在编译期确定
/// 类型(0~9系统预留)
int MsgType;
};
//CheckSum
/// 序列号
int SerialNumber;
//Client or DispatcherID (special use)
union{
/// DispatcherID (special use)
int DispatcherID;
struct {
short FrontEndID;
short ClientID;//On FrontEnd
};
};