17-09-12, 10:10 PM
الدرس الثالث :
مشروع نقل الملفات
من المعروف أن إرسال ملف حجمه 30 بايت أو 90 بايت هي عملية سريعة إذ تكون في نطاق قدرة الوينسوك على الإرسال ، ولكن ماذا نفعل إذا كان حجم الملف 1 ميغا بايت
( 1024 بايت ) ... هنا نصاب بالملل .
الحل هو تقسيم الملف وإرسال كل جزء منه على حدة ، وتجميعها في ملف واحد في جهاز الخادم ، هذا بإختصار . أما العمليات التي تتم أثناء الإرسال فهي كالتالي :
فتح الملف بصيغة ثنائية Binary :
تتم عملية فتح الملف بهذه الصيغة بثلاث خطوات وهي :
إقتباس : تعريف متغير جديد.
إعطائه القيمة FreeFile .
فتح الملف على هيئة المتغير بصيغة Binary .
وتكون كالتالي :
إقتباس :Dim F
F = FreeFile
Open "File" for Binary as F
حيث إن ( File ) هو إمتداد الملف .
قراءة جزء معين من الملف :
تتم عملية فتح الملف بهذه الصيغة بثلاث خطوات وهي :
إقتباس : تعريف متغير جديد.
قراءة جزء معين منه Space .
حفظ البيانات بداخله Get .
PHP كود :
Dim C
C = Space (2048)
Get # F,, C
حساب عدد ال Bytes :
تتم عملية فتح الملف بهذه الصيغة بخطوتين :
اقتباس: تعريف متغير جديد.
حساب الحجم Lof .
PHP كود :
Dim A
A = Lof (F)
الكتابة على الملف Put :
PHP كود :
Put #F, , Data
خطوات إرسال ملف :
إقتباس : • برمجة إجراء ( Sub ) يحتوي على خوارزميات التقسيم والإرسال ..
• إرسال الملف من العميل .
• إستقبال أجزاء الملف في الخادم .
• كتابة المعلومات على الملف
هذا بإختصار ،،،،،، تابع الشرح لتعرف أكثر :
سأقوم بشرح إرسال ملف صغير الحجم ، ( في الغالب 10 كيلو بايت ، إن كان أكثر فلا يعمل الملف بعد الإرسال وذلك لأن الكود البرمجي ضعيف جداً في الإرسال ، ) وأنتظر منكم تطوير أنفسكم للأحسن .
العميل :
الأدوات :
- الوينسوك
- تايمر عدد 2 (الأول لتبيين حالة الوينسوك ، والثاني للإرسال Interval = 3000 )
- 3 صندوق نص ( الأول للمنفذ ، والبقية لإمتداد وإسم الملف ) .
- أداة CommonDialog .
- 2 زر كوماند ( الأول لفتح الملف ، والآخر للإرسال ) .
نضبط الخاصية Index للوينسوك ونجعلها = 0 ( وذلك لإنشاء مصفوفة وينسوك )
والخاصية Enabled للتايمر ونجعلها = False .
النص البرمجي :
في قسم التصريحات العامة ، نعرف الإجراء SendFile .
PHP كود :
Sub SendFile (Index as Integer)
Dim wsdt as String
f = FreeFile
Open Text2.Text for Binary as f
Wsdt = Space (LOF (f))
Get f,, wsdt
Close f
Winsock1 (Index).SendData "Rec" & wsdt
End Sub
في زر الأمر ( فتح الملف )
PHP كود :
On Error Resume Next
CommonDialog1.ShowOpen
Text2.Text = CommonDialog1.FileName
Text3.Text = CommonDialog1.FileTitle
ملاحظة ( عند كتابة أكواد الإتصال في برنامج العميل _ يجب كتابة المقطع Index بداخل أقواس ( index ) بعد كلمة Winsock لأنه تم إنشاء مصفوفة )
مثال :
PHP كود :
Winsock1 (index).listen
في التايمر ( 2 )
PHP كود :
On Error Resume Next
SendFile (Index)
Timer2.Enabled = False
في زر الأمر ( إرسال ) :
PHP كود :
On Error Resume Next
Winsock1 (Index).SendData "SSS" & Text3.Text
Timer2.Enabled = True
يقوم هذا المقطع بإرسال إسم الملف FileTitle الموجود في Text3 . ويقوم بتغيير الخاصية Enabled للتايمر لكي يقوم ب إرسال الملف بعد 3 ثواني .
الخادم :
الأدوات :
- أداة الوينسوك .
- تايمر .
- 3 صناديق نص ( الأول لعنوان الأي بي ، والثاني للمنفذ و الثالث لإستلام إسم الملف).
النص البرمجي :
في قسم التصريحات العامة :
PHP كود :
Dim F as Integer
في حدث الوينسوك Data Arrival :
PHP كود :
Dim Dat as String
Winsock1.GetData Dat
If Left (Dat, 3) = "SSS" Then
Dat = Right (Dat, Len (Dat) – 3)
Text3.Text = Dat
End If
F = FreeFile
Open App.Path & "\" & Text3.Text for Binary as F
''''''
If Left (Dat, 3) = "Rec" Then
Dat = Right (Dat, Len (Dat) – 3)
Put F,, Dat
Close F
MsgBox "Transfer Completed"
Exit Sub
End If
وبالنسبة للتقسيم ( راجع الدرس السابق ) .
تم بحمد الله .
متغيب

