سؤال

أحاول إرسال رسائل (صفائف بايت) من Node.js إلى Java عبر مقبس TCP (تسلسل مع protobuf).

أقوم بإنشاء مقبس خادم على جانب جافا ، وأتصل به من العقدة:

var client = net.createConnection(12345, "localhost")

client.addListener("connect", function(){
    client.write(serializedMsg1)
    client.end(serializedMsg2)
})

على جانب Java ، أحضر المحتوى من دفق الإدخال وألحقه:

Protocol1.parseFrom(inputStream);
Protocol2.parseFrom(inputStream);

المشكلة تتبع - تبدو فقط serializedMsg2 تم تمريره/هجره ، بينما serializedMsg1 يتم تجاهله. كما أفهم ، يحدث ذلك ، لأن دفق البايت غير محدد ، ويجب تحديد حجم قطع البيانات بشكل صريح. لا ينبغي قراءة البيانات مباشرة من الدفق على جانب Java - يجب قراءة الأجزاء المحددة أولاً ، وأن يتم إلحاقها بمصفوفات البايت بعد ذلك.

هل كانت مفيدة؟

المحلول

يمكنك استخدام Buffer من أجل تمرير حجم مجموعة البيانات التي تكتبها إلى الدفق:

function writeInt(stream, int){
   var bytes = new Array(4)
   bytes[0] = int >> 24
   bytes[1] = int >> 16
   bytes[2] = int >> 8
   bytes[3] = int
   stream.write(new Buffer(bytes))
}

...

writeInt(client, data.length)
client.write(data)

على جانب جافا:

int size = inputStream.readInt();
byte[] result = new byte[size];
inputStream.read(byteArray);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top