java 客户端向服务端发送数据包_已知服务端数据包格式,客户端怎样用Java实现向服务器端(C#写的)接收和发送数据包(其他同理)...

///

/// 消息包

/// 内存布局

/// {

/// short PacketFlag;//特殊的值

/// short PacketLength;//消息包的大小,消息不能大于32k

/// int PacketID;//消息包类型id;从这以后的数据可以加密

/// int SerialNumber;//消息包序列号,网络连接每发一个消息包,这个值+1

/// int DispatcherID;//发送者的id

/所以消息头的大小是2+2+4+4+4 = 16

/// }

///

public classPacket

{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 intPacketID;///

/// 消息序列号

///

public intSerialNumber;public int DispatcherID;//if id <0 ,is -serverid

protectedPacketWriter m_writer;public Packet(intpacketID)

:this(packetID,0)

{

}public Packet(int packetID,intdispatcherid)

{

PacketID=packetID;

DispatcherID=dispatcherid;

m_writer= new PacketWriter();/*PacketWriter.CreateInstance()*/;

}private byte[] m_databuffer; //已经有的数据的缓冲

private int m_datalength; //已经有的数据的大小

///

/// 消息总长度

///

public intLength

{

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;

}

}

internalbyte[] DataBuffer{

get{returnm_databuffer;

}

set{

m_databuffer=value;if (m_databuffer != null)

m_datalength=m_databuffer.Length;

}

}publicPacketWriter Writer{

get{returnm_writer;

}

}

internal virtualbyte[] ToArray()

{short packet_length = (short)this.Length;

bool needcreatebuffer= false;if (DataBuffer == null || m_writer.Length > 0)

needcreatebuffer= true;if(needcreatebuffer)

{byte[] newbuffer = new byte[packet_length];if (m_databuffer != null)

{

Buffer.BlockCopy(m_databuffer,0, newbuffer, 0, m_datalength);

}

m_databuffer=newbuffer;

}//写消息头//ArrayUtility.SetShort(m_databuffer, (short)PacketFlag, 0);//ArrayUtility.SetShort(m_databuffer, packet_length, 2);//ArrayUtility.SetInt(m_databuffer, this.PacketID, 4);//ArrayUtility.SetInt(m_databuffer, this.SerialNumber, 8);//ArrayUtility.SetInt(m_databuffer, this.DispatcherID, 12);

WriteHead();if (needcreatebuffer && m_writer.Length > 0)

{

System.Buffer.BlockCopy(m_writer.ToArray(),0, m_databuffer,

packet_length-m_writer.Length, m_writer.Length);

m_writer.Length= 0;

}

m_datalength=packet_length;returnm_databuffer;

}protected voidWriteHead()

{//写消息头

ArrayUtility.SetShort(m_databuffer, (short)PacketFlag, 0);

ArrayUtility.SetShort(m_databuffer, (short)this.Length, 2);

ArrayUtility.SetInt(m_databuffer,this.PacketID, 4);

ArrayUtility.SetInt(m_databuffer,this.SerialNumber, 8);

ArrayUtility.SetInt(m_databuffer,this.DispatcherID, 12);

}///

/// 消息头大小 2+2+4+4+4 = 16

///

public static intHeaderSize

{

get

{return 16;

}

}public voidReset()

{

DataBuffer= null;

Writer.Clear();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值