استخدام دلفي في إنشاء خوادم الاتصال وتبادل البيانات - تحليل تقنية الإرسال والاستقبال (الجزء الثاني) المؤلف: 火鸟 [email protected] 2. شرح تفصيلي لخدمة الإرسال والاستقبال 1. ملخص تحليل خدمة الإرسال والاستقبال تعد خدمة الإرسال والاستقبال هي المكون الأساسي لنظام جهاز الإرسال والاستقبال، وهي مسؤولة عن قراءة تعريفات المنفذ والقناة والمعلمات التي تحددها وحدة تحكم جهاز الإرسال والاستقبال من مكتبة تكوين النظام، وإنشاء منافذ الاتصال والتحكم فيها ديناميكيًا وعلاقاتها أثناء وقت التشغيل. والتحكم في جدولة استلام البيانات وإرسالها وتخزينها مؤقتًا، وإدارة السجلات وقوائم الانتظار، وما إلى ذلك. Transceiver Shell هو تطبيق لجميع أنواع المنافذ المدعومة لإرسال واستقبال البيانات. 2. ملخص تصميم خدمة الإرسال والاستقبال تم تطوير خدمة الإرسال والاستقبال من تطبيق الخدمة في دلفي. يمكن تشغيل تطبيق الخدمة في حالة النظام بدلاً من حالة المستخدم. يكون مدير التحكم في خدمة نظام التشغيل (SCM) مسؤولاً عن تشغيل البرنامج وإدارته. لا تحتوي الخدمة على واجهة مستخدم وتنتمي إلى برنامج الخلفية للنظام. Transceiver Kernel عبارة عن سلسلة من أساليب فئة Transceiver التي تنشئ وتتحكم في Transceiver Shell، وTransceiver Shell عبارة عن مجموعة من الكائنات المسؤولة عن الاتصال. ملاحظة: نظرًا لاعتبارات الأداء والتحميل، يقوم جهاز الإرسال والاستقبال Kernel بتنفيذ التقسيم الوظيفي في مخطط البنية بشكل منطقي فقط، ولا يتم تنفيذ الوحدات المكونة بطريقة تعتمد على الكائنات تمامًا. 3. ملخص تنفيذ خدمة الإرسال والاستقبال i. قم بإنشاء تطبيق خدمة حدد جديد|أخرى... من قائمة دلفي الرئيسية ملف... وحدد جديد|تطبيق الخدمة في مربع حوار العناصر الجديدة المنبثق إطار العمل كما يلي: PRogram Project1؛ يستخدم SvcMgr، Unit1 في 'Unit1.pas' {Service1: TService};{$R *.RES}begin Application.Initialize; Application.Run;end.unit Unit1;واجهات استخدامات Windows، والرسائل، وSysUtils، والفئات، والرسومات، وعناصر التحكم، وSvcMgr، ومربعات الحوار؛ end;var Service1: TService1;إجراء التنفيذ{$R *.DFM}. ServiceController(CtrlCode: DWord); stdcall;begin Service1.Controller(CtrlCode);end;function TService1.GetServiceController: TServiceController;بدء النتيجة:= ServiceController;end;end يمكنك أن ترى أنه بالإضافة إلى SvcMgr المستخدم لإدارة الخدمة المشار إليها في وحدة الاستخدامات، يرث TService1 من TServiced بدلاً من TForm، ووظيفة GetServiceController المحملة بشكل زائد وعملية ServiceController التي يتم استدعاؤها في وضع stdcall، ويتم إنشاؤها باستخدام دلفي ليس هناك الكثير مما يميز برنامج الخدمة، قد يرغب محبو دلفي في البهجة مرة أخرى، وهذا هو السحر القوي لـ Delphi RAD. بالإضافة إلى ذلك، نظرًا لأن تطبيق الخدمة لا يمكن تصحيحه مباشرة في وقت التشغيل ولا يحتوي على واجهة مستخدم، فيجب مراعاة إخراج معلومات تصحيح الأخطاء بدون واجهة أثناء التطوير لتسهيل تصحيح الأخطاء واستكشاف الأخطاء وإصلاحها. 2. لإنشاء فئة منفذ تلبي احتياجات محددة وتستخدم نواة جهاز الإرسال والاستقبال مع آلية تشغيل ومعالجة موحدة، يجب أن يكون لدى المنافذ الموجودة في جهاز الإرسال والاستقبال قواعد معالجة موحدة. بعض المنافذ في Shell هي فئات مكونات موجودة في دلفي بيئة التطوير (مثل TCP وFTP وما إلى ذلك) وبعضها لا (مثل MSMQ وFile وما إلى ذلك). في هذا الوقت، تحتاج إلى إنشاء فئة يمكنها تلبية احتياجاتك. على سبيل المثال: اكتب// نظرًا لعدم وجود واجهة مستخدم، يتم توريثها من TComponent بدلاً من TControl TFilePort=class(TComponent) Private FilePath:string;// احصل على موقع مجلد الملف أو احفظه Prefix:string;//File prefix suffix:string; //File suffix end; إذا تم استخدامها كمصدر، فسيتم الحصول على الملفات التي تستوفي الشروط من مجلد معين. إذا تم استخدامها كهدف، فسيتم كتابة البيانات التي تم الحصول عليها من المصدر المقابل إلى الملف المحدد (في الواقع تأتي المعلمات الفعلية لكل كائن منفذ من تعريف جدول المنفذ في مكتبة تكوين النظام). مثال آخر: اكتب TCOMPort=class(TComponent) Private ComFace:string; // واجهة COM للحصول على البيانات أو إرسالها، سيتم استخدام TCOMPort للحصول على البيانات من واجهة مكون COM المحددة أو إرسالها لإجراء المعالجة اللاحقة. في دلفي، تعد فئة OleVariant إحدى الطرق لتنفيذ استدعاءات مكونات COM. إن ضرورة استخدام فئة TCOMPort هي أن جهاز الإرسال والاستقبال سيقوم بإنشاء مثيل لواجهة COM المحددة بواسطة TCOMPort في كائن OleVariant فقط عند الحاجة إلى الوصول إلى البيانات الضرورية، والكائن. سيتم تحريره بعد الاستخدام، وهذا يمكن أن يقلل من ضغط التحميل على جهاز الإرسال والاستقبال وخادم COM. تنطبق نفس الاعتبارات على مكونات أخرى مماثلة. مثال الفصل الذي قدمه المؤلف هنا هو مجرد نموذج، ويجب إضافة الأساليب والأحداث المناسبة عند الضرورة. تتضمن الفئات التي تم تنفيذها من قبل المؤلف أثناء التطوير: TCOMPort، وTMSMQPort، وTDBPort، وTFilePort، وما إلى ذلك. دعم قنوات متعددة - مجموعة من الكائنات التي تعلن عن منافذ، يعتبر جهاز الإرسال والاستقبال عملية الاتصال بمثابة عملية تدفق البيانات من المصدر إلى الهدف. مثل هذه العملية هي قناة في جهاز الإرسال والاستقبال، وتتكون هذه القناة من قناتين على الأقل المنافذ (واحد للمصدر وواحد للهدف)، لذلك إذا كنت تريد تحديد عدد غير محدد من القنوات المتعددة مع دمج المصدر والهدف بحرية، فيجب عليك الإعلان عنهما للمصدر والهدف على التوالي. مصفوفات من الكائنات من فئات المنافذ المختلفة (وإنشاء علاقات مقابلة لها، كما سترى لاحقًا). على سبيل المثال: القطاع الخاص { تصريحات خاصة }TCPSource:array of TServerSocket;//مصفوفة كائن لمصدر TCP TCPTarget:array of TClientSocket;//مصفوفة كائن لهدف TCP MailSource:array of TIdPOP3 //For Mail Source Object array MailTarget:array of TIdSMTP; // مصفوفة كائن لهدف البريد fileSource:array of TFilePort; // مصفوفة كائن لمصدر الملف fileTarget:array of TFilePort; // مصفوفة كائن لهدف الملف comSource:array of TCOMPort; // مصفوفة كائن لمصدر COM comTarget:array of TCOMPort; تختلف قواعد تشغيل المنفذ للمصدر والهدف من نفس النوع تمامًا، ويُنظر إليها على أنها مختلفة تمامًا وليست كائنات مرتبطة بشكل مباشر في مفهوم جهاز الإرسال والاستقبال. ولذلك، بالنسبة لنفس نوع المنفذ، يتم أيضًا إنشاء صفائف الكائنات بشكل منفصل وفقًا للمصدر والهدف. 4. إنشاء مثيل لمصفوفة الكائنات في وقت التشغيل، تتم إدارة عدد العناصر في كل مصفوفة كائن بواسطة منشئ المنفذ في وقت التشغيل. إذا قام المستخدم بتعريف بعض أنواع المنافذ من خلال وحدة تحكم جهاز الإرسال والاستقبال، فسيقوم منشئ المنفذ بإنشاء مثيل لها وفقًا لعددها. المعلمات المعنية. وإلا، لن يتم إنشاء مثيل لصفيف الكائن. في كائن المنفذ من النوع المصدر، يتم تعيين خاصية الاسم على شكل "استلام" + معرف المنفذ. في مشغلات استقبال البيانات اللاحقة، سيساعد ذلك مرسل البيانات في تحديد موقع الكائن وجدولة أنواع مختلفة من كائنات المنفذ بشكل موحد. يتم استخدام سمة العلامة لتزويد وحدة التحكم في القناة بمعلومات معرف الهدف للقناة التي يوجد بها. ما يلي هو جزء إنشاء مثيل لصفيف كائن comSource في Port Builder الذي يبدأ // إنشاء COM/ استلام المنفذ itmp:=high(comSource)+1;// احصل على الحد الأقصى الحالي لعدد comSource، itmp هو المتغير الصحيح SetLength(comSource) ,itmp +1); // إضافة عضو مصفوفة comSource [itmp]:=TCOMPort.Create(self); // إنشاء مثيل للعضو comSource[itmp].Name:= 'Receive'+inttostr(isource); // قم بتعيين سمة الاسم على "Receive"+معرف المنفذ، وisource هو معرف المنفذ الحالي لنوع العدد الصحيح comSource [itmp].Tag:= itarget; القناة التي تقع فيها NullTest :=rece.Fields['Address'].value;// احصل على قيمة تكوين النظام COMFace، NullTest هو متغير متغير if (NullTest <>null) و (trim(NullTest)<>'') ثم begincomSource [itmp].ComFace:=NullTest; // تعيين قيم صالحة لـ ComFaceNullTest:=rece.Fields['interval'].value; // احصل على الفاصل الزمني للتشغيل لكائنات COM للحصول على البيانات في تكوين النظام SetTimer(application.handle,isource,NullTest*60000 ,nil); // إنشاء ساعة تشغيل للمنفذ الحالي لجمع البيانات بانتظام، isource هو Port IdendelsecomSource [itmp].Tag:=-1;// فشلت التهيئة، تم وضع علامة على أنها نهاية منفذ غير صالحة؛ comSource هو منفذ فئة المصدر المستخدم لاستدعاء الواجهة المحددة في ComFace والحصول على البيانات بعد فترة زمنية معينة، المقابلة لـ comTarget. مشابه، باستثناء أن إرسال البيانات إلى ComFace من comTarget هو عملية في الوقت الفعلي، لذلك ليست هناك حاجة لاستخدام الفاصل الزمني للتشغيل، ويمكن حذف العبارتين الخاصتين بإنشاء الساعة. إن إنشاء وتهيئة أنواع أخرى من كائنات المنفذ متشابهة. على سبيل المثال، جزء تنفيذ MailTarget آخر: البدء // إنشاء منفذ SMTP/إرسال itmp:=high(MailTarget)+1; SetLength(MailTarget,itmp+1); MailTarget[itmp]:=TIdSMTP.Create(self); itmp].Name:='send'+ inttostr(itarget); MailTarget[itmp].Tag:=3;// تعيين كتعريف نوع المنفذ الهدف NullTest:=rece.Fields['Address'].value; // عنوان خادم البريد if (NullTest <>null) و (trim(NullTest) <>'') ثم MailTarget[itmp].Host :=NullTest else bValid:=false; NullTest:=rece.Fields['Port'].value; // منفذ خادم البريد if NullTest <>null ثم(if NullTest<>0 ثم MailTarget[itmp].Port :=NullTest)else bValid:=false: =rece.Fields['user'].value;//اسم مستخدم تسجيل الدخول if NullTest <>null thenMailTarget[itmp].UserId :=NullTest else bValid:=false;=rece.Fields['password'].value;// كلمة مرور تسجيل الدخول………………………end; أنا في حيرة من أمري. يتم إنشاء عدد كبير من مكونات اتصالات Transceiver Shell بواسطة Port Builder في وقت التشغيل. هل سيكون أداء خدمة Transceiver مرتفعًا؟ في الواقع، تكتمل مهمة Port Builder مرة واحدة عند حدوث حدث ServiceCreate. سيؤثر عدد منافذ Shell فقط على سرعة تهيئة خدمة الإرسال والاستقبال. وستؤثر سرعة الاتصال الخاصة بمنفذ Shell والأداء العام لخدمة الإرسال والاستقبال لن تتأثر موارد النظام بطبيعة الحال، وقد يستغرق الأمر أكثر من ذلك بقليل. v. التخصيص الديناميكي ومعالجة الأحداث من بين منافذ الاتصال العديدة التي يدعمها Transceiver Shell، استخدم TServerSocket (قد تميل أكثر إلى استخدام مكون الاتصال الخاص بـ Indy، لكن هذا لا يتعارض مع فكرة تصميم خدمة Transceiver Service، فهو مجرد تعديل على مستوى Shell أو تمت إضافته للتو)، يعد تطبيق TCPSource أكثر تميزًا، لأن TServerSocket، كمنفذ مصدر، يختلف عن كائنات مثل COM أو POP3 التي يجب تشغيلها بشكل منتظم في جهاز الإرسال والاستقبال تكون الخدمة دائمًا في حالة استماع بعد بدء تشغيلها، وهي عبارة عن مكون يقوم بإنشاء الأحداث المقابلة عندما يتصل ClientSocket ويرسل البيانات. ما يلي هو جزء إنشاء مثيل لـ TCPSource: البدء // إنشاء منفذ TCP/استقبال itmp:=high(TCPSource)+1;SetLength(TCPSource,itmp+1); [ itmp].OnClientRead:=TCPServersClientRead;// قم بتعيين عملية معالجة حدث OnClientRead إلى TCPServersClientRead TCPSource [itmp].OnClientError:=TCPServerClientError;// قم بتعيين عملية معالجة حدث OnClientError إلى TCPServerClientErrorTCPSource [itmp].Name:= 'Receive'+inttostr(isource); TCPSource [itmp ].Tag:=itarget; // قم بتعيين IDTCPSource الهدف لقناته [itmp].Socket.Data:=@ TCPSource [itmp].Tag;// قم بإرفاق معرف الهدف لكائن المنفذ هذا بكائن المقبس كبيانات مؤشر……………… نهاية؛ الساعة، ولكن كيف نتعامل مع الأحداث عندما تنطلق الساعة؟ وبنفس الطريقة، فهو أيضًا التخصيص الديناميكي لمعالجة الأحداث. يمكن إضافة تعريف المعالجة لساعة comSource إلى معالجة حدث ServiceCreate: application.OnMessage:=Timer; لتنفيذ التحميل الزائد لمعالجة الرسائل. عند إنشاء رسالة من التطبيق، سيتم تشغيل المؤقت في حدث Timer قم بتصفيتها ومعالجتها باستخدام رسالة WM_TIMER التي يتم تشغيلها بواسطة الساعة، يمكنك استدعاء طريقة الحصول على البيانات لمنفذ مصدر محدد وفقًا لمعرف المنفذ ونوع: الإجراء TCarrier.Timer(var Msg: TMsg; var Handled:. Boolean);var stmp:string; Obj:TComponent;begin if Msg.message =WM_TIMER ثم// تبدأ معالجة رسالة الساعة// ابحث عن الكائن الذي يحدد هذه الرسالة وفقًا لمعرف المنفذ الذي أدى إلى تشغيل الرسالة Obj:=FindComponent( 'Receive'+inttostr (Msg.WParam)); إذا كان obj=nil ثم قم بالخروج؛// قم بالخروج من المعالجة إذا لم يتم العثور على stmp:=obj.ClassName;// اعكس للحصول على معلومات النوع لكائن المنفذ هذا إذا stmp='TIdPOP3' ثم GetPOP3(TIdPOP3(Obj)); إذا stmp='TIdFTP' ثم GetFTP(TIdFTP(obj)); إذا stmp='TFilePort' ثم GetFile(TFilePort(Obj)); ثم GetCOM(TCOMPort(Obj));//استدعاء عملية الحصول على البيانات الخاصة بـ COMSource…………………… end;end; vi. الحصول على البيانات ما يلي هو إجراء معالجة الحصول على البيانات لـ COMSource TCarrier.GetCOM(COMObj: TCOMPort);var stmp:string;begin حاول//إنشاء كائن مكون COM بناءً على قيمة ComFace COMInterface:=CreateOleObject (COMObj.ComFace stmp:=COMInterface.GetData; // اتصل بطريقة الواجهة المتفق عليها للحصول على البيانات أثناء stmp<>#0; do // #0 هي علامة نهاية استخراج البيانات المتفق عليها لبدء DataArrive(stmp, COMObj.Tag); // تم تسليمها إلى مرسل البيانات للمعالجة الموحدة، COMObj.Tag هو معرف المنفذ المستهدف للقناة التي يوجد بها الكائن. stmp:=COMInterface.GetData; end; أكمل عملية استخراج البيانات وحرر كائن المكون حتى استدعاء المشغل التالي. فيما يلي معالجة الحصول على البيانات لـ TCPSource: الإجراء TCarrier.TCPServersClientRead(Sender: TObject;ocket:TCustomWinSocket);beginDataArrive(socket.ReceiveText,integer(TServerWinSocket(). sender).data ^));// من اليسار إلى مرسل البيانات للمعالجة الموحدة، المعلمة الثانية هي قيمة مؤشر معرف المنفذ المستهدف المرفق بمرسل كائن المقبس، حيث تتلقى أنواع مختلفة من كائنات منفذ المصدر البيانات بطرق مختلفة، ولكن في النهاية يتم تسليم البيانات المستلمة إلى مرسل البيانات. من مستوى التنفيذ، في كل مرة تتم فيها إضافة كائن استقبال البيانات ويتم تنفيذ استقبال البيانات الخاصة به، يتم تنفيذ منفذ مصدر جديد لـ Transceiver Shell. ملاحظة: يقوم المؤلف هنا بتنفيذ تلقي البيانات النصية فقط، وقد يحتاج المستخدمون إلى تلقي كائنات الذاكرة أو تدفقات البيانات أو البيانات الثنائية وإجراء تغييرات طفيفة على رمز الاستقبال. سابعا: جدولة البيانات يتم استكمال جدولة البيانات الخاصة بخدمة الإرسال والاستقبال بواسطة الوحدة المنطقية لمرسل البيانات. وتتمثل المهمة الرئيسية لمرسل البيانات في إدارة البيانات الواردة من منافذ المصدر المختلفة والتحكم فيها بشكل موحد، والعمل جنبًا إلى جنب مع وحدة التحكم في القناة. وفقًا للقناة، حدد توزيع البيانات على منافذ مستهدفة مختلفة، وراقب ما إذا كانت نتائج الإرسال ناجحة، وحدد ما إذا كان يجب إرسال البيانات إلى مدير قائمة الانتظار ومسجل السجل للتخزين المؤقت ومعالجة السجل بناءً على نتائج الإرسال والإعدادات. من مكتبة تكوين النظام. بعد ذلك، انظر إلى طريقة DataArrive الخاصة بمنفذ المصدر لإرسال البيانات: الإجراء TCarrier.DataArrive(sData:String;PortID:Integer);var dTime:Datetime; / إذا كانت البيانات فارغة، فاقفز iLogID:=-1 dTime:= now; sdata:=copy(sdata,1,length(sdata)-1);// تنسيق السلسلة للتوافق مع لغة C bSendSeccess:=DataSend(sdata,PortID);// اتصل بمرسل البيانات لإرسال طريقة الإرسال، PortID هو معرف المنفذ المستهدف (TSCfg.LogOnlyError=false) أو (bSendSeccess=false) theniLogID:=writeLog(dTime, now,sData, PortID, bSendSeccess);// سجل السجلات وفقًا لقواعد معالجة السجل وإرسال النتائج في معلومات تكوين النظام if (TSCfg.Queueing=True) و (bSendSeccess=false) ثم PutQueue(dTime, now,sData, PortID, bSendSeccess, iLogID) // تحديد نهاية معالجة قائمة الانتظار بناءً على تعريف تكوين قائمة الانتظار في معلومات تكوين نظام الحزمة؛ يمكن أيضًا تعديل طريقة DataArrive الخاصة بالمرسل، والتي يتم من خلالها تحديد معالجة قائمة الانتظار وفقًا لمعلومات تكوين النظام وحالة الإرسال، إلى معالجة قائمة الانتظار الإلزامية. ما يلي هو أسلوب DataSend الخاص بمرسل البيانات، والذي يُستخدم لتوزيع البيانات ومعالجتها وفقًا لنوع المنفذ الهدف: الوظيفة TCarrier.DataSend(sData:String;PortID:Integer):boolean;var Obj:TComponent;begin DataSend:=false ;Obj:=FindComponent ('Send'+inttostr(PortID)); // ابحث عن الكائن بناءً على معرف المنفذ if (obj=nil) أو (obj.Tag =-1) ثم الخروج؛// الكائن غير موجود أو تم وضع علامة عليه على أنه غير صالح بسبب فشل التهيئة. حالة المنفذ obj.Tag of 1:DataSend:=PutTCP(TClientSocket(obj),sdata 3:DataSend:=PutSMTP(TIdSMTP); (obj)، sdata)؛ 5:DataSend:=PutFTP(TIdFTP(obj),sdata); 7:DataSend:=PutHTTP(TIdHTTP(obj),sdata); 9:DataSend:=PutFile(TFilePort(obj),sdata); 11:DataSend:=PutMSMQ(TMSMQPort (obj),sdata); PutDB(TDBPort(obj),sdata); 15:DataSend:=PutCOM(TCOMPort (obj),sdata); …………… …………… end;end; إذا كان الأمر كذلك، فإن أفضل طريقة للتعامل مع توزيع البيانات هي استخدام وظيفة رد الاتصال، ولكن في هذه الحالة، قد يؤدي ذلك إلى عدم معرفة أي عضو في مصفوفة الكائنات يجب أن يتعامل مع البيانات. بالإضافة إلى ذلك، فإن طريقة المعالجة الحالية لا تفصل بشكل كامل نواة جهاز الإرسال والاستقبال وقشرة جهاز الإرسال والاستقبال، ويجب علينا البحث عن طريقة معالجة أكثر تجريدًا واستقلالية. إرسال البيانات فيما يلي وظيفة إرسال TCP TCarrier.PutTCP(TCPOBJ:TClientSocket;sdata:string):Boolean;var itime:integer;begin PutTCP:=false; حاول TCPOBJ.Open; gettickcount; // كرر وقت البدء application.ProcessMessages; (gettickcount-itime>5000); //اقفز خارج الحلقة إذا كان الاتصال ناجحًا أو حدث انتهاء المهلة لمدة 5 ثوانٍ إذا بدأ TCPOBJ.Active TCPOBJ.Socket.SendText(sdata); قيمة الإرجاع هي عندما يتم إرسال البيانات بنجاح؛ TCPOBJ.Close؛ ExceptTCPOBJ.Close؛ ما يلي هو وظيفة الإرسال لـ COM TCarrier.PutCOM(COMOBJ:TCOMPort;sdata:string):Boolean;var Com:OleVariant;begin PutCOM:=false حاول Com:=CreateOleObject(COMOBJ.ComFace);// إنشاء واجهة محددة مسبقًا PutCOM:=Com.PutData ( sdata);// استدعاء الطريقة المحددة مسبقًا Com:= Unsigned; النهاية؛ الأنواع الأخرى من إرسال المنافذ متشابهة ولن يتم تكرارها هنا. حتى الآن، تم الانتهاء من المعالجة الأساسية للمصدر والهدف. تم إنشاء وظيفة اتصال أساسية بعد المطابقة المجانية لأنواع مختلفة من المصدر والهدف، يمكن تحقيق وظائف اتصال مختلفة تمامًا. من خلال إنشاء قنوات متعددة، يمكنك تنفيذ معالجة الاتصالات مركزيًا لوظائف متعددة ومختلفة. ix.معالجة قائمة الانتظار: بعد إرسال البيانات بطريقة DataArrive أعلاه، سيقوم مرسل البيانات باستدعاء writeLog لتسجيل البيانات وطريقة PutQueue لمعالجة قائمة الانتظار، وكلاهما يقوم بمعالجة معلومات البيانات معلمات النظام ليست محور هذه المقالة. تشبه إعادة محاولة معالجة قائمة الانتظار مبدأ توزيع المعالجة حسب نوع المنفذ في حدث Timer، وهي تعتمد على مشغل Queue Timer لقراءة البيانات المخزنة مؤقتًا من قاعدة البيانات واستدعاء DataSend مرة أخرى وفقًا لمعرف المنفذ المستهدف. أعد محاولة إرسال البيانات، إذا كان الإرسال ناجحًا، فستكتمل معاملة إرسال البيانات هذه، وإلا فسوف يتم إعادة إدخالها في قائمة الانتظار وانتظر وقت التشغيل التالي لإعادة المحاولة حتى يتم الإرسال بنجاح أو تعيين الحد الأقصى لعدد مرات إعادة المحاولة. تم التوصل إليه. ثلاثة، ملخص تجربة التطوير نظرًا لأن تركيز هذه المقالة هو شرح الأفكار الأساسية ومفاهيم التصميم لجهاز الإرسال والاستقبال، فإنها تبسط وتضعف المعالجة متعددة الخيوط وتجميع الكائنات ودعم المعاملات التي يجب على جهاز الإرسال والاستقبال اعتبارها خدمة خلفية، والأكثر تعقيدًا وإدارة المصدر والمجموعات المستهدفة القوية وCha تكامل nnel، والقدرة على إرسال واستقبال كائنات الذاكرة، وتدفقات البيانات، والبيانات الثنائية، وقراءة معلومات تكوين النظام وتنفيذ فئات التغليف الخاصة به، وأمن النظام والبيانات، وما إلى ذلك. آمل أن يتمكن القراء من تقديم بعض الأفكار والأفكار فهم أفكار تصميم جهاز الإرسال والاستقبال وإلهام شرارات الإلهام في أعمال التطوير الفعلية وإنشاء برامج أكثر تميزًا وقوة. المؤلف: Firebird [email protected] استخدم دلفي لإنشاء خوادم الاتصالات وتبادل البيانات - التحليل الفني لجهاز الإرسال والاستقبال (الجزء الأول) استخدم دلفي لإنشاء خوادم الاتصالات وتبادل البيانات - التحليل الفني لجهاز الإرسال والاستقبال (الجزء 2) تنفيذ فئات التجميع من خلال نظرة عامة على C#. NET والأشياء التقنية القديمة ذات الصلة : اختصارات البرنامج/حذف البرنامج/حذف EXE الذاتي الأشياء القديمة DIY: ملاحظات تجربة خوارزمية برمجة الطفولة