السلام عليكم ،
اريد عمل برنامج بالسي# يبحث عن ملف معين داخل شبكة محلية ، يعني على جميع الحاسبات المرتبطة بالشبكة (بموافقة بقيت الحاسبات طبعا).
هل هناك من لديه فكرة؟
صراحة ليس لدي تصور كيف من الممكن عمل شيء مثل هذا،
ياريت لو واحد يضعني على اول الطريق
السلام عليكم ،
اريد عمل برنامج بالسي# يبحث عن ملف معين داخل شبكة محلية ، يعني على جميع الحاسبات المرتبطة بالشبكة (بموافقة بقيت الحاسبات طبعا).
هل هناك من لديه فكرة؟
صراحة ليس لدي تصور كيف من الممكن عمل شيء مثل هذا،
ياريت لو واحد يضعني على اول الطريق
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
وعليك السلام اخي الاخير زمانه
الفكرة اجمالا ممكنة التطبيق بكل سهولة إن شاء الله
ستحتاج إلى اداة أو دالة ما للبحث عن ملف ما داخل الجهاز وإرجاع النتيجة كـ Array string عن مسار الملف المحدد
مثال ذلك: http://www.c-sharpcorner.com/UploadFile/bejoynair/FindFilesinCS12052005042702AM/FindFilesinCS.aspx
ثم ستحتاج إلى تنفيذ هذه الدالة على الجهاز عن بعد من خلال تقنية Remoting (راجع المواضيع المثبتة)
ايضا ستحتاج إلى وجود سيرفر مركزي لتسجيل الكلينت من على الشبكة حيث يمكن وضعهم في Array List للبحث في جهاز تلو الآخر وارجاع النتيجة النهائية إلى الجهاز الذي طلب تنفيذ الدالة
ابدأ بتنفيذ هذه الخطوات وفي حالة صعب عليك اي جزئية بإمكانك السؤال عنها هنا بكتابة محاولتك في حلها
مع تمنياتي لك بالتوفيق
فادي عبدالقادر كتب:وعليك السلام اخي الاخير زمانه
الفكرة اجمالا ممكنة التطبيق بكل سهولة إن شاء الله
ستحتاج إلى اداة أو دالة ما للبحث عن ملف ما داخل الجهاز وإرجاع النتيجة كـ Array string عن مسار الملف المحدد
مثال ذلك: http://www.c-sharpco...dFilesinCS.aspx
ثم ستحتاج إلى تنفيذ هذه الدالة على الجهاز عن بعد من خلال تقنية Remoting (راجع المواضيع المثبتة)
ايضا ستحتاج إلى وجود سيرفر مركزي لتسجيل الكلينت من على الشبكة حيث يمكن وضعهم في Array List للبحث في جهاز تلو الآخر وارجاع النتيجة النهائية إلى الجهاز الذي طلب تنفيذ الدالة
ابدأ بتنفيذ هذه الخطوات وفي حالة صعب عليك اي جزئية بإمكانك السؤال عنها هنا بكتابة محاولتك في حلها
مع تمنياتي لك بالتوفيق
الله يبارك فيك اخي فادي و شكرا على التوجيه،
سأبحث في الامر حسب الخطوات التي ذكرت واذا في مشكل اكيد راح اضعه هنا!
شكرا جزيلا
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
السلام عليكم ،
قرأت في موضوع ال Remoting ، تقريبا افتهمت الفكرة بأبسط صورها (لكن للأن لم اطبق الامر عمليا)
لكن الان انا مثلا لو لدي دالة البحث عن فايل معين و الموجودة في ال Remote class proxy
هذه الدالة مثلا ستعيد لي ال path للملف الذي ابحث عنه اذا كان موجود ،
الان كيف من الممكن ان انسخ هذا الملف الى حاسبتي؟
يعني بعد ان اجد الملف ، كيف من الممكن ان انقل هذا الملف برمجيا؟
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
بكل بساطة إن شاء الله
بإمكانك كتابة دالة بالـ Remoting تمرر فيها باث الملف الذي تريده ثم يتم تطبيق هذه الدالة على الكلينت وإرجاعه كـ Byte Array إلى الجهاز صاحب الـ Request من خلال FileStream Class وكما يلي كمثال:
public byte[] GetTheFile(string FilePath)
{
// To Read The File and return it as bytes
FileStream fs = new FileStream(FilePath, FileMode.Open);
byte[] buffer = new byte[fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); return buffer;
}ثم بإمكانك تحويل البايت إلى ملف مرة اخرى باستخدام نفس الطريقة لكن بالعكس (راجع فصل الـ Streaming الفصل الخامس لمزيد من المعلومات حول هذا الموضوع)
مع تمنياتي لك بالتوفيق
الله يجزيك خير اخ فادي.
و أكيد كتابك النسخة الكاملة هي واحدة من اهم المصادر التي أقرء بها.
(للأسف لدينا لا توجد نسخة ورقية من كتابك، ولذا هناك من اضطر لشرائها من سوريا ، الان جزاك الله خيرا قمت بنشر النسخة كاملة على النت)
شكرا جزيلا ،، وربما سأحتاجك اذا صعب علي جزء في البرنامج.
جزاك الله خيرا
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
السلام عليكم ،
اخ فادي قمت بتطبيق مثال بسيط على تقنية ال remoting
دالة تقوم بأرجاع الملفات في مسار معين
public class MySearch:MarshalByRefObject
{
public string[] GetAllFiles(string path)
{
return Directory.GetFiles(path);
}
}وبعد ان تكون ملف ال dll ، قمت بكتابة الجزء الخاص بالسيرفر
لكن تواجهني مشكلة اثناء تنفيذ السيرفر كما في الصورة:
جزاك الله خيرا ، كتابك افادني جدا ، لقد اتبعت خطوات مثالك في التنفيذ
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
اهلا بك اخي العزيز
فقط ملاحظة سريعة:
1- يجب التأكد من تسمية النيم سبيس الخاص بالكلاس بنفس اسم الكلاس كذلك اسم الملف Dll File الذي يحتوي الكلاس جميعهم بأسم MySearch (وافضل عدم وجود نيم سبيس للكلاس)
2- يجب نسخ ملف Dll بجانب ملف الـ EXE لسيرفر أي في مجلد الـ Debug
موفق إن شاء الله
تم تعديل هذه المشاركة بواسطة فادي عبدالقادر في 27 فبراير 2010 في 00:04
الله يبارك فيك اخ فادي ،
فعلا كان لدي اسم النيم سبيس لا يساوي اسم الكلاس.
قمت بحذف النيم سبيس اساسا والان تنفذ البرنامج.
بقي فقط ان اجرب البرنامج على شبكة فعلية.
لكي انتقل الى الخطوة الثانية وهي نقل ملف من حاسبة الى اخرى.
شكري و امتناني
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
السلام عليكم ،،،
لدي مشكلة في كيفية الحصول على ال IP ،
يعني في السيرفر بعد ان يتم البحث عن فايل معين ، اذا موجود يتم ارساله الى ال client ،
سأقوم بفتح اتصال مثلا ب TcpClient لكي اقوم من خلاله بأرسال الملف، لكن كيف هنا سأحصل على ال ip الخاص ب client الذي طلب البحث؟
هنا في ال remoting لكن يكون لدي مثلا RemoteEndPoint
تم تعديل هذه المشاركة بواسطة الاخير زمانه في 28 فبراير 2010 في 05:38
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
لا مشكلة إن شاء الله
يمكن أن تكون الدالة التي يتم مناداتها من خلال الجهاز الذي يريد البحث عن ملف ما بالشكل التالي كمثال:
ArrayList SearchOnAFileOnAllClients(string FileName)
{
string[] ClientsArray = GetClientsIPs();
ArrayList result = new ArrayList();
foreach (string IP in ClientsArray)
{
result.Add(IP +"#"+ SearchOnFile(IP));
}
return result;
}في هذه الحالة يتم اولا جلب جميع العناوين للأجهزة المسجلة على السيرفر والموجودة على شكل Array of string ويتم تنفيذ دالة البحث في جملة تكرار ويرجع في كل مرة موقع الملف ونضعه في ArrayList اخرى وهي في المثال result مع IP الجهاز الذي تم البحث فيه ويفصل بين الـ Path والـ IP بفاصل وهو اشارة # حيث ترجع إلى الجهاز طالب البحث ArrayList بالشكل التالي كمثال
192.168.1.1#C:\MyFile.JPEG
ثم لتحميل الملف من الجهاز الذي تختاره نقوم بفصل الـ IP عن الـPath باستخدام طريقة string المعروفة من خلال الرمز الفاصل ونرسله إلى دالة تحميل الملف...
بالتوفيق
اولا اشكرك اخ فادي ، الله يبارك بعلمك و وقتك.
اتمنى ان ترى خطواتي هل هي صحيحة ام لا ،
انا الان عملت البرنامج على انه الملفات موجودة على حاسبة مركزية واحدة ، و جميع ال clients تبحث داخلها.
اولا كونت library للبحث
public class Search:MarshalByRefObject
{
public string[] GetAllFiles(string path)
{
return Directory.GetFiles(path);
}
}ثم ربطها مع برنامج ال server
private void button1_Click(object sender, EventArgs e)
{
ChannelServices.RegisterChannel(new TcpChannel(6600));
RemotingConfiguration.RegisterWellKnownServiceType(
Type.GetType("Search,Search"), "MySearchServer", WellKnownObjectMode.SingleCall);
}هذا الجزء و ضعته على حاسبة السيرفر ،،
اما الجزء الخاص بحاسبة ال client
public partial class Form1 : Form
{
Search obj;
TcpChannel chan;
string URI;
public Form1()
{
InitializeComponent();
URI = "Tcp://" + txtIP.Text + ":6600/MySearchServer";
chan = new TcpChannel();
ChannelServices.RegisterChannel(chan);
obj = (Search)Activator.GetObject(typeof(Search),
URI);
}
private void btnGetFiles_Click(object sender, EventArgs e)
{
URI = "Tcp://" + txtIP.Text + ":6600/MySearchServer";
foreach( string st in obj.GetAllFiles(textBox1.Text))
listBox1.Items.Add(st);
}هل هذه الخطوات صحيحة؟
الان في دالة البحث الموجودة في ال library ،،
لو كنت ابحث عن ملف معين و وجدته ، كيف من الممكن ان اعيده كاملا (وليس فقط المسار) الى ال client ،
اقصد هنا كيفية الحصول على ال ip الخاص ب client الذي قام بعملية البحث.
اقتباسثم لتحميل الملف من الجهاز الذي تختاره نقوم بفصل الـ IP عن الـPath باستخدام طريقة string المعروفة من خلال الرمز الفاصل ونرسله إلى دالة تحميل الملف...
اظنني فهمت ،
يعني اجعل ال client هو الذي يبدء بالاتصال بما اني اعرف رقم ال ip للسيرفر مسبقا ، وعلى جهة السيرفر سأحتاج فقط ال port ،،
انا كنت مفكر انو السيرفر هو من سيبدء الاتصال ، لذا قلت من اين احصل على ال ip.
هل كلامي مضبوط؟
تم تعديل هذه المشاركة بواسطة الاخير زمانه في 28 فبراير 2010 في 22:15
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ
اقتباسانا الان عملت البرنامج على انه الملفات موجودة على حاسبة مركزية واحدة ، و جميع ال clients تبحث داخلها
حسنا ما فهمته في البداية مختلف عن ما تريده هنا :) لكن ما تريده هنا ابسط بكثير ..
في الحالة الأولى: الذي يملك الملف هو جهاز أو اكثر موجود على الشبكة مرتبط بسيرفر لتسجيل ذلك الكلينت لديه حتى يتم البحث وفقا للـIP الذي تم تسجيله والجهاز الذي يريد الملف ينادي دالة SearchOnAllClients السابقة من على السيرفر وهذه الدالة تنادي دالة اخرى تنفذ على الكلينت الذي يملك الملف بمناداتها من خلال السيرفر ثم ترجع عنوان الملف ونربطه مع الأي بي ويرجع إلى الجهاز الذي يريد الملف حيث يحدد من اي كلينت يريد الملف ويقوم بطلب الملف مباشرة بالإتصال مع الجهاز صاحب الملف من خلال Remoting حيث تطبق عليه دالة GetFile وليس لديك اي مشكلة هنا في الـIP لأنه سيتم ارساله مع باث الملف إلى الجهاز الذي طلب عملية البحث ...
في الحالة الثانية: انت تقول ان الجهاز الذي يملك الملف هو جهاز السيرفر وهو معروف لديك مسبقا وبالتالي كل ما تحتاجه منه هو موقع الملف عليه لتقوم بطلبه وفي هذه الحالة تنفذ دالتين الأولى ترجع لك الباث وفي الثانية ترسل الباث مع دالة GetFile ليتم قراءته على Buffer في السيرفر ثم إرجاعه إلى الكلينت كـResult وبالتالي انت لا تحتاج إلى عنوان الكلينت اساسا لأن العملية ستكون طلب دالة وارجاع Result وهي مبدأ الـRemoting...
موفق إن شاء الله
تم تعديل هذه المشاركة بواسطة فادي عبدالقادر في 28 فبراير 2010 في 23:05
تمام اخي فادي السؤال في الاساس كان كما طرحته اول الامر ، لكن انا بدأت بالتنفيذ بالامر الاسهل يعني افترضت ان الملفات على حاسبة مركزية واحدة ، كصورة مبسطة ،
ثم اذا نجح الامر بيدي انتقل الى الخطوة الثانية وهي البحث في كل ال clients .
يعني سأحتاج الحالتين.
اكرر شكري ، وانا انفذ الامر ، واذا واجهني مشكل سأضعه هنا.
الله يبارك فيك
اني وان كنت الاخير زمانه ---- لأتِ بما لم تستطعه الاوائلُ