一、游戏服务器开发中,与服务器通讯的过程中,TCP长连接传输的数据包肯定会存在粘包(前一个操作数据包和后一个数据包放在一起),断包(一个操作数据包分成若干段传输)。怎么处理这种问题呢?
解决方案:每个数据包添加包首部,首部中应该至少包含数据包的长度,通过先将数据包放入缓存(Buffer),再从Buffer中读取一个完整的操作数据包来处理。一个数据包传过来后,先放入Buffer中,数据包不完整则break等待下一个数据包的到来。
另外,缓存Buffer可放在用户session对象中,而Buffer初始化时ByteBuffer.allocateDirect(6000)是DirectByteBuffer对象。该对象有一个头int来标示有效数据长度,可通过buffer.getInt();来得到(每次读取,指针都会后移一个相应数据位置)。
二、前端flash和后端java服务端通信,使用amf协议:
比如,关于AMF3封装的类就存在BlazeDS的flex.messaging.io.amf包里面,其中几个比较重要的类有(Amf3Output、Amf3Input等,如果想兼容flash8之前版本请使用Amf0Output和Amf0Input)。如果各位想用AMF3格式又不想使用Flex的remoting功能,可以手动封装AMF格式。
三、关闭服务器要做的事情:
1、首先,把调度线程池停掉,不在执行定时检查用户连接等等定时任务。
2、接受连接的Selector的装饰者类,wakeup();和close();调用关掉。接受客户端数据的Selector和写回客户端的Selector同理。其中,写回客户端数据线程跳出循环,并调用中断即可(如果线程还处于wait等状态直接跳出)。
3、关闭连接,删除配置等。
四、定时任务,来执行每天每周或每月的清理、备份等定时任务。
使用l.inux的crontab: