وحدة Nodejs للتواصل بين العمليات المحلية والبعيدة مع دعم كامل لأنظمة التشغيل Linux وMac وWindows. كما أنه يدعم جميع أشكال اتصالات المقابس بدءًا من مقابس يونكس وويندوز ذات المستوى المنخفض وحتى مقابس UDP ومآخذ TLS وTCP الآمنة.
حل رائع للشبكات العصبية المعقدة متعددة العمليات في Node.JS
npm install node-ipc
npm install node-ipc@^9.0.0
//es6
import ipc from 'node-ipc'
//commonjs
const ipc = require ( 'node-ipc' ) . default ;
معلومات npm: راجع اتجاهات وإحصائيات npm لـnode-ipc
معلومات جيثب :
معلومات تغطية الكود :
قم بتشغيل npm run coverage
لاستضافة نسخة محلية من تقرير التغطية على المضيف المحلي:8080. هذا هو نفس تنسيق اسطنبول ومدينة نيويورك. ينبغي أن يكون مألوفا جدا.
تم الاختبار باستخدام اختبار الفانيليا
يتكامل vanilla-test
مع c8 لتغطية ESM الأصلية دون الحاجة إلى نقل التعليمات البرمجية الخاصة بك. وفي وقت كتابة هذا التقرير، كانت هذه هي الطريقة الوحيدة لاختبار الإدارة السليمة بيئيًا، وهي مذهلة!
مواقع تفاصيل الحزمة:
تم ترخيص هذا العمل من خلال ترخيص MIT.
قد تعمل أحدث الإصدارات من node-ipc
مع علامة --harmony. رسميًا، نحن ندعم العقدة v4 والأحدث مع es5 وes6
سيقوم npm test
بإجراء اختبارات الياسمين مع اسطنبول لـ Node-IPC وإنشاء تقرير تغطية في مجلد المواصفات.
قد ترغب في تثبيت jasmine و istanbul عالميًا باستخدام sudo npm install -g jasmine istanbul
يكتب | استقرار | تعريف |
---|---|---|
مقبس Unix أو مقبس Windows | مستقر | يمنح Linux وMac وWindows اتصالاً سريعًا للغاية ويتجنب استخدام بطاقة الشبكة لتقليل الحمل الزائد وزمن الوصول. أمثلة على Unix وWindows المحلي |
مقبس TCP | مستقر | يوفر الاتصال الأكثر موثوقية عبر الشبكة. يمكن استخدامه لـ IPC المحلي أيضًا، ولكنه أبطأ من تطبيق Unix مقبس رقم 1 لأن مآخذ توصيل TCP تمر عبر بطاقة الشبكة بينما لا تمر مقابس Unix وWindows مقبس بذلك. أمثلة على مقبس TCP للشبكة المحلية أو البعيدة |
مقبس TLS | مستقر | مقبس شبكة قابل للتكوين وآمن عبر SSL. يعادل https. وثائق TLS/SSL |
مآخذ UDP | مستقر | يعطي أسرع اتصالات الشبكة . UDP أقل موثوقية ولكنه أسرع بكثير من TCP. من الأفضل استخدامه لدفق البيانات غير الهامة مثل الصوت أو الفيديو أو بيانات الألعاب متعددة اللاعبين حيث يمكنه إسقاط الحزم اعتمادًا على اتصال الشبكة وعوامل أخرى. يمكن استخدام UDP لـ IPC المحلي أيضًا، ولكنه أبطأ من تطبيق Unix مقبس أو Windows مقبس رقم 1 لأن مآخذ توصيل UDP تمر عبر بطاقة الشبكة بينما لا تمر مقابس Unix وWindows. أمثلة على مقبس UDP للشبكة المحلية أو البعيدة |
نظام التشغيل | المقابس المدعومة |
---|---|
لينكس | يونكس، بوسيكس، TCP، TLS، UDP |
ماك | يونكس، بوسيكس، TCP، TLS، UDP |
يفوز | ويندوز، TCP، TLS، UDP |
ipc.config
قم بتعيين هذه المتغيرات في نطاق ipc.config
للكتابة فوق القيم الافتراضية أو تعيينها.
{
appspace : 'app.' ,
socketRoot : '/tmp/' ,
id : os . hostname ( ) ,
networkHost : 'localhost' , //should resolve to 127.0.0.1 or ::1 see the table below related to this
networkPort : 8000 ,
readableAll : false ,
writableAll : false ,
encoding : 'utf8' ,
rawBuffer : false ,
delimiter : 'f' ,
sync : false ,
silent : false ,
logInColor : true ,
logDepth : 5 ,
logger : console . log ,
maxConnections : 100 ,
retry : 500 ,
maxRetries : false ,
stopRetrying : false ,
unlink : true ,
interfaces : {
localAddress : false ,
localPort : false ,
family : false ,
hints : false ,
lookup : false
}
}
عامل | الوثائق |
---|---|
com.appspace | يستخدم لمسافات الأسماء Unix مقبس (مقبس مجال Unix). إذا لم يتم تعيينه على وجه التحديد، فسوف يجمع Unix Domain Switch بين مقبس الجذر ومساحة التطبيق والمعرف لتشكيل مسار مقبس Unix للإنشاء أو الربط. يتوفر هذا في حالة وجود العديد من التطبيقات قيد التشغيل على نظامك، فقد يكون لديك عدة مقابس بنفس المعرف، ولكن إذا قمت بتغيير مساحة التطبيقات، فسيظل لديك مآخذ توصيل فريدة خاصة بالتطبيق. |
com.socketRoot | الدليل الذي سيتم إنشاء أو ربط مقبس Unix به |
بطاقة تعريف | معرف هذا المقبس أو الخدمة |
NetworkHost | المضيف المحلي أو البعيد الذي يجب أن تتصل عليه مقابس TCP أو TLS أو UDP |
NetworkPort | المنفذ الافتراضي الذي يجب أن تتصل عليه مقابس TCP أو TLS أو UDP |
readableAll | يجعل الأنبوب قابلاً للقراءة لجميع المستخدمين بما في ذلك خدمات Windows |
writableAll | يجعل الأنبوب قابلاً للكتابة لجميع المستخدمين بما في ذلك خدمات Windows |
ترميز | الترميز الافتراضي للبيانات المرسلة على مآخذ التوصيل. يُستخدم غالبًا إذا تم ضبط RawBuffer على القيمة true. القيم الصالحة هي: ascii utf8 utf16le ucs2 base64 hex . |
com.rawBuffer | إذا كان هذا صحيحًا، فسيتم إرسال البيانات واستلامها Buffer مؤقت للعقدة الأولية وليس Object بتنسيق JSON. يعد هذا أمرًا رائعًا لـ IPC الثنائي أو السداسي، والتواصل مع العمليات الأخرى بلغات مثل C وC++ |
محدد | المحدد في نهاية كل حزمة بيانات. |
مزامنة | طلبات متزامنة لن يقوم العملاء بإرسال طلبات جديدة حتى يجيب الخادم. |
صامت | تشغيل/إيقاف التسجيل الافتراضي هو خطأ مما يعني أن التسجيل قيد التشغيل |
logInColor | تشغيل/إيقاف util.inspect الألوان لـ ipc.log |
عمق السجل | اضبط عمق util.inspect أثناء ipc.log |
المسجل | الوظيفة التي تستقبل المخرجات من ipc.log؛ يجب أن تأخذ وسيطة سلسلة واحدة |
maxConnections | هذا هو الحد الأقصى لعدد الاتصالات المسموح بها للمقبس. يتم حاليًا تعيينه فقط على Unix Switches. تستخدم أنواع المقابس الأخرى إعدادات النظام الافتراضية. |
أعد المحاولة | هذا هو الوقت بالمللي ثانية الذي سينتظره العميل قبل محاولة إعادة الاتصال بالخادم في حالة فقدان الاتصال. لا يؤثر هذا على مآخذ توصيل UDP نظرًا لعدم وجود علاقة خادم عميل لها مثل Unix Switches وTCPockets. |
maxRetries | إذا تم تعيينه، فإنه يمثل الحد الأقصى لعدد مرات إعادة المحاولة بعد كل قطع اتصال قبل التخلي عن اتصال معين وإنهاءه تمامًا |
stopRetrying | الافتراضيات الخاطئة تعني أن العملاء سيستمرون في إعادة محاولة الاتصال بالخوادم إلى أجل غير مسمى عند الفاصل الزمني لإعادة المحاولة. إذا تم التعيين على أي رقم، فسيتوقف العميل عن إعادة المحاولة عند تجاوز هذا الرقم بعد كل قطع اتصال. إذا تم ضبطه على "صحيح" في الوقت الفعلي، فسوف يتوقف على الفور عن محاولة الاتصال بغض النظر عن maxRetries. إذا تم التعيين على 0، فلن يحاول العميل إعادة الاتصال. |
إلغاء الارتباط | الإعدادات الافتراضية تعني أن الوحدة ستهتم بحذف مقبس IPC قبل بدء التشغيل. إذا كنت تستخدم node-ipc في بيئة مجمعة حيث سيكون هناك عدة مستمعين على نفس المقبس، فيجب عليك ضبط هذا على false ثم الاهتمام بحذف المقبس في التعليمات البرمجية الخاصة بك. |
واجهات | يُستخدم بشكل أساسي عند تحديد الواجهة التي يجب على العميل الاتصال من خلالها. راجع وثائق المقبس.connect في واجهة برمجة تطبيقات Node.js |
تتوفر هذه الأساليب في نطاق IPC.
ipc.log(a,b,c,d,e...);
سوف يقبل ipc.log أي عدد من الوسائط وإذا لم يتم تعيين ipc.config.silent
، فسوف يقوم بربطها جميعًا بمسافة واحدة ' ' بينها ثم تسجيلها إلى وحدة التحكم. وهذا سريع لأنه يمنع حدوث أي تسلسل إذا تم ضبط ipc.config.silent على القيمة true
. بهذه الطريقة، إذا تركت تسجيل الدخول الخاص بك في مكانه، فلن يكون له أي تأثير تقريبًا على الأداء.
يستخدم السجل أيضًا util.inspect. يمكنك التحكم في ما إذا كان يجب تسجيل الدخول بالألوان وعمق السجل والوجهة عبر ipc.config
ipc . config . logInColor = true ; //default
ipc . config . logDepth = 5 ; //default
ipc . config . logger = console . log . bind ( console ) ; // default
ipc.connectTo(id,path,callback);
يُستخدم للاتصال كعميل بمقابس Unix وWindows المحلية. هذه هي أسرع طريقة للتواصل على نفس الجهاز لأنها تتجاوز بطاقة الشبكة التي يجب أن يستخدمها كل من TCP وUDP.
عامل | مطلوب | تعريف |
---|---|---|
بطاقة تعريف | مطلوب | هو معرف سلسلة المقبس المتصل به. تتم إضافة المقبس الذي يحمل هذا المعرف إلى كائن ipc.of عند إنشائه. |
طريق | خياري | هو مسار ملف مقبس مجال Unix، إذا كان النظام هو Windows، فسيتم تحويله تلقائيًا إلى أنبوب مناسب بنفس المعلومات الموجودة في ملف مقبس مجال Unix. إذا لم يتم تعيينه، فسيتم تعيينه افتراضيًا على ipc.config.socketRoot + ipc.config.appspace + id |
أتصل مرة أخرى | خياري | هذه هي الوظيفة التي يجب تنفيذها عند إنشاء المقبس. |
يمكن حذف وسيطات الأمثلة طالما أنها لا تزال مرتبة.
ipc . connectTo ( 'world' ) ;
أو باستخدام معرف ورد اتصال فقط
ipc . connectTo (
'world' ,
function ( ) {
ipc . of . world . on (
'hello' ,
function ( data ) {
ipc . log ( data . debug ) ;
//if data was a string, it would have the color set to the debug style applied to it
}
)
}
) ;
أو تحديد المسار بشكل صريح
ipc . connectTo (
'world' ,
'myapp.world'
) ;
أو تحديد المسار بشكل صريح باستخدام رد الاتصال
ipc . connectTo (
'world' ,
'myapp.world' ,
function ( ) {
...
}
) ;
ipc.connectToNet(id,host,port,callback)
يستخدم للاتصال كعميل بمقبس TCP أو TLS عبر بطاقة الشبكة. يمكن أن يكون هذا محليًا أو بعيدًا، إذا كان محليًا، فمن المستحسن استخدام Unix وWindowsocket Implementaion الخاص بـ connectTo
بدلاً من ذلك لأنه أسرع بكثير لأنه يتجنب بطاقة الشبكة تمامًا.
بالنسبة لمقابس TLS وSSL، راجع مستندات Node-ipc TLS وSSL. لديهم بعض المتطلبات الإضافية والأشياء التي يجب معرفتها وبالتالي لديهم مستند خاص بهم.
عامل | مطلوب | تعريف |
---|---|---|
بطاقة تعريف | مطلوب | هو معرف سلسلة المقبس المتصل به. بالنسبة لمقابس TCP وTLS، تتم إضافة هذا المعرف إلى كائن ipc.of عند إنشاء المقبس بمرجع إلى المقبس. |
يستضيف | خياري | هو المضيف الذي يوجد عليه مقبس TCP أو TLS. سيكون هذا افتراضيًا على ipc.config.networkHost إذا لم يتم تحديده. |
ميناء | خياري | المنفذ الذي يوجد عليه مقبس TCP أو TLS. |
أتصل مرة أخرى | خياري | هذه هي الوظيفة التي يجب تنفيذها عند إنشاء المقبس. |
يمكن حذف وسيطات الأمثلة طالما أنها لا تزال مرتبة.
لذا، في حين أن الإعداد الافتراضي هو: (id,host,port,callback)، فإن الأمثلة التالية ستظل تعمل لأنها لا تزال بالترتيب (id,port,callback) أو (id,host,callback) أو (id,port) إلخ .
ipc . connectToNet ( 'world' ) ;
أو باستخدام معرف ورد الاتصال فقط
ipc . connectToNet (
'world' ,
function ( ) {
...
}
) ;
أو تحديد المضيف والمسار بشكل صريح
ipc . connectToNet (
'world' ,
'myapp.com' , serve ( path , callback )
3435
) ;
أو فقط تحديد المنفذ ورد الاتصال بشكل صريح
ipc . connectToNet (
'world' ,
3435 ,
function ( ) {
...
}
) ;
ipc.disconnect(id)
يُستخدم لفصل العميل عن مقبس Unix أو Windows أو TCP أو TLS. ستتم إزالة المقبس ومرجعه من الذاكرة ونطاق ipc.of
يمكن أن يكون هذا محليًا أو بعيدًا. لا يحتفظ عملاء UDP بالاتصالات وبالتالي لا يوجد عملاء وهذه الطريقة ليس لها أي قيمة بالنسبة لهم.
عامل | مطلوب | تعريف |
---|---|---|
بطاقة تعريف | مطلوب | هو معرف سلسلة المقبس الذي سيتم قطع الاتصال منه. |
أمثلة
ipc . disconnect ( 'world' ) ;
ipc.serve(path,callback);
يُستخدم لإنشاء خادم Unix مقبس محلي أو خادم Windows مقبس محلي يمكن للعملاء الارتباط به. يمكن للخادم emit
أحداث إلى مقابس عميل محددة، أو broadcast
أحداث إلى كافة مآخذ توصيل العملاء المعروفة.
عامل | مطلوب | تعريف |
---|---|---|
طريق | خياري | هذا هو مسار ملف مقبس مجال Unix، إذا كان النظام هو Windows، فسيتم تحويله تلقائيًا إلى أنبوب مناسب بنفس المعلومات الموجودة في ملف Unix Domain مقبس. إذا لم يتم تعيينه، فسيتم تعيينه افتراضيًا على ipc.config.socketRoot + ipc.config.appspace + id |
أتصل مرة أخرى | خياري | هذه دالة يتم استدعاؤها بعد بدء تشغيل الخادم. ويمكن القيام بذلك أيضًا عن طريق ربط حدث بحدث البداية مثل ipc.server.on('start',function(){}); |
يمكن حذف وسيطات الأمثلة طالما أنها لا تزال مرتبة.
ipc . serve ( ) ;
أو تحديد رد الاتصال
ipc . serve (
function ( ) { ... }
) ;
أو تحديد المسار
ipc . serve (
'/tmp/myapp.myservice'
) ;
أو تحديد كل شيء
ipc . serve (
'/tmp/myapp.myservice' ,
function ( ) { ... }
) ;
serveNet(host,port,UDPType,callback)
يُستخدم لإنشاء خادم مقبس TCP أو TLS أو UDP الذي يمكن للعملاء الارتباط به أو يمكن للخوادم الأخرى إرسال البيانات إليه. يمكن للخادم emit
أحداث إلى مقابس عميل محددة، أو broadcast
أحداث إلى كافة مآخذ توصيل العملاء المعروفة.
عامل | مطلوب | تعريف |
---|---|---|
يستضيف | خياري | إذا لم يتم تحديده، فسيتم تعيين هذا العنوان الافتراضي على العنوان الأول في os.networkInterfaces(). بالنسبة لخوادم TCP وTLS وUDP، فمن المرجح أن يكون هذا هو 127.0.0.1 أو::1 |
ميناء | خياري | المنفذ الذي سيتم ربط خادم TCP أو UDP أو TLS به، هذا الإعداد الافتراضي هو 8000 إذا لم يتم تحديده |
نوع UDP | خياري | إذا تم تعيينه، فسيؤدي ذلك إلى إنشاء الخادم كمقبس UDP. "udp4" أو "udp6" قيمتان صالحتان. هذا الإعداد الافتراضي هو عدم التعيين. عند استخدام udp6 تأكد من تحديد مضيف IPv6 صالح، مثل ::1 |
أتصل مرة أخرى | خياري | الدالة التي سيتم استدعاؤها عند إنشاء الخادم |
يمكن حذف وسيطات الأمثلة طالما أنها لا تزال مرتبة.
خادم TCP الافتراضي
ipc . serveNet ( ) ;
خادم UDP الافتراضي
ipc . serveNet ( 'udp4' ) ;
أو تحديد خادم TCP مع رد الاتصال
ipc . serveNet (
function ( ) { ... }
) ;
أو تحديد خادم UDP مع رد الاتصال
ipc . serveNet (
'udp4' ,
function ( ) { ... }
) ;
أو تحديد المنفذ
ipc . serveNet (
3435
) ;
أو تحديد كل شيء TCP
ipc . serveNet (
'MyMostAwesomeApp.com' ,
3435 ,
function ( ) { ... }
) ;
أو تحديد كل شيء UDP
ipc . serveNet (
'MyMostAwesomeApp.com' ,
3435 ,
'udp4' ,
function ( ) { ... }
) ;
عامل | تعريف |
---|---|
ipc.of | هذا هو المكان الذي سيتم فيه تخزين مراجع اتصال المقبس عند الاتصال بها كعميل عبر ipc.connectTo أو iupc.connectToNet . وسيتم تخزينها بناءً على المعرف المستخدم لإنشائها، على سبيل المثال: ipc.of.mySocket |
ipc.server | يعد هذا مرجعًا للخادم الذي تم إنشاؤه بواسطة ipc.serve أو ipc.serveNet |
طريقة | تعريف |
---|---|
يبدأ | بدء الخدمة بحاجة إلى الاتصال serve أو serveNet أولاً لإعداد الخادم |
قف | أغلق الخادم وأوقف الخدمة |
اسم الحدث | المعلمات | تعريف |
---|---|---|
خطأ | خطأ obj | يتم تشغيله عند حدوث خطأ |
يتصل | يتم تشغيله عند توصيل المقبس | |
قطع الاتصال | يتم تشغيله بواسطة العميل عند فصل المقبس عن الخادم | |
مأخذ توصيل | تم تدمير المقبسSocketID | يتم تشغيله بواسطة الخادم عند قطع اتصال مأخذ توصيل العميل |
تدمير | يتم تشغيله عندما يتم تدمير المقبس بالكامل، ولن تتم عمليات إعادة المحاولة التلقائية الإضافية وستختفي جميع المراجع. | |
بيانات | عازلة | يتم تشغيله عندما يكون ipc.config.rawBuffer صحيحًا ويتم تلقي رسالة. |
نوع الحدث الخاص بك | بيانات الحدث الخاص بك | يتم تشغيله عند تلقي رسالة JSON. سيكون اسم الحدث هو سلسلة النوع من رسالتك وستكون المعلمة هي كائن البيانات من رسالتك، على سبيل المثال: { type:'myEvent',data:{a:1}} |
في بعض الأحيان قد تحتاج إلى مثيلات صريحة ومستقلة لـnode-ipc. فقط لمثل هذه السيناريوهات قمنا بكشف فئة IPC الأساسية على IPC المفرد.
import { IPCModule } from 'node-ipc' ;
const ipc = new RawIPC ;
const someOtherExplicitIPC = new RawIPC ;
//OR
const ipc = from 'node-ipc' ) ;
const someOtherExplicitIPC = new ipc . IPC ;
//setting explicit configs
//keep one silent and the other verbose
ipc . config . silent = true ;
someOtherExplicitIPC . config . silent = true ;
//make one a raw binary and the other json based ipc
ipc . config . rawBuffer = false ;
someOtherExplicitIPC . config . rawBuffer = true ;
someOtherExplicitIPC . config . encoding = 'hex' ;
يمكنك العثور على أمثلة متقدمة في مجلد الأمثلة. ستجد في الأمثلة عروضًا توضيحية أكثر تعقيدًا بما في ذلك أمثلة للعملاء المتعددين.
الخادم هو عملية إبقاء مأخذ التوصيل لـ IPC مفتوحًا. يمكن لمآخذ توصيل متعددة الاتصال بهذا الخادم والتحدث معه. ويمكنه أيضًا البث لجميع العملاء أو الإرسال إلى عميل معين. هذا هو المثال الأساسي الذي سيعمل مع مقابس Unix وWindows المحلية بالإضافة إلى مقابس TCP للشبكة المحلية أو البعيدة.
import ipc from 'node-ipc' ;
ipc . config . id = 'world' ;
ipc . config . retry = 1500 ;
ipc . serve (
function ( ) {
ipc . server . on (
'message' ,
function ( data , socket ) {
ipc . log ( 'got a message : ' . debug , data ) ;
ipc . server . emit (
socket ,
'message' , //this can be anything you want so long as
//your client knows.
data + ' world!'
) ;
}
) ;
ipc . server . on (
'socket.disconnected' ,
function ( socket , destroyedSocketID ) {
ipc . log ( 'client ' + destroyedSocketID + ' has disconnected!' ) ;
}
) ;
}
) ;
ipc . server . start ( ) ;
يتصل العميل بمقبس الخوادم للاتصال بين العمليات. سوف يستقبل المقبس الأحداث المرسلة إليه على وجه التحديد بالإضافة إلى الأحداث التي يتم بثها على المقبس بواسطة الخادم. هذا هو المثال الأساسي الذي سيعمل مع كل من مقابس Unix المحلية ومآخذ TCP للشبكة المحلية أو البعيدة.
import ipc from 'node-ipc' ;
ipc . config . id = 'hello' ;
ipc . config . retry = 1500 ;
ipc . connectTo (
'world' ,
function ( ) {
ipc . of . world . on (
'connect' ,
function ( ) {
ipc . log ( '## connected to world ##' . rainbow , ipc . config . delay ) ;
ipc . of . world . emit (
'message' , //any event or message type your server listens for
'hello'
)
}
) ;
ipc . of . world . on (
'disconnect' ,
function ( ) {
ipc . log ( 'disconnected from world' . notice ) ;
}
) ;
ipc . of . world . on (
'message' , //any event or message type your server listens for
function ( data ) {
ipc . log ( 'got a message from world : ' . debug , data ) ;
}
) ;
}
) ;
تختلف مقابس UDP عن مقابس Unix وWindows وTCP لأنها يجب أن تكون مرتبطة بمنفذ فريد على أجهزتها لتلقي الرسائل. على سبيل المثال، يمكن لعميل TCP أو Unix أو Windows Switch الاتصال بوحدة خدمة TCP أو Unix أو Windows Switch منفصلة. يمكن لهذا العميل بعد ذلك تبادل البيانات وإرسالها واستقبالها على منفذ الخادم أو موقعه. لا تستطيع مآخذ UDP القيام بذلك. يجب عليهم الارتباط بمنفذ لتلقي البيانات أو إرسالها.
وهذا يعني أن عميل UDP وخادم UDP هما نفس الشيء لأنه من أجل تلقي البيانات، يجب أن يكون لمقبس UDP منفذ خاص به لتلقي البيانات عليه، ويمكن لعملية واحدة فقط استخدام هذا المنفذ في كل مرة. ويعني أيضًا أنه من أجل emit
البيانات أو broadcast
، سيحتاج خادم UDP إلى معرفة المضيف ومنفذ المقبس الذي ينوي بث البيانات إليه.
هذا هو المثال الأساسي الذي سيعمل مع مقابس UDP المحلية والبعيدة.
import ipc from 'node-ipc' ;
ipc . config . id = 'world' ;
ipc . config . retry = 1500 ;
ipc . serveNet (
'udp4' ,
function ( ) {
console . log ( 123 ) ;
ipc . server . on (
'message' ,
function ( data , socket ) {
ipc . log ( 'got a message from ' . debug , data . from . variable , ' : ' . debug , data . message . variable ) ;
ipc . server . emit (
socket ,
'message' ,
{
from : ipc . config . id ,
message : data . message + ' world!'
}
) ;
}
) ;
console . log ( ipc . server ) ;
}
) ;
ipc . server . start ( ) ;
لاحظ أننا قمنا بتعيين المنفذ هنا على 8001 لأن الخادم العالمي يستخدم بالفعل المنفذ الافتراضي ipc.config.networkPort وهو 8000. لذلك لا يمكننا الارتباط بـ 8000 بينما يستخدمه العالم.
ipc . config . id = 'hello' ;
ipc . config . retry = 1500 ;
ipc . serveNet (
8001 ,
'udp4' ,
function ( ) {
ipc . server . on (
'message' ,
function ( data ) {
ipc . log ( 'got Data' ) ;
ipc . log ( 'got a message from ' . debug , data . from . variable , ' : ' . debug , data . message . variable ) ;
}
) ;
ipc . server . emit (
{
address : '127.0.0.1' , //any hostname will work
port : ipc . config . networkPort
} ,
'message' ,
{
from : ipc . config . id ,
message : 'Hello'
}
) ;
}
) ;
ipc . server . start ( ) ;
يمكن استخدام المقابس الثنائية أو المقابس المؤقتة مع أي من أنواع المقابس المذكورة أعلاه، إلا أن طريقة إرسال أحداث البيانات مختلفة قليلاً . قد تكون هذه مفيدة في حالة العمل مع الأنظمة المضمنة أو عمليات C / C++. يمكنك أيضًا التأكد من مطابقة كتابة السلسلة C أو C++.
عند إعداد مقبس RawBuffer، يجب عليك تحديده على هذا النحو:
ipc . config . rawBuffer = true ;
يمكنك أيضًا تحديد نوع الترميز الخاص به. الافتراضي هو utf8
ipc . config . encoding = 'utf8' ;
تنبعث منها سلسلة المخزن المؤقت:
//server
ipc . server . emit (
socket ,
'hello'
) ;
//client
ipc . of . world . emit (
'hello'
)
تنبعث من المخزن المؤقت لصفيف البايت:
//hex encoding may work best for this.
ipc . config . encoding = 'hex' ;
//server
ipc . server . emit (
socket ,
[ 10 , 20 , 30 ]
) ;
//client
ipc . server . emit (
[ 10 , 20 , 30 ]
) ;
إصدار مخزن مؤقت ثنائي أو سداسي عشري، وهذا هو الأفضل لنقل البيانات في الوقت الفعلي، خاصة عند الاتصال بعمليات C أو C++ أو الأنظمة المدمجة:
ipc . config . encoding = 'hex' ;
//server
ipc . server . emit (
socket ,
[ 0x05 , 0x6d , 0x5c ]
) ;
//client
ipc . server . emit (
[ 0x05 , 0x6d , 0x5c ]
) ;
كتابة مخازن مؤقتة صريحة، وأنواع int، ومضاعفات، وعائمات وما إلى ذلك، بالإضافة إلى بيانات endian كبيرة وبيانات endian صغيرة إلى المخزن المؤقت الخام تكون ذات قيمة كبيرة عند الاتصال بعمليات C أو C++، أو الأنظمة المضمنة (راجع معلومات أكثر تفصيلاً عن المخازن المؤقتة بالإضافة إلى UInt وInt ، مزدوج وما إلى ذلك هنا)[https://nodejs.org/api/buffer.html]:
ipc . config . encoding = 'hex' ;
//make a 6 byte buffer for example
const myBuffer = Buffer . alloc ( 6 ) . fill ( 0 ) ;
//fill the first 2 bytes with a 16 bit (2 byte) short unsigned int
//write a UInt16 (2 byte or short) as Big Endian
myBuffer . writeUInt16BE (
2 , //value to write
0 //offset in bytes
) ;
//OR
myBuffer . writeUInt16LE ( 0x2 , 0 ) ;
//OR
myBuffer . writeUInt16LE ( 0x02 , 0 ) ;
//fill the remaining 4 bytes with a 32 bit (4 byte) long unsigned int
//write a UInt32 (4 byte or long) as Big Endian
myBuffer . writeUInt32BE (
16772812 , //value to write
2 //offset in bytes
) ;
//OR
myBuffer . writeUInt32BE ( 0xffeecc , 0 )
//server
ipc . server . emit (
socket ,
myBuffer
) ;
//client
ipc . server . emit (
myBuffer
) ;
cluster
يمكن استخدام node-ipc
مع وحدة المجموعة الخاصة بـ Node.js لتوفير القدرة على الحصول على عدة قارئات لمقبس واحد. يتطلب القيام بذلك ببساطة تعيين خاصية unlink
في التكوين على false
والاهتمام بإلغاء ربط مسار المقبس في العملية الرئيسية:
import fs from 'fs' ;
import ipc from 'node-ipc' ;
import { cpus } from 'os' ;
import cluster from 'cluster' ;
const cpuCount = cpus ( ) . length ;
const socketPath = '/tmp/ipc.sock' ;
ipc . config . unlink = false ;
if ( cluster . isMaster ) {
if ( fs . existsSync ( socketPath ) ) {
fs . unlinkSync ( socketPath ) ;
}
for ( let i = 0 ; i < cpuCount ; i ++ ) {
cluster . fork ( ) ;
}
} else {
ipc . serve (
socketPath ,
function ( ) {
ipc . server . on (
'currentDate' ,
function ( data , socket ) {
console . log ( `pid ${ process . pid } got: ` , data ) ;
}
) ;
}
) ;
ipc . server . start ( ) ;
console . log ( `pid ${ process . pid } listening on ${ socketPath } ` ) ;
}
import fs from 'fs' ;
import ipc from 'node-ipc' ;
const socketPath = '/tmp/ipc.sock' ;
//loop forever so you can see the pid of the cluster sever change in the logs
setInterval (
function ( ) {
ipc . connectTo (
'world' ,
socketPath ,
connecting
) ;
} ,
2000
) ;
function connecting ( socket ) {
ipc . of . world . on (
'connect' ,
function ( ) {
ipc . of . world . emit (
'currentDate' ,
{
message : new Date ( ) . toISOString ( )
}
) ;
ipc . disconnect ( 'world' ) ;
}
) ;
}
انظر ملف ترخيص معهد ماساتشوستس للتكنولوجيا.
أنا آسف.