1. دلفي والمقبس
تتكون شبكة الكمبيوتر من سلسلة من بروتوكولات اتصالات الشبكة، والبروتوكولات الأساسية لها هي بروتوكولات TCP/ip وUDP في طبقة النقل. TCP موجه نحو الاتصال، ويحتفظ كلا الطرفين المتصلين بالمسار، تمامًا مثل خط الهاتف الحالي. إذا كنت تستخدم telnet لتسجيل الدخول إلى BBS، فسيتم استخدام بروتوكول TCP بدون اتصال، ولا تحتفظ الأطراف المتصلة بكل منهما حالة الآخر يتم استخدامه عندما يصل المتصفح إلى الإنترنت ويعتمد بروتوكول HTTP على بروتوكول UDP. يعد كل من بروتوكولي TCP وUDP معقدين للغاية، وخاصةً بروتوكول TCP، ومن أجل ضمان صحة وفعالية نقل الشبكة، يجب إجراء سلسلة من عمليات تصحيح الأخطاء والفرز المعقدة.
المقبس عبارة عن مواصفات مأخذ توصيل تعتمد على بروتوكولات طبقة النقل (بشكل أساسي TCP وUDP) وقد تم اقتراحها في الأصل من قبل جامعة كاليفورنيا، بيركلي، وهي تحدد مواصفات الاتصال بين جهازي كمبيوتر (وهي أيضًا مواصفات برمجة في حالة الاتصال بين جهازي كمبيوتر). "قناة"، فإن طرفي هذه "القناة" عبارة عن مقبسين. تعمل المقابس على حماية الاختلافات بين برامج الاتصال الأساسية وأنظمة التشغيل المحددة، مما يجعل الاتصال ممكنًا بين أي جهازي كمبيوتر قاما بتثبيت برنامج بروتوكول TCP وتنفيذ مواصفات المقبس.
تعمل مواصفات Windows المقبس الخاصة بشركة Microsoft (اختصار Winsock) على توسيع مواصفات المقبس الخاصة بشركة Berkeley. وباستخدام أساليب المقبس القياسية، يمكنك التواصل مع المقبس على أي نظام أساسي باستخدام امتداداته، كما يمكنك تنفيذه بشكل أكثر فعالية على أنظمة Windows الأساسية. في دلفي، يجب أن يكون المقبس الأساسي هو Windows المقبس أيضًا. يقلل المقبس من صعوبة كتابة برامج الاتصال بين أجهزة الكمبيوتر، ولكنه بشكل عام لا يزال معقدًا للغاية (سيتم مناقشة هذا بالتفصيل لاحقًا)؛ حيث يقوم InPRise بتغليف Windows المقبس بشكل فعال في دلفي، مما يسمح للمستخدمين بكتابة برامج اتصال الشبكة بسهولة. نوضح أدناه بالأمثلة كيفية استخدام المقبس لكتابة برامج الاتصال في دلفي.
2. استخدم دلفي لكتابة برنامج اتصال المقبس.
ما يلي هو برنامج اتصال مقبس بسيط، حيث يكون العميل والخادم هما نفس البرنامج. عندما يقوم العميل (الخادم) بإدخال جزء من النص في المذكرة 1 والضغط على Enter، يمكن عرض النص على الخادم (العميل) ) في. memo2، والعكس صحيح أيضًا. الخطوات المحددة هي كما يلي:
1. أنشئ نموذجًا جديدًا وقم بتسميته بشكل تعسفي، ويمكنك أيضًا تعيينه كـ chatForm؛ ووضع القائمة الرئيسية (في العمود القياسي) وإنشاء عناصر قائمة الاستماع وConnectItem وDisconnect وExit؛ وحدد TServerSocket وTClientSocket من عمود Internet قم بإضافتهم إلى chatForm، حيث يتم تعيين اسم TClientSocket على ClientSocket، اضبط المنفذ على 1025، والنشط الافتراضي هو false؛ واضبط اسم TServerSocket على ServerSocket، واضبط المنفذ على 1025، والنشط الافتراضي هو false، واترك الآخرين دون تغيير، ثم أدخل مذكرتين، إحداهما باسم memo1، والأخرى باسم memo1 أخرى بالنسبة للمذكرة 2، يتم تعيين لون المذكرة 2 إلى اللون الرمادي لأنها تستخدم بشكل أساسي لعرض مدخلات الطرف الآخر. نوضح أدناه السبب أثناء كتابة التعليمات البرمجية.
2. انقر نقرًا مزدوجًا فوق عنصر القائمة. اكتب الكود التالي:
الإجراء TChatForm.ListenItemClick(Sender: TObject);
يبدأ
الاستماعItem.Checked := ليس الاستماعItem.Checked؛
إذا الاستماعItem.Checked بعد ذلك
يبدأ
ClientSocket.Active := خطأ؛
ServerSocket.Active := صحيح؛
نهاية
آخر
يبدأ
إذا ServerSocket.Active بعد ذلك
ServerSocket.Active := خطأ؛
نهاية؛
نهاية؛
وصف مقطع البرنامج هذا هو كما يلي: عندما يحدد المستخدم ListemItem، يتم قلب ListemItem إذا تم تحديده، فهذا يعني أنه في حالة الاستماع. ما يحتاج القراء إلى فهمه هو: الاستماع هو طريقة خاصة عندما يخدم المقبس كخادم إذا كان في حالة الاستماع، فسيتم تعيين ServerSocket على الحالة النشطة؛ وإلا فسيتم إلغاء الاستماع وإغلاق ServerSocket. في الواقع، يقوم المستخدم فقط بتحديد عنصر القائمة هذا في البداية، مما يشير إلى أن البرنامج يعمل كخادم. على العكس من ذلك، إذا قام المستخدم بتحديد ConnectItem، فيجب استخدامه كعميل.
3. انقر نقرًا مزدوجًا فوق ConnectItem وأدخل الكود التالي.
الإجراء TChatForm.ConnectItemClick(Sender: TObject);
يبدأ
إذا كان ClientSocket.Active ثم ClientSocket.Active := خطأ؛
إذا كان InputQuery('الكمبيوتر المطلوب الاتصال به'، 'اسم العنوان:'، الخادم) إذن
إذا كان الطول (الخادم) > 0 ثم
مع ClientSocket تفعل
يبدأ
المضيف := الخادم؛
نشط := صحيح؛
الاستماعItem.Checked := خطأ؛
نهاية؛
نهاية؛
تتمثل الوظيفة الرئيسية لهذا البرنامج في تعيين التطبيق كعميل عندما يحدد المستخدم عنصر القائمة ConnectItem، وينبثق مربع إدخال للسماح للمستخدم بإدخال عنوان الخادم. ولهذا السبب لا نقوم بإصلاح مضيف ClientSocket في البداية، بحيث يمكن للمستخدمين الاتصال ديناميكيًا بخوادم مختلفة. ما يحتاج القراء إلى فهمه هو أن عنوان المضيف هو مجرد سمة يمتلكها المقبس عندما يكون عميلاً. عندما يكون المقبس خادمًا، فإنه لا يستخدم العنوان "بشكل عام" لأنه مرتبط بالجهاز المحلي.
4. اكتب الكود التالي في طريقة keydown للمذكرة 1:
الإجراء TChatForm.Memo1KeyDown(Sender: TObject; var Key: Word;
التحول: TShiftState)؛
يبدأ
إذا كان المفتاح = VK_Return إذن
إذا IsServer ثم
ServerSocket.Socket.Connections[0].SendText(Memo1.Lines[Memo1.Lines.Count - 1])
آخر
ClientSocket.Socket.SendText(Memo1.Lines[Memo1.Lines.Count - 1]);
نهاية؛
وظيفة هذا الرمز واضحة، أي أنه يبدأ في إرسال الرسائل. إذا كان خادمًا، فإنه يرسل فقط رسالة إلى العميل الأول نظرًا لأن الخادم يمكنه الاتصال بعدة عملاء، ويتم الحفاظ على كل اتصال مع العميل بواسطة مقبس، وما يتم تخزينه هو مصفوفة ServerSocket.Socket.Connections. الذي يحافظ على الاتصال مع العميل. في المقبس القياسي، يحصل المقبس من جانب الخادم على المقبس الذي يحافظ على الاتصال بالعميل من خلال القيمة المرجعة لطريقة القبول ()، وطرق إرسال واستقبال الرسائل هي الإرسال (إرسال إلى) وريكف (ريكفروم) على التوالي لقد قامت شركة دلفي بهذا التغليف.
5. مقدمة مختصرة عن الرموز المتبقية.
الإجراء TChatForm.ServerSocketAccept(Sender: TObject;
المقبس: TCustomWinSocket)؛
يبدأ
IsServer := صحيح؛
نهاية؛
تكتمل طريقة قبول ServerSocket عندما يتصل العميل لأول مرة، ويمكن اعتبار أنه تم تنفيذها بعد طريقة القبول القياسية، نظرًا لوجود نوع المعلمة TCustomWinSocket، فيجب أن تكون القيمة المرجعة لـ مقبس قياسي من جانب الخادم.
الإجراء TChatForm.ClientSocketRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
يبدأ
Memo2.Lines.Add(Socket.ReceiveText);
نهاية؛
الإجراء TChatForm.ServerSocketClientRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
يبدأ
Memo2.Lines.Add(Socket.ReceiveText);
نهاية؛
يتم تشغيل هاتين القطعتين من التعليمات البرمجية بواسطة دلفي عندما يتلقى جانب الخادم وجانب العميل رسائل بعضهما البعض، وتتمثل وظيفتهما في عرض الرسائل المستلمة في المذكرة2. من بينها، المقبس الموجود في ClientSocketRead هو في الواقع المقبس نفسه، والمقبس الموجود في ServerSocketClientRead هو في الواقع مقبس في ServerSocket.Socket.Connection[]. ومع ذلك، في دلفي، يتم تغليف المقبس من جانب الخادم بشكل فعال.
الإجراء TChatForm.ServerSocketClientConnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
يبدأ
Memo2.Lines.Clear;
نهاية؛
الإجراء TChatForm.ClientSocketDisconnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
يبدأ
الاستماعItemClick(nil);
نهاية؛
هاتين الفقرتين بسيطة نسبيا. من بينها، يتم تشغيل ServerSocketClientConnect عندما يتلقى ServerSocket اتصالاً جديدًا. يتم تشغيل ClientSocketDisconnect عندما يصدر ClientSocket Disconncet.
الإجراء TChatForm.Exit1Click(Sender: TObject);
يبدأ
ServerSocket.Close;
ClientSocket.Close;
يغلق؛
نهاية؛
الإجراء TChatForm.Disconnect1Click(Sender: TObject);
يبدأ
ClientSocket.Active := خطأ؛
ServerSocket.Active := صحيح؛
نهاية؛
الفقرة الأولى هي لإغلاق التطبيق. في المقبس القياسي، عند إغلاق كل مقبس، يجب استدعاء طريقة Closesocket()، وإلا فلن يقوم النظام بتحرير الموارد. في ServerSockt.Close وClientSocket.Close، يجب استدعاء الأسلوب Closesocket() داخليًا في النظام.
3. المقبس والمقبس القياسي في دلفي.
إطار تطبيق المقبس القياسي هو كما يلي:
جانب الخادم: المقبس () [إنشاء مقبس جديد]--ربط ()[الربط بعنوان الخادم]--الاستماع ()--قبول ()--حظر الانتظار-قراءة ()[قبول الرسائل، في النوافذ النظام الأساسي ، الطريقة هي إرسال (TCP) أو إرسال إلى (UDP)] - معالجة طلب الخدمة - كتابة () [إرسال رسالة، في نظام Windows الأساسي، الطريقة هي إرسال (TCP)، أو أرسل إلى (UDP).
جانب العميل بسيط نسبيًا: المقبس ()--الاتصال () [الاتصال بخادم معين من خلال منفذ معين، وهو إنشاء اتصال بالخادم]--الكتابة ()-قراءة ().
يمكن أن يعتمد المقبس على TCP أو UDP، كما أن المقبس مبني على بروتوكولات أخرى، مثل IPX/SPX، DECNet، إلخ. عند إنشاء مقبس جديد، يمكنك تحديد نوع المقبس المراد إنشاؤه. يتم استخدام Bind() لربط عنوان الخادم إذا كان لدى المضيف عنوان IP واحد فقط، فإن دور الربط يكون في الواقع زائدًا عن الحاجة نسبيًا. يبدأ الاستماع () في مراقبة الشبكة، ويستخدم قبول () لقبول الاتصال، وقيمة الإرجاع الخاصة به هي المقبس الذي يحافظ على الاتصال بالعميل.
في دلفي، يتم تغليف المقبس في Windows بشكل فعال. في دلفي، وفقا لعلاقة الميراث الخاصة بهم، يمكن تقسيمهم إلى فئتين:
1. TComponent--TAbstractSocket--TCustomSocket--TCustomServerSocket--TSServerSocket
TComponent--TAbstractSocket--TCustomSocket--TClientSocket
2. وراثة مباشرة من TObject:
TObject--TCustomWinSocket--TServerWinSocket
TObject--TCustomWinSocket--TClientWinSocket
TObject--TCustomWinSocket--TServerClientWinSocket
يمكن ملاحظة أن النوع الأول يعتمد على TCustomSocket، والنوع الثاني يعتمد على TCustomWinSocket. النوع الأول مبني على TComponet، والنوع الثاني مبني مباشرة على TObject. لذلك، إذا كان المستخدم على دراية جيدة بمأخذ التوصيل ويريد كتابة برنامج وحدة تحكم، فيمكنه استخدام فئة TCustomWinScoket.
كما يتبين من نفس الاستخدامات، تم تنفيذها جميعًا في ScktComp.pas، ويحتوي schtComp.pas على ملف Winsock.pas. إذا واصلت التعمق في ملف Winsock، يمكنك العثور على جميع الطرق الأساسية لـ Windows Switch.
في الواقع، إذا فهمت إطار تطبيق المقبس القياسي، فسوف تشعر بالراحة عند استخدام دلفي لكتابة تطبيقات المقبس، وهذا لا يعني أنه يجب عليك فهم الوظائف القياسية في المقبس المعقد، وهو ليس ضروريًا، لأن دلفي قد فعلت ذلك بالفعل؛ بالنسبة لك، فهي مغلفة جيدًا، وهي قوة دلفي، ما عليك سوى فهم القليل من الإطار الأساسي.
هذا هو فهمي لتطبيقات المقبس في دلفي وآمل أن تتمكن من تصحيحي إذا كان لدي أي عيوب. وفي الوقت نفسه، يسعدني أيضًا الإجابة على الأسئلة حول المقبس في دلفي.