12/09/2021 (الإصدار 3.1)
25/05/2021 (الإصدار 3.0)
13/03/2021 (الإصدار 2.6)
01/02/2021 (الإصدار 2.5)
18/12/2020 (الإصدار 2.4)
28/11/2020
31/10/2020 (الإصدار 2.3)
27/10/2020 (الإصدار 2.2)
26/10/2020 (الإصدار 2.1)
09/10/2020
06/10/2020
24/09/2020
16/07/2020
12/07/2020
05/03/2020
19/04/2020
31/03/2019
تسمح لك هذه المكونات بإنشاء اتصال غير متزامن لمقبس TCP بين أجهزة الكمبيوتر الموجودة على شبكة LAN أو الإنترنت.
يستخدم DzTCPServer وDzTCPClient وحدة TClientSocket و TServerSocket من System.Win.ScktComp. هذه الفئات متوفرة على دلفي، لكن تنفيذها صعب بعض الشيء لأنك تحتاج إلى قراءة وكتابة بيانات المخزن المؤقت وليس هناك الكثير من الموارد المتاحة.
الاستخدام بسيط جدا. ستحتاج إلى إسقاط مكون الخادم في التطبيق من جانب الخادم ومكون العميل في التطبيق من جانب العميل والبدء في ترميز رسائل الأوامر.
يمكنك القيام بالكثير من الأشياء، مثل تطبيق الدردشة، وتطبيق الأوامر عن بعد، وتطبيق المراقبة عن بعد، وحتى إرسال التدفقات مثل الملفات. السماء هي الحد.
بنية ذاكرة التخزين المؤقت : عند استخدام مكون مقبس دلفي الأصلي، إذا قمت بإرسال رسائل متعددة في وقت واحد، فقد يتلقى المستلم الرسائل مجمعة أو مقسمة، لذلك تحتاج دائمًا إلى التعامل مع هذه المشكلة. يتحكم DzSocket في رسائل مأخذ التوصيل تلقائيًا، بحيث تتلقى دائمًا حدثًا واحدًا لكل رسالة.
KeepAlive : عند إنشاء اتصال مأخذ توصيل، في حالة فقدان أحد جانبي الاتصال، لن يتم الاتصال بالجانب الآخر حتى تتم محاولة إرسال رسالة جديدة. حتى تتمكن من تنفيذ اختبار الاتصال اليدوي، ولكن هذا سيوفر الكثير من العمل غير الضروري. يحتوي DzSocket على مورد KeepAlive، مما يتيح بروتوكول المحافظة على الحياة الأصلي للشبكة.
الأوامر : يسمح لك المقبس الأصلي بإرسال مقطع سلسلة، ولكن إذا كنت تريد إرسال الأوامر وتحديد هذه الأوامر في الجانب الآخر من الاتصال، فستحتاج إلى تنفيذ ذلك يدويًا. مع DzSocket ، لديك أمر Char متاح دائمًا. جاهزة وسريعة وسهلة.
كائنات البيانات المجانية التلقائية على الخادم : تحتوي قائمة كائنات العميل المتوفرة على مكون الخادم على خاصية المؤشر، مما يسمح لك بتخزين معلومات حول اتصال العميل، عادةً باستخدام كائن. مع DzSocket ، لا داعي للقلق بشأن تدمير هذا الكائن. تحتاج فقط إلى تمكين خاصية لرعاية هذه الكائنات.
العداد : لا يحتوي مكون الخادم الأصلي على عداد لتكرار اتصالات قائمة العملاء. باستخدام DzSocket ، يمكنك ببساطة إجراء for .. in
مباشرة على مكون الخادم، وتكرار اتصالات قائمة العملاء.
SendAll : إرسال الأوامر بسهولة إلى جميع العملاء. بالإضافة إلى ذلك، يمكنك استخدام SendAllEx
لإرسال الأوامر إلى جميع العملاء باستثناء اتصال عميل محدد.
مراقبة الاتصال : يوجد حدث فقدان الاتصال مما يسمح لك بمعرفة متى تم إغلاق الاتصال دون طلب العميل.
دعم Unicode : لا يدعم مكون دلفي الأصلي إرسال الرسائل باستخدام سلاسل Unicode، إلا إذا قمت بكتابة التعليمات البرمجية الخاصة بك لتحويل دفق البيانات على كلا الجانبين. هذا ممل حقا ويستغرق وقتا. باستخدام DzSocket يمكنك ببساطة إرسال نص الرسالة باستخدام معلمة الطريقة مباشرة كنوع سلسلة، لذلك ستعتبر دلفي أحرف Unicode كسلسلة عريضة افتراضيًا.
التحكم في تسجيل الدخول : يمكنك التحكم في مصادقة/تفويض العميل باستخدام أحداث بسيطة ويمكنك إرسال معلومات بيانات إضافية للتحكم في وصول العميل إلى الخادم.
إعادة الاتصال التلقائي : يمكن لمكون العميل إعادة الاتصال تلقائيًا بالخادم عند فقدان الاتصال، فقط عن طريق تمكين الخاصية.
وأكثر من ذلك بكثير!
يدعم دلفي XE3..دلفي 11
AutoFreeObjs: Boolean
(public) = إذا كنت تستخدم خاصية Data
الخاصة بمآخذ توصيل العميل على الخادم لتعيين كائنات، فيمكنك تمكين هذا الخيار، وبالتالي سيتولى المكون مهمة تدمير الكائن عند انتهاء مقبس العميل. تذكر، إذا تم تمكين هذا الخيار وتم تعيين خاصية Data للمقبس، فسيفترض المكون دائمًا البيانات ككائن.
EnumeratorOnlyAuth: Boolean
(public) = عند استخدام عداد المكونات for in
، تجاوز العملاء الذين لم تتم مصادقتهم بعد.
KeepAlive: Boolean
= السماح بتمكين المورد الأصلي لمقبس KeepAlive. سيؤدي هذا إلى إرسال إشارة استمرار باستخدام خاصية KeepAliveInterval.
KeepAliveInterval: Integer
= يحدد الفاصل الزمني لـ KeepAlive بالمللي ثانية (الافتراضي 15000 / 15 ثانية ).
Port: Word
= يحدد منفذ TCP للاستماع إلى الخادم. هذه الخاصية مطلوبة لبدء مقبس الخادم.
Connection[Index: Integer]: T DzSocket
(عام) = إرجاع كائن اتصال عميل T DzSocket بواسطة الفهرس.
Count: Integer
(عام) = يُرجع عدد قائمة اتصالات العميل.
procedure OnClientConnect (Sender: TObject; Socket: T DzSocket );
يتم تشغيل هذا الحدث عندما يتصل العميل بالخادم. المعلمة Socket
هي مأخذ توصيل العميل.
procedure OnClientDisconnect (Sender: TObject; Socket: T DzSocket );
يتم تشغيل هذا الحدث عندما ينقطع اتصال العميل بالخادم. المعلمة Socket
هي مأخذ توصيل العميل.
procedure OnClientError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
يتم تشغيل هذا الحدث عند حدوث خطأ في اتصال العميل. المعلمة Socket
هي مأخذ توصيل العميل.
procedure OnClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
يتم تشغيل هذا الحدث عندما يرسل العميل رسالة إلى الخادم. المعلمة Socket
هي مأخذ توصيل العميل.
procedure OnClientLoginCheck (Sender: TObject; Socket: T DzSocket ; var Accept: Boolean;
const RequestData: String; var ResponseData: String);
يتم تشغيل هذا الحدث عندما يتصل العميل للتو بالخادم. إذا تمت معالجة OnLoginRequest
من جانب العميل، فسيتم استقبال معلومات البيانات المرسلة هنا في معلمة RequestData
. يمكنك تغيير معلمة Accept
(القيمة الافتراضية الأولية هي True) لقبول اتصال العميل أو رفضه. بالإضافة إلى ذلك، يمكنك استخدام معلمة ResponseData
لإرسال بعض معلومات البيانات إلى العميل. سيتم استلام المعلومات المقبولة والبيانات من قبل العميل في حدث OnLoginResponse
. إذا ظلت معلمة Accept
True، فسيتم تعيين خاصية مأخذ التوصيل Auth
على True. وإلا سيتم إسقاط اتصال العميل بواسطة الخادم.
procedure OnClientLoginSuccess (Sender: TObject; Socket: T DzSocket );
يتم تشغيل هذا الحدث مباشرة بعد السماح للعميل بالدخول إلى الخادم. حتى إذا كنت لا تستخدم أحداث تسجيل الدخول، تذكر: فقط بعد السماح للعميل بالدخول إلى الخادم، يمكن للعميل إرسال الرسائل. وإلا فإن الخادم سوف يتجاهل أي رسائل العميل.
procedure Open ;
قم بتشغيل منفذ مأخذ توصيل الاستماع للخادم.
procedure Close ;
قم بإيقاف تشغيل منفذ مأخذ توصيل الاستماع الخاص بالخادم.
procedure Lock ;
procedure Unlock ;
استخدم هذه الطرق لتكرار قائمة الاتصالات (آمنة لمؤشر الترابط)، لأنه قد يتم إغلاق الاتصال عند تكرار قائمة الاتصالات.
مثال:
var CSock: T DzSocket ;
begin
Server.Lock;
try
for CSock in Server do
begin
// ...
end ;
finally
Server.Unlock;
end ;
end ;
بالإضافة إلى ذلك، يحتوي مكون TDzTCPServer على عداد افتراضي يشير إلى قائمة الاتصالات، مما يؤدي إلى كائن T DzSocket . لذلك يمكنك تكرار قائمة الاتصال باستخدام عبارة
for .. in
تمامًا مثل المثال السابق.
procedure Send (Socket: T DzSocket ; const Cmd: Char; const A: String = ' ' );
يرسل الأوامر والرسائل إلى مأخذ توصيل العميل المحدد بواسطة معلمة Socket
. يجب عليك استخدام المعلمة Cmd
لتحديد حرف الأمر الذي سيتم استلامه بواسطة العميل. المعلمة A
اختيارية وتسمح لك بتحديد نص الرسالة.
procedure SendAll ( const Cmd: Char; const A: String = ' ' );
إرسال رسالة إلى كافة العملاء المصادق عليهم.
procedure SendAllEx (Exclude: T DzSocket ; const Cmd: Char; const A: String = ' ' );
إرسال رسالة إلى كافة العملاء الذين تمت مصادقتهم، باستثناء العميل المحدد بواسطة معلمة Exclude
.
function FindSocketHandle ( const ID: TSocket): T DzSocket ;
إرجاع كائن T DzSocket بواسطة معرف مقبض المقبس.
function GetAuthConnections : Integer;
استرداد عدد الاتصالات المصادق عليها فقط.
AutoReconnect: Boolean
= في حالة التمكين، عندما يفقد العميل الاتصال بالخادم، سيحاول المقبس إعادة الاتصال تلقائيًا.
AutoReconnectInterval: Integer
= يحدد الوقت بالمللي ثانية لانتظار محاولة إعادة الاتصال الجديدة (الافتراضي 10000 / 10 ثانية ).
AutoReconnectAttempts: Integer
= عدد مرات محاولة إعادة الاتصال بعد فقدان الاتصال. اترك القيمة 0
لإعادة المحاولة بلا حدود.
KeepAlive: Boolean
= السماح بتمكين المورد الأصلي لمقبس KeepAlive. سيؤدي هذا إلى إرسال إشارة استمرار باستخدام خاصية KeepAliveInterval.
KeepAliveInterval: Integer
= يحدد الفاصل الزمني لـ KeepAlive بالمللي ثانية (الافتراضي 15000 / 15 ثانية ).
Host: String
= تحدد عنوان IP أو اسم المضيف (DNS) للاتصال بالخادم. هذه الخاصية مطلوبة للاتصال بمقبس الخادم.
Port: Word
= يحدد منفذ TCP لاتصال العميل، الذي يستمع إليه الخادم أو يتم تعيين المنفذ. هذه الخاصية مطلوبة للاتصال بمقبس الخادم.
Connected: Boolean
(عام) = يُرجع صحيحًا إذا تم تأسيس الاتصال.
SocketHandle: TSocket
(public) = يُرجع معرف مقبض المقبس الخاص بالاتصال.
procedure OnConnect (Sender: TObject; Socket: T DzSocket );
يتم تشغيل هذا الحدث عندما يقوم العميل بإنشاء الاتصال بالخادم.
procedure OnConnectionLost (Sender: TObject; Socket: T DzSocket );
يتم تشغيل هذا الحدث عند فقدان الاتصال بين العميل والخادم. سيحدث هذا إذا اكتشف العميل أن الاتصال قد تم إغلاقه بدون أمر قطع الاتصال من قبل العميل نفسه.
procedure OnDisconnect (Sender: TObject; Socket: T DzSocket ;
const WasConnected: Boolean);
يتم تشغيل هذا الحدث عندما ينقطع اتصال العميل بالخادم، حتى في حالة فقدان الاتصال. يتيح لك WasConnected
معرفة ما إذا كان حدث OnDisconnect جاء من اتصال مؤسس، لأنه سيتم تشغيل هذا الحدث حتى إذا كنت تحاول الاتصال ولم يتم إنشاء الاتصال بنجاح.
procedure OnError (Sender: TObject; Socket: T DzSocket ;
const Event: TErrorEvent; const ErrorCode: Integer; const ErrorMsg: string);
يتم تشغيل هذا الحدث عند حدوث خطأ في اتصال العميل. يوصى دائمًا بتعيين هذا الحدث، وإلا فإن المكون سيثير أخطاء غير متزامنة غير قابلة للتحكم.
procedure OnRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
يتم تشغيل هذا الحدث عندما يتلقى العميل رسالة من الخادم.
procedure OnLoginRequest (Sender: TObject; Socket: T DzSocket ; var Data: String);
يتم تشغيل هذا الحدث مباشرة بعد اتصال العميل بالخادم. وهذا يعني أن الخادم يطلب معلومات بيانات تسجيل الدخول، حتى يتمكن من التحقق من هذه البيانات واختيار قبول اتصال العميل أو إسقاطه. يجب عليك ملء معلمة Data
إذا كنت تريد التعامل مع هذه المعلومات على الخادم.
procedure OnLoginResponse (Sender: TObject; Socket: T DzSocket ; Accepted: Boolean; const Data: String)
يتم تشغيل هذا الحدث عندما يقبل الخادم اتصال العميل أو يرفضه. يمكنك التحقق من هذه النتيجة في المعلمة Accepted
، وقد يرسل الخادم إلى العميل بعض معلومات البيانات في معلمة Data
.
procedure OnReconnection (Sender: TObject; Socket: T DzSocket ; Attempt: Integer; Cancel: Boolean)
يحدث عند تمكين خاصية AutoReconnect
ويتم فقدان الاتصال، بعد مرور AutoReconnectInterval
بالمللي ثانية. إذا فشلت محاولة إعادة الاتصال، فسيتم تشغيل الحدث تباعًا حتى يتم تأسيس الاتصال. يمكنك إلغاء محاولات إعادة الاتصال عن طريق تغيير خاصية Cancel
إلى True
في حدث إعادة الاتصال، أو استدعاء أسلوب StopReconnection
.
procedure Connect ;
يتصل بالخادم.
procedure Disconnect ;
قطع الاتصال بالخادم.
procedure StopReconnection ;
إيقاف محاولات إعادة الاتصال عند تمكين ميزة AutoReconnect
وفقد الاتصال.
procedure Send ( const Cmd: Char; const A: String = ' ' );
يرسل الأوامر والرسائل إلى الخادم. يجب عليك استخدام المعلمة Cmd
لتحديد حرف الأمر الذي سيتم استلامه بواسطة الخادم. المعلمة A
اختيارية وتسمح لك بتحديد نص الرسالة.
هام: لن يتلقى الخادم الرسائل أثناء عدم مصادقة العميل، حتى لو كان متصلاً بالفعل.
متوفر فقط في Delphi XE6 أو أعلى
عندما تستخدم طريقة Send
من الخادم أو مقبس العميل، توجد معلمة String
تسمح لك بإرسال البيانات. هناك طريقتان عامتان يمكنك استخدامهما لإرسال بيانات متعددة في وقت واحد:
type TMsgArray = TArray<Variant>;
function ArrayToData ( const Fields: TMsgArray): String;
function DataToArray ( const Data: String): TMsgArray;
مرسل:
var
I: Integer;
S: String;
begin
I := 123 ;
S := ' Test ' ;
DzTCPClientTest.Send( ' M ' , ArrayToData([I, S]));
end ;
المتلقي:
procedure DzTCPServerTestClientRead (Sender: TObject; Socket: T DzSocket ;
const Cmd: Char; const A: string);
var MsgArray: TMsgArray;
begin
MsgArray := DataToArray(A);
ShowMessage(Format( ' Number = %d / String = %s ' , [MsgArray[ 0 ], MsgArray[ 1 ]]));
end ;
تستخدم وظائف التحويل داخليًا JSON لضمان هروب أحرف الأجزاء لضمان حزم/تفريغ المصفوفات دون تغيير المحتوى. لذلك، لا داعي للقلق بشأن محتوى أجزاء النوع المتغير.
يرجى التحقق من التطبيق التجريبي والبحث في أمر "إرسال طباعة" لمعرفة كيفية إرسال واستقبال دفق البيانات، وكذلك استخدام الضغط لزيادة سرعة الاتصال.