سؤال

في تنفيذي ل Java Nio، لم أتمكن من الحصول على SteenKey.attach () للعمل. في الأساس، بمجرد توصيل العملاء (OP_ACCREPT الفائدة العمليات)، أضيفها إلى خريطة حيث خرائط عنوان IP لكائن يحتفظ بالحالة للعميل. ثم، عندما يحدث OP_READ، استرجع مرة أخرى عنوان IP للعميل، وهذه المرة احصل على القيمة من الخريطة والحصول على كائن حالة العميل بهذه الطريقة.

المشكلة هنا هي أنني يجب أن أقوم بإجراء بحث في الخريطة، كل مرة يتم قراءة البيانات من الشبكة. هناك الكثير من العمل الضائع الذي يحدث هناك. لذلك، شعرت بسعادة غامرة لمعرفة أنه يمكنك إرفاق نوع كائن تعسفي إلى موصل، والتي يجب استرجاعها بسهولة عند استدعاء SEFTELKEY.ATTACHMENT ()، حتى إذا نجحنا الآن في التعامل مع حدث مختلف (تم استرجاعه خلال OP_READ مقابل خريطة خلال op_accept).

المشكلة هي أنه لا يعمل. عندما أسترد المرفق، فهو دائما فارغ. وإذا قمت بإعداد المرفق عبر إرفاق () ثم استدعاء المرفق فورا ()، فإنه يعمل. بطريقة ما بين الأحداث المختلفة، يفقد جمعيته.

أنا آسف، رمزي طويل قليلا للنشر هنا، ولكن إذا نظرت إلى التعليقات في هذا الموضوع:رابط النص... سترى أن البعض الآخر يأتون أساسا إلى نفس الاستنتاج: أن إرفاق () والمرفق () لا تعمل، وليس لديك أبدا.

هل هناك خدعة للحصول عليها للعمل، أو أنا عالق مع الشرير العلوي الضروري لإجراء بحث يدويا في خريطة في كل مرة يوجد حدث قراءة جديد للتعامل معه؟

أخيرا، هل هناك طريقة لعملية التفاف "التفاف" في فئة فرعية جديدة ستعامل بشكل صحيح مع إرفاق () والمرفق ()؟

شكرًا!

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

المحلول

لقد أرفقت الكائنات بنجاح للاختيار دون أي مشاكل، ولكن فقط من نفس الحدث. على سبيل المثال في المرة الأولى التي أحصل عليها OP_READ, ، أقوم بإرفاق كائن إلى SETFORKEY وعلى القراءة اللاحقة، وأعد ذلك، وأنه يعمل بشكل جيد. يمكن OP_ACCEPT و OP_READ قم بتعامل مع مفاتيح مختلفة لأنها أحداث مختلفة، لكنني أعتقد أنه يجب أن يكون STOFKEY هو نفسه بالنسبة لنفس الاتصال ... ولكن إذا قمت بإجراء اتصالات مختلفة حتى من نفس IP، فستحصل على مواجهة مختلفة.

تحديث: لقد فحصت للتو التعليمات البرمجية وهناك شيء مهم للغاية: لم أتصل بإرفاق () على الإطلاق؛ لقد استخدمت SelectableChannel.register(Selector sel, int ops, Object att) طريقة. إذا قمت بذلك، فإن المكالمات اللاحقة للمرفق () على SETFONKEY ستعمل.

نصائح أخرى

لا يوجد CR في صفحتك المرتبطة، ولا أستطيع رؤية أي شيء bugs.sun.com.. وبعد لكن، attach/attachment هو رمز بسيط جدا (على الرغم من أنه أكثر تعقيدا قليلا بعد بلدي خلل برمجي. وبعد تخميني هو أنك تحصل على مختلف SelectionKey, ، لذلك تحاول التفاف سيكون بلا معنى.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top