صمم خادم الوكيل الخاص بك باستخدام دلفي
عندما كان المؤلف يكتب برنامج فوترة عبر الإنترنت، كان الأمر يتعلق بمسألة كيفية دفع فاتورة الوصول إلى الإنترنت لكل محطة عمل في الشبكة المحلية. بشكل عام، تصل محطات العمل هذه إلى الإنترنت من خلال خادم وكيل. عند استخدام برنامج خادم وكيل جاهز، نظرًا لأن برنامج الخادم الوكيل عبارة عن نظام مغلق، فمن الصعب كتابة برنامج للحصول على معلومات توقيت الوصول إلى الإنترنت في الوقت الفعلي. لذلك فكر فيما إذا كان بإمكانك كتابة خادم وكيل خاص بك لحل مشكلة الوصول الجماعي إلى الإنترنت من ناحية ومشكلة الفوترة من ناحية أخرى؟
وبعد البرمجة التجريبية، تم حل المشكلة أخيرًا بشكل مرضي. اكتبها الآن وشاركها مع زملائك.
1. الأفكار
توجد معلمة في خيارات النظام للمتصفحات الشائعة حاليًا، وهي "الاتصال عبر خادم وكيل"، بعد اختبار البرمجة.
حاول القيام بذلك عندما تحدد محطة عمل في الشبكة المحلية هذه السمة ثم تصدر طلب إنترنت، سيتم إرسال بيانات الطلب إلى الخادم الوكيل المحدد. وفيما يلي مثال على حزمة الطلب:
احصل على http://home.microsoft.com/intl/cn/ HTTP/1.0
يقبل: */*
قبول اللغة: zh-cn
قبول الترميز: gzip، انكماش
وكيل المستخدم: Mozilla/4.0 (متوافق؛ MSIE 5.0؛ Windows NT)
المضيف: home.microsoft.com
اتصال الوكيل: البقاء على قيد الحياة
السطر الأول هو عنوان URL الهدف والطرق والبروتوكولات ذات الصلة، ويحدد سطر "المضيف" عنوان المضيف الهدف.
ومن هنا نعرف عملية خدمة الوكيل: تلقي الطلب من الوكيل، والاتصال بالمضيف الحقيقي، واستلام البيانات التي يعيدها المضيف، وإرسال البيانات المستلمة إلى الوكيل.
ولهذا الغرض، يمكن كتابة برنامج بسيط لإكمال مشكلة إعادة توجيه اتصالات الشبكة المذكورة أعلاه.
عند التصميم باستخدام دلفي، اختر ServerSocket كعنصر تحكم في المقبس للتواصل مع محطة عمل الوكيل، واختر المصفوفة الديناميكية ClientSocket كعنصر تحكم في المقبس للتواصل مع المضيف البعيد.
إحدى المشكلات المهمة التي يجب حلها أثناء البرمجة هي مشكلة معالجة الاتصال المتعدد، من أجل تسريع خدمة الوكيل وسرعة استجابة نهاية الوكيل، يجب ضبط خصائص التحكم في المقبس على عدم حظر كل اتصال؛ الجلسة مرتبطة ديناميكيًا بالمقبس، استخدم قيمة سمة المقبس المقبس لتحديد الجلسة التي تنتمي إليها.
تظهر عملية اتصال الاتصال في الشكل أدناه:
الخادم الوكيل
مقبس الخادم
(١) استقبل
تم إرساله بواسطة الوكيل إلى المضيف البعيد
(6) (2) (5)
متصفح ClientSocket (4) خادم الويب
تولي
إرسال(3)
(1) يرسل متصفح الوكيل طلب ويب، ويتلقى Serversocket الخاص بالخادم الوكيل الطلب.
(2) يقوم برنامج الخادم الوكيل تلقائيًا بإنشاء ClientSocket، وتعيين عنوان المضيف والمنفذ والسمات الأخرى، ثم الاتصال بالمضيف البعيد.
(3) بعد الاتصال عن بعد، يتم تشغيل حدث الإرسال ويتم إرسال حزمة طلب الويب التي يتلقاها Serversocket إلى المضيف البعيد.
(4) عندما يقوم المضيف البعيد بإرجاع بيانات الصفحة، يتم تشغيل حدث القراءة الخاص بـ ClientSocket لقراءة بيانات الصفحة.
(5) يحدد برنامج الخادم الوكيل أي مقبس في عنصر تحكم ServerSocket يجب أن يرسل معلومات الصفحة المستلمة من المضيف إلى الطرف الوكيل بناءً على معلومات الربط.
(6) يرسل المقبس المقابل في ServerSocket بيانات الصفحة إلى الوكيل.
2. البرمجة
من السهل جدًا تصميم عملية الاتصال المذكورة أعلاه باستخدام دلفي، والتي تتعلق بشكل أساسي بـ ServerSocket وClientSocket.
برمجة برامج التشغيل. فيما يلي قائمة بواجهة الخادم الوكيل التجريبية والبرنامج المصدر الذي كتبه المؤلف، بما في ذلك وصف مختصر للوظيفة:
الوحدة الرئيسية؛
واجهة
الاستخدامات
Windows، الرسائل، SysUtils، الفئات، الرسومات، عناصر التحكم، النماذج، مربعات الحوار،
ExtCtrls، ScktComp، TrayIcon، القوائم، StdCtrls؛
يكتب
session_record=record
المستخدمة: منطقية {ما إذا كان تسجيل الجلسة متاحًا}
SS_Handle: عدد صحيح {مقبض مأخذ توصيل الخادم الوكيل}
CSocket: TClientSocket {المقبس المستخدم للاتصال بجهاز التحكم عن بعد}
البحث: منطقي {سواء كنت تبحث عن الخادم}
وقت البحث: عدد صحيح {وقت خادم البحث}
الطلب: منطقي {ما إذا كان هناك طلب}
request_str: سلسلة {طلب كتلة البيانات}
Client_connected: منطقي {علامة العميل عبر الإنترنت}
Remote_connected: منطقي {علامة اتصال الخادم البعيد}
نهاية؛
يكتب
TForm1 = الفئة (TForm)
ServerSocket1: TServerSocket؛
ClientSocket1: TClientSocket;
Timer2: TTimer؛
TrayIcon1: TTrayIcon؛
PopupMenu1: TPopupMenu؛
N11: TMenuItem;
N21: TMenuItem;
N1: TMenuItem;
N01: TMenuItem;
مذكرة 1: مذكرة؛
تحرير 1: تحرير؛
التسمية 1: TLabel؛
Timer1: TTimer؛
الإجراء Timer2Timer(Sender: TObject);
الإجراء N11Click(Sender: TObject);
الإجراء FormCreate(Sender: TObject);
الإجراء FormClose(Sender: TObject; var Action: TCloseAction);
الإجراء N21Click(Sender: TObject);
الإجراء N01Click(Sender: TObject);
الإجراء ServerSocket1ClientConnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء ServerSocket1ClientDisconnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء ServerSocket1ClientError(Sender: TObject;
المقبس: TCustomWinSocket؛ ErrorEvent: TERrorEvent؛
varErrorCode: Integer);
الإجراء ServerSocket1ClientRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء ClientSocket1Connect(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء ClientSocket1Disconnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء ClientSocket1Error(Sender: TObject; المقبس: TCustomWinSocket;
ErrorEvent: TERrorEvent; var ErrorCode: Integer);
الإجراء ClientSocket1Write(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء ClientSocket1Read(Sender: TObject; المقبس: TCustomWinSocket);
الإجراء ServerSocket1Listen(Sender: TObject;
المقبس: TCustomWinSocket)؛
الإجراء AppException(Sender: TObject; E: Exception);
الإجراء Timer1Timer(Sender: TObject);
خاص
{تصريحات خاصة}
عام
Service_Enabled: منطقي {ما إذا كانت خدمة الوكيل ممكّنة}
الجلسة: مصفوفة سجل_الجلسة {مصفوفة الجلسة}؛
الجلسات: عدد صحيح {عدد الجلسات}
LookUpTimeOut: عدد صحيح {قيمة مهلة الاتصال}
الطلبات غير الصالحة: عدد صحيح {عدد الطلبات غير الصالحة}
نهاية؛
فار
Form1: TForm1؛
تطبيق
{$R *.DFM}
file://مؤقت بدء تشغيل النظام، بعد عرض نافذة بدء التشغيل، قم بالتقليص إلى علبة النظام...
الإجراء TForm1.Timer2Timer(Sender: TObject);
يبدأ
timer2.Enabled:=false;
الجلسات:=0 {عدد الجلسات=0}
application.OnException:= AppException {لحماية الاستثناءات التي تحدث على الخادم الوكيل}
طلبات غير صالحة:=0;
LookUpTimeOut:=60000 {قيمة المهلة = دقيقة واحدة}
timer1.Enabled:=true;
n11.Enabled:=false; {تمكين عنصر قائمة الخدمة غير صالح}
n21.Enabled:=true; {إغلاق عنصر قائمة الخدمة صالح}
serversocket1.Port:=988 {منفذ الخادم الوكيل = 988}
serversocket1.Active:=true {ابدأ الخدمة}
form1.hide {إخفاء الواجهة وتقليصها إلى علبة النظام}
نهاية؛
ملف://افتح عنصر قائمة الخدمة...
الإجراء TForm1.N11Click(Sender: TObject);
يبدأ
serversocket1.Active:=true {ابدأ الخدمة}
نهاية؛
ملف: // إيقاف عنصر قائمة الخدمة ...
الإجراء TForm1.N21Click(Sender: TObject);
يبدأ
serversocket1.Active:=false {إيقاف الخدمة}
N11.Enabled:=صحيح؛
N21.Enabled:=False;
Service_Enabled:=خطأ {تم مسح العلامة}
نهاية؛
ملف://إنشاء النافذة الرئيسية...
الإجراء TForm1.FormCreate(Sender: TObject);
يبدأ
Service_Enabled:=false;
timer2.Enabled:=true; {عند إنشاء النافذة، افتح المؤقت}
نهاية؛
الملف: // عندما تكون النافذة مغلقة ...
الإجراء TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
يبدأ
timer1.Enabled:=false;
إذا Service_Enabled ثم
serversocket1.Active:=false {أغلق الخدمة عند الخروج من البرنامج}
نهاية؛
الملف: زر الخروج من البرنامج...
الإجراء TForm1.N01Click(Sender: TObject);
يبدأ
form1.Close {الخروج من البرنامج}
نهاية؛
الملف://بعد تشغيل خدمة الوكيل...
الإجراء TForm1.ServerSocket1Listen(Sender: TObject;
المقبس: TCustomWinSocket)؛
يبدأ
Service_Enabled:=صحيح {تعيين علامة الخدمة}
N11.Enabled:=false;
N21.Enabled:=true;
نهاية؛
بعد اتصال الملف:// بالخادم الوكيل عن طريق الوكيل، يتم إنشاء جلسة وربطها بالمقبس...
الإجراء TForm1.ServerSocket1ClientConnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
أنا، ي: عدد صحيح؛
يبدأ
ي:=-1;
بالنسبة إلى i:=1 إلى الجلسات، {ابحث عما إذا كانت هناك عناصر فارغة}
إذا لم تكن الجلسة[i-1].مستخدمة وليست الجلسة[i-1].CSocket.active إذن
يبدأ
j:=i-1; {نعم، قم بتعيينه}
جلسة [ي]. المستخدمة: = صحيح {تعيين كما هو قيد الاستخدام}
استراحة؛
نهاية
آخر
إذا لم يكن جلسة [i-1].Used وجلسة [i-1].CSocket.active ثم
جلسة [i-1].CSocket.active:=false;
إذا ي=-1 ثم
ابدأ {لا شيء، أضف واحدًا}
ي:=جلسات;
المؤتمر الوطني العراقي(جلسات);
setlength(session,sessions);
جلسة [ي]. المستخدمة: = صحيح {تعيين كما هو قيد الاستخدام}
session[j].CSocket:=TClientSocket.Create(nil);
session[j].CSocket.OnConnect:=ClientSocket1Connect;
session[j].CSocket.OnDisconnect:=ClientSocket1Disconnect;
session[j].CSocket.OnError:=ClientSocket1Error;
session[j].CSocket.OnRead:=ClientSocket1Read;
session[j].CSocket.OnWrite:=ClientSocket1Write;
جلسة [ي].Lookingup:=false;
نهاية؛
session[j].SS_Handle:=socket.socketHandle; {احفظ المقبض وقم بتنفيذ الربط}
جلسة [ي]. الطلب: = خطأ {لا يوجد طلب}
جلسة [ي].client_connected:=صحيح {العميل متصل}
جلسة [ي].remote_connected:=false {بعيد غير متصل}
edit1.text:=inttostr(sessions);
نهاية؛
عندما يتم قطع اتصال الملف:// بواسطة الوكيل...
الإجراء TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
أنا، ي، ك: عدد صحيح؛
يبدأ
لأني:=1 للقيام بالجلسات
إذا (جلسة [i-1].SS_Handle=socket.SocketHandle) وجلسة [i-1].تستخدم بعد ذلك
يبدأ
جلسة [i-1].client_connected:=خطأ {العميل غير متصل}
إذا كانت الجلسة [i-1].remote_connected بعد ذلك
session[i-1].CSocket.active:=false {إذا كان الاتصال عن بعد لا يزال متصلاً، فافصله}
آخر
session[i-1].Used:=false; {إذا تم قطع الاتصال، قم بتعيين علامة مورد الإصدار}
استراحة؛
نهاية؛
ي:=جلسات;
ك:=0;
for i:=1 to j do {هناك عدة عناصر غير مستخدمة في نهاية مصفوفة جلسة الإحصائيات}
يبدأ
إذا كانت الجلسة [جي].تستخدم بعد ذلك
استراحة؛
المؤتمر الوطني العراقي (ك)؛
نهاية؛
إذا كان k>0 ثم {تصحيح مصفوفة الجلسة وتحرير العناصر غير المستخدمة في النهاية}
يبدأ
الجلسات:=sessions-k;
setlength(session,sessions);
نهاية؛
edit1.text:=inttostr(sessions);
نهاية؛
عند حدوث خطأ في الاتصال بالملف://...
الإجراء TForm1.ServerSocket1ClientError(Sender: TObject;
المقبس: TCustomWinSocket؛ ErrorEvent: TERrorEvent؛
varErrorCode: Integer);
فار
أنا، ي، ك: عدد صحيح؛
يبدأ
لأني:=1 للقيام بالجلسات
إذا (جلسة [i-1].SS_Handle=socket.SocketHandle) وجلسة [i-1].تستخدم بعد ذلك
يبدأ
جلسة [i-1].client_connected:=خطأ {العميل غير متصل}
إذا كانت الجلسة [i-1].remote_connected بعد ذلك
session[i-1].CSocket.active:=false {إذا كان الاتصال عن بعد لا يزال متصلاً، فافصله}
آخر
session[i-1].Used:=false; {إذا تم قطع الاتصال، قم بتعيين علامة مورد الإصدار}
استراحة؛
نهاية؛
ي:=جلسات;
ك:=0;
لأني:=1 إلى j افعل
يبدأ
إذا كانت الجلسة [جي].تستخدم بعد ذلك
استراحة؛
المؤتمر الوطني العراقي (ك)؛
نهاية؛
إذا ك> 0 ثم
يبدأ
الجلسات:=sessions-k;
setlength(session,sessions);
نهاية؛
edit1.text:=inttostr(sessions);
رمز الخطأ:=0;
نهاية؛
عندما يتم إرسال الملف:// بواسطة الوكيل لطلب الصفحة...
الإجراء TForm1.ServerSocket1ClientRead(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
تمب، خط، المضيف: سلسلة؛
أنا، ي، المنفذ: عدد صحيح؛
يبدأ
بالنسبة إلى i:=1 إلى الجلسات، {حدد أي جلسة هي}
إذا كانت الجلسة [i-1].Used و (session[i-1].SS_Handle=socket.sockethandle) إذن
يبدأ
جلسة [i-1].request_str:=socket.ReceiveText؛ {حفظ بيانات الطلب}
tmp:=session[i-1].request_str;
memo1.lines.add(tmp);
j:=pos(char(13)+char(10),tmp {علامة سطر واحد});
بينما يقوم j>0 بإجراء {مسح نص الطلب سطرًا تلو الآخر، بحثًا عن عنوان المضيف}
يبدأ
السطر:=نسخ(tmp,1,j-1);
حذف(tmp,1,j+1);
j:=pos('Host',line {علامة عنوان المضيف});
إذا j>0 ثم
يبدأ
حذف (السطر، 1، ي+5)؛ {حذف الحرف السابق غير الصالح}
j:=pos(':',line);
إذا j>0 ثم
يبدأ
المضيف:=نسخ(السطر,1,j-1);
حذف (السطر، 1، ي)؛
يحاول
المنفذ:=strtoint(line);
يستثني
المنفذ:=80;
نهاية؛
نهاية
آخر
يبدأ
المضيف: = تقليم (خط)؛ {الحصول على عنوان المضيف}
المنفذ:=80;
نهاية؛
إذا لم تكن الجلسة [i-1].remote_connected، فحينئذٍ {إذا لم تكن البعثة متصلة بعد}
يبدأ
جلسة [i-1].Request:=true {تعيين علامة جاهزة لبيانات الطلب}
جلسة[i-1].CSocket.host:=host; {تعيين عنوان المضيف البعيد}
جلسة [i-1].CSocket.port:=port {مجموعة المنفذ}
جلسة[i-1].CSocket.active:=true; {الاتصال بالمضيف البعيد}
جلسة [i-1].Lookingup:=true {set flag}
جلسة[i-1].LookupTime:=0 {يبدأ العد من 0}
نهاية
آخر
{إذا كان الريموت متصلاً أرسل الطلب مباشرة}
session[i-1].CSocket.socket.sendtext(session[i-1].request_str);
استراحة {إيقاف نص طلب المسح}
نهاية؛
j:=pos(char(13)+char(10),tmp);
نهاية؛
استراحة {حلقة التوقف}
نهاية؛
نهاية؛
file://عندما ينجح الاتصال بالمضيف البعيد...
الإجراء TForm1.ClientSocket1Connect(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
ط: عدد صحيح؛
يبدأ
لأني:=1 للقيام بالجلسات
إذا (جلسة [i-1].CSocket.socket.sockethandle=socket.SocketHandle) وجلسة[i-1].تستخدم بعد ذلك
يبدأ
session[i-1].CSocket.tag:=socket.SocketHandle;
session[i-1].remote_connected:=true {قم بتعيين علامة اتصال المضيف البعيد}
جلسة [i-1].Lookingup:=خطأ {مسح العلم}
استراحة؛
نهاية؛
نهاية؛
الملف: // عند قطع اتصال المضيف البعيد ...
الإجراء TForm1.ClientSocket1Disconnect(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
أنا، ي، ك: عدد صحيح؛
يبدأ
لأني:=1 للقيام بالجلسات
إذا (جلسة [i-1].CSocket.tag=socket.SocketHandle) وجلسة[i-1].تستخدم بعد ذلك
يبدأ
جلسة [i-1].remote_connected:=false {تعيين على غير متصل}
إذا لم تكن الجلسة [i-1].client_connected إذن
جلسة [i-1].Used:=false {إذا تم قطع اتصال العميل، قم بتعيين علامة مورد الإصدار}
آخر
لـ k:=1 إلى serversocket1.Socket.ActiveConnections
إذا (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) وجلسة[i-1].تستخدم بعد ذلك
يبدأ
serversocket1.Socket.Connections[k-1].Close;
استراحة؛
نهاية؛
استراحة؛
نهاية؛
ي:=جلسات;
ك:=0;
لأني:=1 إلى j افعل
يبدأ
إذا كانت الجلسة [جي].تستخدم بعد ذلك
استراحة؛
المؤتمر الوطني العراقي (ك)؛
نهاية؛
إذا كان k>0 ثم {إصلاح صفيف الجلسة}
يبدأ
الجلسات:=sessions-k;
setlength(session,sessions);
نهاية؛
edit1.text:=inttostr(sessions);
نهاية؛
file://عند حدوث خطأ في الاتصال بالمضيف البعيد...
الإجراء TForm1.ClientSocket1Error(Sender: TObject;
المقبس: TCustomWinSocket؛ ErrorEvent: TERrorEvent؛
varErrorCode: Integer);
فار
أنا، ي، ك: عدد صحيح؛
يبدأ
لأني:=1 للقيام بالجلسات
إذا (جلسة [i-1].CSocket.tag=socket.SocketHandle) وجلسة[i-1].تستخدم بعد ذلك
يبدأ
المقبس. إغلاق;
جلسة [i-1].remote_connected:=false {تعيين على غير متصل}
إذا لم تكن الجلسة [i-1].client_connected إذن
جلسة [i-1].Used:=false {إذا تم قطع اتصال العميل، قم بتعيين علامة مورد الإصدار}
آخر
لـ k:=1 إلى serversocket1.Socket.ActiveConnections
إذا (serversocket1.Socket.Connections[k-1].SocketHandle=session[i-1].SS_Handle) وجلسة[i-1].تستخدم بعد ذلك
يبدأ
serversocket1.Socket.Connections[k-1].Close;
استراحة؛
نهاية؛
استراحة؛
نهاية؛
ي:=جلسات;
ك:=0;
لأني:=1 إلى j افعل
يبدأ
إذا كانت الجلسة [جي].تستخدم بعد ذلك
استراحة؛
المؤتمر الوطني العراقي (ك)؛
نهاية؛
رمز الخطأ:=0;
إذا كان k>0 ثم {إصلاح صفيف الجلسة}
يبدأ
الجلسات:=sessions-k;
setlength(session,sessions);
نهاية؛
edit1.text:=inttostr(sessions);
نهاية؛
الملف: // يرسل طلب صفحة إلى المضيف البعيد ...
الإجراء TForm1.ClientSocket1Write(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
ط: عدد صحيح؛
يبدأ
لأني:=1 للقيام بالجلسات
إذا (جلسة [i-1].CSocket.tag=socket.SocketHandle) وجلسة[i-1].تستخدم بعد ذلك
يبدأ
إذا كانت الجلسة [i-1].اطلب بعد ذلك
يبدأ
المقبس.SendText(session[i-1].request_str);
جلسة [i-1].الطلب:=خطأ {مسح العلم}
نهاية؛
استراحة؛
نهاية؛
نهاية؛
file://عندما يرسل المضيف البعيد بيانات الصفحة...
الإجراء TForm1.ClientSocket1Read(Sender: TObject;
المقبس: TCustomWinSocket)؛
فار
أنا، ي: عدد صحيح؛
rec_bytes: عدد صحيح {طول كتلة البيانات التي تم إرجاعها}
rec_Buffer: صفيف [0..2047] من char {تم إرجاع المخزن المؤقت لكتلة البيانات}
يبدأ
لأني:=1 للقيام بالجلسات
إذا (جلسة [i-1].CSocket.tag=socket.SocketHandle) وجلسة[i-1].تستخدم بعد ذلك
يبدأ
rec_bytes:=socket.ReceiveBuf(rec_buffer,2048);
لـ j:=1 إلى serversocket1.Socket.ActiveConnections
إذا serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle ثم
يبدأ
serversocket1.Socket.Connections[j-1].SendBuf(rec_buffer,rec_bytes);
استراحة؛
نهاية؛
استراحة؛
نهاية؛
نهاية؛
file:// "لم يتم العثور على الصفحة" وتظهر رسائل خطأ أخرى...
الإجراء TForm1.AppException(Sender: TObject; E: Exception);
يبدأ
inc(طلبات غير صالحة);
نهاية؛
الملف: // البحث عن توقيت المضيف البعيد ...
الإجراء TForm1.Timer1Timer(Sender: TObject);
فار
أنا، ي: عدد صحيح؛
يبدأ
لأني:=1 للقيام بالجلسات
إذا كانت الجلسة [i-1].مستخدمة والجلسة[i-1].البحث ثم {إذا كان الاتصال}
يبدأ
inc(session[i-1].LookupTime);
إذا كانت الجلسة [i-1].LookupTime> lookuptimeout ثم {if timeout}
يبدأ
جلسة [i-1].Lookingup:=false;
جلسة [i-1].CSocket.active:=خطأ {توقف عن البحث}
لـ j:=1 إلى serversocket1.Socket.ActiveConnections
إذا serversocket1.Socket.Connections[j-1].SocketHandle=session[i-1].SS_Handle ثم
يبدأ
serversocket1.Socket.Connections[j-1].Close;
استراحة؛
نهاية؛
نهاية؛
نهاية؛
نهاية؛
نهاية.
3. حاشية
نظرًا لأن فكرة التصميم هذه تضيف فقط وظيفة إعادة التوجيه بين الوكيل والمضيف البعيد، فهي الأصلية
يتم الاحتفاظ ببعض الميزات مثل تقنية التخزين المؤقت، وبالتالي تكون الكفاءة أعلى. بعد الاختبار، عند استخدام مودم 33.6 كيلو بايت للوصول إلى الإنترنت، يمكن لثلاث إلى عشر محطات عمل وكيل الوصول إلى الإنترنت في نفس الوقت، ولا تزال هناك سرعة استجابة جيدة. نظرًا لأن الاتصال بين محطة عمل الوكيل ومحطة عمل الخادم الوكيل يمر بشكل عام عبر رابط عالي السرعة، فإن عنق الزجاجة يحدث بشكل أساسي في طريقة الوصول إلى الإنترنت الخاصة بالخادم الوكيل.
من خلال الطريقة المذكورة أعلاه، نجح المؤلف في تطوير مجموعة كاملة من برامج الخادم الوكيل ودمجها بالكامل مع نظام فوترة غرفة الكمبيوتر.
بنجاح، من الممكن استخدام محطة عمل واحدة لإكمال وظائف مثل وكيل الإنترنت، وفواتير الإنترنت، وفواتير استخدام الجهاز. يمكن للأصدقاء ذوي الخبرة في البرمجة إضافة وظائف إضافية للخادم الوكيل، مثل إعداد مواقع الوصول المحظورة، وحساب حركة مرور العملاء، وقوائم الوصول إلى الويب، وما إلى ذلك.