【问题标题】:FlatBuffers BufferHasIdentifier return falseFlatBuffers BufferHasIdentifier 返回 false
【发布时间】:2016-02-19 10:02:46
【问题描述】:

我正在尝试通过带有 Flatbuffers 的 TCP 传输数据,服务器是 java,但客户端是 C#,这使得它变得非常复杂。

我使用的架构是:

namespace NetObjects;

union NetParameters { NetLogin, NetRegister }

table NetMessage {
  parameters:NetParameters;
}

table NetLogin{
    id: int;
    email:string;
    password:string;
}

table NetRegister{
    id: int;
    email:string;
    password:string;
}

root_type NetMessage;
file_identifier "MESG";

我如何发送它 c#:

 FlatBufferBuilder fbb = new FlatBufferBuilder(1);

            String buffer = "EMAILCHE";
            StringOffset id = fbb.CreateString(buffer);
            StringOffset idd = fbb.CreateString("PasswordO?");

            NetLogin.StartNetLogin(fbb);
            NetLogin.AddEmail(fbb, id);
            NetLogin.AddPassword(fbb, idd);
            Offset<NetLogin> offset = NetLogin.EndNetLogin(fbb);

            NetMessage.StartNetMessage(fbb);

            NetMessage.AddParametersType(fbb, NetParameters.NetRegister);
            NetMessage.AddParameters(fbb, offset.Value);

            Offset<NetMessage> par = NetMessage.EndNetMessage(fbb);

            NetMessage.FinishNetMessageBuffer(fbb, par);

            _socket.Send(fbb.DataBuffer.Data, 0, fbb.DataBuffer.Data.Length, SocketFlags.None);

我是如何收到它的 java:

DataInputStream in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
try (ByteArrayOutputStream os = new ByteArrayOutputStream())
                {
                    byte[] buffer = new byte[0xFFFF];

                    for (int len; (len = in.read(buffer)) != -1;) {
                        os.write(buffer, 0, len);
                        os.flush();
                        Handle(os.toByteArray());
                        System.out.println("Step: " + 4);
                    }
                }

句柄:

public void Handle(byte[] bytes){

        ByteBuffer bff = ByteBuffer.wrap(bytes);

        NetMessage.NetMessageBufferHasIdentifier(bff); // ALWAYS FALSE IS RETURNED

        NetMessage lg = NetMessage.getRootAsNetMessage(bff);

        System.out.println(lg.parametersType()); // 0 is returned
}

【问题讨论】:

  • 这不是 FlatBuffers 问题,而是“如何在 Java 中读取字节数组”问题。
  • 嗯。我不这么认为os.ToString(),从c#返回发送数据
  • 我会将传递给Handle()bytesfbb.DataBuffer.Data 进行比较。确保它们是相同的。至少,我在代码中没有发现明显的错误。

标签: java c# flatbuffers


【解决方案1】:
_socket.Send(fbb.DataBuffer.Data, fbb.Offset, fbb.DataBuffer.Data.Length,  SocketFlags.None);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2015-08-02
    • 2012-05-17
    • 2013-10-26
    • 2013-01-06
    相关资源
    最近更新 更多