我正在尝试将使用 protobuf 创建的消息写入客户端套接字, 但我不知道为什么只有下面的代码有效。
mClientSSLSocket.getOutputStream().write(intToByte(message.getSerializedSize()));
message.writeTo(mClientSSLSocket.getOutputStream());
public int getSerializedSize() {
if (memoizedSerializedSize == -1) {
memoizedSerializedSize = Protobuf.getInstance().schemaFor(this).getSerializedSize(this);
}
return memoizedSerializedSize;
}
public static byte[] intToByte(int value) {
return new byte[] {
(byte) (value >> 24),
(byte) (value >> 16),
(byte) (value >> 8),
(byte) value };
}
但是:
mClientSSLSocket.getOutputStream().write(message.getSerializedSize()); <--- NOT WORK
mClientSSLSocket.getOutputStream().write(message.toByteArray()); <----- NOT WORK
我更不明白的是上面的代码 仅适用于 Android <-> Android
好吧,我怀疑它在 Android <-> IOS 上不起作用的原因是因为行分隔符...... 如何在字符串类型以外的对象类型中使用行分隔符?
谁能解释一下上面的内容吗?
mClientSSLSocket.getOutputStream().write(message.getSerializedSize()); <--- NOT WORK
mClientSSLSocket.getOutputStream().write(message.toByteArray()); <----- NOT WORK
正如 @user207421 所指出的,
OutputStream.write(int)
仅写入单个字节:
要写入的字节是参数b的低八位。 b 的高 24 位被忽略。
您总是想写入 4 个字节,因此这不起作用。