unity和netty4.1通讯问题

rkily 发布于 2017/07/04 18:26
阅读 308
收藏 0

【深度】AI、5G时代下,算力网络与内生安全最全解析!>>>

unity 客户端 

public void WriteString(string v) {
            byte[] bytes = Encoding.UTF8.GetBytes(v);
            Debug.Log("bytes.Length" + bytes.Length);
            Debug.Log(BitConverter.ToString(bytes));
            //byte[] bs = BitConverter.GetBytes(bytes.Length);
            // Array.Reverse(bs);
            for (int i = 0; i < 10; i++)
            {
                writer.Write(bytes.Length);
                writer.Write(bytes);
            }

        }

netty服务器端

public class MessageDecoder extends ByteToMessageDecoder {

    public static final Logger _logger = Logger.getLogger(MessageDecoder.class);
    
    private static final Charset charset = Charset.forName("UTF-8");
    
    private static int i =0;
    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf in,
            List<Object> list) throws Exception {
        if(in.readableBytes() < 6) {
            return;
        }
        _logger.info(in.readableBytes());
        byte[] b = new byte[4];
        b[3] = in.readByte();
        b[2] = in.readByte();
        b[1] = in.readByte();
        b[0] = in.readByte();
        _logger.info(CommonUtils.byteArrayToInt(b));
        in.resetReaderIndex();

    //第一次多了两个byte
        _logger.info(in.readByte());
        _logger.info(in.readByte());
        b = new byte[4];
        b[3] = in.readByte();
        b[2] = in.readByte();
        b[1] = in.readByte();
        b[0] = in.readByte();
        
        //获取实际数据长度
        int msgLength = CommonUtils.byteArrayToInt(b);
        _logger.info(msgLength);
        //如果可读数据长度小于包头给的的长度,则重置读取的位置
        if(in.readableBytes() >= msgLength) {
            //读取数据
            byte[] data = new byte[msgLength];
            in.readBytes(data);
            //byte转换成String
            ByteBuffer bb = ByteBuffer.wrap(data);
            StringBuffer buffer = new StringBuffer();
            buffer.append(charset.decode(bb));
            //_logger.info("msg:" + buffer.toString());
            list.add(buffer.toString());
            i++;
            in.discardReadBytes();
            _logger.info("接受" + i + "次消息");
        } else {
            in.resetReaderIndex();
        }
    }

 

连续发送数据包,解析的时候,第一次,前面多了两个byte,后面不会,导致,第一次可以正常解析,后面判断数据包长度都无法正确获取,这个是什么问题呢

加载中
0
w
wxsl

unity应该是类似C#,C#和java通信是需要转换下的,具体的我也没怎么了解,你试下http://www.tuicool.com/articles/IzUbqu吧

0
rkily
rkily

问题已解决

返回顶部
顶部