PDA

View Full Version : سوال: آموزش مدیریت ارسال و دریافت اطلاعات در محیط شبکه (Server / Client)



ali190
جمعه 25 آذر 1390, 10:28 صبح
باسلام و عرض خسته نباشید خدمت همه عزیزان
بعد از کلی جستجو ونرسیدن به یک راه حل قطعی در زمینه یک روش امن برای به اشتراک گذاشتن فایلها در محیط شبکه تصمیم گرفتم این تایپیک رو ایجاد کنم و از تجربیات دوستان در این زمینه استفاده کنم.
من در حال نوشتن برنامه ای هستم که این برنامه قراره در محیط شبکه یک شرکت با 20 یوزر اجرا بشه (Workgroup) .
در این برنامه که عملکردی مشابه با نرم افزار اتوماسیون اداری داره کاربران ابتدا در برنامه ثبت نام میشوند.
بعد از ورود کاربران به برنامه با توجه به دسترسی که به هر کاربر داده شده (دسترسی ها در یک جدول در دیتابیس تعریف شده) میتوانند به برنامه فایل اضافه کنند ، فایل ویرایش کنند و فایل رو حدف کنند.
همچنین با توجه به همون دسترسی هایی که خدمتتون گفتم کاربران دیگه باید بتونن از این فایل ها که توسط سایرین افزوده شده استفاده کنند.
فرض کنیم قراره در این برنامه از فایلهایی با حجم بالا استفاده بشه (مثلاً 1.5 گیگ)
در اکثر تایپیکهایی که در این زمینه ایجاد شده بود متاسفانه یا فقط از روشها نام برده شده بود و یا مباحث نصفه و نیمه رها شده بود.
از دوستان خواهشمندم برای رفع ابهام از این موضوع در این تایپیک مشارکت کنند.
ممنون
یاعلی

ASKaffash
شنبه 26 آذر 1390, 07:05 صبح
سلام
برای شروع بحث لازم است اعلام کنید که کدام روش را میخواهید بکار برید :
1- فایل را به درون بانک اطلاعاتی منتقل کنید و از طریق SQLServer خدمات ارائه گردد
2- فایل را در شبکه در مسیر Share قرار داده و مدیریت فایل توسط برنامه شما انجام گردد
3- فایل را در یک سرور بدون Share کردن و از طریق یک سرویس و ارتباط برنامه شده با سرویس مدیریت کنید
لطفا یکی را انتخاب کنید چون موضوع وسیع و پیچیده خواهد شد

ali190
شنبه 26 آذر 1390, 19:12 عصر
سلام جناب کفاش عزیز

1- فایل را به درون بانک اطلاعاتی منتقل کنید و از طریق SQLServer خدمات ارائه گردددر مورد روش اول اگر لطف کنید و کدهای مربوط به آپلود و دانلود فایل در جدول SQL server رو در اختیارم قرار بدید ازتون تشکر میکنم
این کدها رو در vb6 یکبار در اختیارم گذاشتید ولی گمون میکنم اون کدها دیگه در vb.net کاربردی نداشته باشه
ممنون میشم این کدها رو با معماری net. در اختیارم بذارید


2- فایل را در شبکه در مسیر Share قرار داده و مدیریت فایل توسط برنامه شما انجام گردد
در مورد روش دوم دقیقاً متوجه منظورتون نشدم
منظورتون همون روش File Sharing هست؟


3- فایل را در یک سرور بدون Share کردن و از طریق یک سرویس و ارتباط برنامه شده با سرویس مدیریت کنید
اما در مورد روش سوم فکر کنم به دنبال این روش هستم که بشه در برنامه از یک سرویس دهنده استفاده کرد

اما یک نکته :
فرض کنید که فرمی داریم که در این فرم یک گرید هست که آدرس تعدادی عکس در آن ذخیره شده ، میخواهیم زمانیکه بر روی هر کدام از ردیفها کلیک کنیم تصویر مربوطه در یک picture box نمایان شود ، یا مثلاً این آدرسها احتمال داره برای یک سری فایل تصویری باشد که میخواهیم با کلیک بر رو هر کدام از ردیفها فیلم مورد نظر در Player نمایش داده شود
آیا استفاده از روش سوم میتواند پاسخگوی این عملیات باشد؟
جناب کفاش عزیز باز هم از شما به خاطر قبول زحمت در این آموزش تشکر میکنم
ممنون
یاعلی

alimanam
یک شنبه 27 آذر 1390, 13:19 عصر
با سلام

" نقل قول: مدیریت و امنیت فایلها در شبکه " خوب این عنوان تاپیک هستش ! دو مقوله خیلی وسیع ! در مورد امنیت فایل ها میشه این رو گفت که از دو بخش مجزا تشکیل میشه مثال میزنم که بهتر متوجه بشین . ببین مثلا شما 1 فایل تصویری دارین , خوب میشه برای دسترسی به این فایل تصویری از روش محدودیت در دسترسی برای کاربران قائل بشین یعنی هر کاربری که مجوز دسترسی به این گونه فایل ها رو داشت بتونه ببینه یا ویرایش کنه یا ... و روش دوم اینه که شما در عین حالی که چک میکنی کاربر مجوز دسترسی داره بیای این فایل رو Encryp هم بکنی ! یعنی فایل کد میشه و به فرض اگه کسی هم دسترسی غیر مجاز داشت و به طریقی تونست دسترسی به فایل پیدا کرد نتونه اون رو حداقل ببینه یا ویرایش کنه ! البته روش های امنیتی بیشتری هم میشه ایجاد کرد .

موفق باشید ./

ali190
یک شنبه 27 آذر 1390, 14:34 عصر
باسلام
علي جان ممنون از توضيحاتت
چطور ميتونم روش سوم رو در VB.NET اجرايي كنم؟
ممنون
ياعلي

alimanam
یک شنبه 27 آذر 1390, 14:49 عصر
باتوجه به اینکه میفرمائین که حجم داده ها ( فایل ها ) زیاده به نظر من بهترین پروتکل استفاده از FTP هست . یعنی برای کاربران خودتون شناسه و پسورد میسازین و در این شبکه بوسیله یک برنامه واسط به مدیریت انتقال داده ها میپردازین چیزی شبیه به برنامه Filezila اما در حجم کوچکتر ولی تخصصی تر در زمینه مورد نیاز خودتون . برای این منظور بهتره کمی در مورد پروتکل های انتقال داده (http://www.google.com/#hl=en&sa=X&ei=oM_tTu3wBsWb8gOP363wCQ&ved=0CBcQvwUoAQ&q=%D9%BE%D8%B1%D9%88%D8%AA%DA%A9%D9%84+%D9%87%D8%A 7%DB%8C+%D8%A7%D9%86%D8%AA%D9%82%D8%A7%D9%84+%D8%A F%D8%A7%D8%AF%D9%87&spell=1&bav=on.2,or.r_gc.r_pw.,cf.osb&fp=d6b7c50fe1987ca1&biw=1280&bih=681) مطالعه داشته باشید بعد نوشتن اون واسط کاربری چیز زیاد سختی نیست .

موفق باشید ./

ali190
یک شنبه 27 آذر 1390, 19:22 عصر
سلام
میشه روش زیر رو توضیح بدید:

- فایل را در یک سرور بدون Share کردن و از طریق یک سرویس و ارتباط برنامه شده با سرویس مدیریت کنید
ممنون
یاعلی

alimanam
یک شنبه 27 آذر 1390, 23:21 عصر
با سلام

این سورسی هست که قبلاً نوشته بودم فقط دیتابیس اون اکسس هست ( چون الان سیستمم با پایگاه داده های SQL مشکل داره نتونستم تغییرش بدم به SQL فکر نمیکنم شما از پس تبدیل ساده 3 یا 4 خط کد برنیاین ) در این سورس شما قادر هستین هر فایلی رو به پایگاه داده اضافه کنین ( به صورت فیزیکی ) من برای مثال عکس , صدا , فایل ( PDF ) رو ذخیره و بعد استخراج کردم شما نسبت به احتیاجی که داری کدهاتون رو تغییر بدین . پسورد بانک : alimanam هستش .

http://up2.iranblog.com/images/tzfnhdnhlqurq1e8rk3n.png

موفق باشید ./

ASKaffash
دوشنبه 28 آذر 1390, 07:21 صبح
سلام
سورس ذیل را برای به روز رسانی یک رکورد که از نوع Image در اس کیوال سرور است استفاده کنید :


Public Shared Sub UpDateBinary(ByVal ConnectionString As String, ByVal FileName As String, ByVal FieldName As String, ByVal TableName As String, ByVal Where As String)
Dim connection As New SqlConnection(ConnectionString)
Dim command As New SqlCommand(String.Concat(New String() { "UpDate ", TableName, " Set ", FieldName, "=@ImageName Where ", Where }), connection)
Dim stream As FileStream = File.OpenRead(FileName)
Dim buffer As Byte() = New Byte(stream.Length - 1) {}
stream.Read(buffer, 0, CInt(stream.Length))
stream.Close
command.Parameters.Add("@ImageName", SqlDbType.Image).Value = buffer
connection.Open
command.ExecuteNonQuery
connection.Close
End Sub

ولی چند روش برای انتقال فایل به شکل یک Object متصور است :
- استفاده از Web Service
- استفاده از سوکت
- استفاده از WCF
- استفاده از DotNet Remoting
- ........
من بنظرم درون یک شبکه محلی سرعت استفاده از DotNet Remoting مناسب تر است
از آنجائی که من دست به #C هستم اگر موافق باشید من با #C کد بنویسم (اگر مدیر تالار اجازه دهد و خودتان VB.Net کنید)

ali190
دوشنبه 28 آذر 1390, 21:32 عصر
سلام
ممنونم جناب کفاش عزیز از لطفتون بابت قبول زحمت آموزش DotNet Remoting
یاعلی

ASKaffash
سه شنبه 29 آذر 1390, 07:07 صبح
سلام
انشالله سعی میکنم در چند مرحله موضوع را تشریح کنم (در انتها سورس هم می نویسم )
1: معماری DotNet Remoting به شکل ساده ذیل معرفی میگردد :

ASKaffash
یک شنبه 04 دی 1390, 07:11 صبح
با سلام
با عرض پوزش بابت تاخیر :
2- از دیدگاه پیاده سازی مطابق شکل عمل می کنیم :

ASKaffash
یک شنبه 04 دی 1390, 07:20 صبح
با سلام
3- یک خط URL به شکل ذیل قابل ارائه است :

ASKaffash
سه شنبه 06 دی 1390, 07:12 صبح
با سلام
روش پیاده سازی :
4-
1-4)
- از dll بنام System.Runtime.Remoting.dll استفاده کنید
- از Namespace های ذیل استفاده کنید :
System.Runtime.Remoting
System.Runtime.Remoting.Channels
System.Runtime.Remoting.Channels.Tcp
2-4)
سمت Common (مرحله 2) یک Class Library ایجاد گردد که یک Interface است و کلیه متدهای / خواص / ... در آن فقط معرفی میگردد (این ماهیت چند ریختی است)
3-4)
سمت Server :
- dll مشترک به پروژه ریفرنس می شود
- یک کلاس ایحاد میگردد که از کلاس MarshalByRefobject و Interface ارث بری می کند
- کلیه متدها و خواص / .... درون Interface درون کلاس پیاده سازی میگردد
- درون یک فرم یا ویندوز سرویس یا .... با استفاده از کلاس های TcpServerChannel و RemotingConfiguration و ChannelServices یک کانال رجیستر و آماده دریافت فرمان خواهد شد

ASKaffash
سه شنبه 06 دی 1390, 07:20 صبح
با سلام
5- سمت Clinent :
- dll مشترک به پروژه ریفرنس می شود
- یک URL جهت تبادل با Server ایجاد میگردد
- یک کانال با استفاده از TcpClientChannel ایجاد میگردد
- با استفاده از کلاس ChannelServices کانال رجیستر می شود
- با استفاده ار کلاس Activator یک نمونه شی ایجاد میگردد
- با استفاده از متدها و خواص طراحی شده درخواست های شما پاسخ داده می شود
(حتما در خصوص مفاهیم serialization و deserialized نیز مطالعه کنید)

ASKaffash
چهارشنبه 07 دی 1390, 07:08 صبح
با سلام
از این ببعد به زبان #C سورس ارائه میدهم زحمت تبدیل معادل به ali190 عزیز :
فرض کنید می خواهیم یک سرویس دریافت تاریخ و ساعت سمت یک سرور پیاده سازی کنیم بنابراین در سمت Common به شکل ذیل یک Interface طراحی می کنیم (موضوع خیلی واضح است اگر سئوالی از این کد هست تا همین جا مطرح شود تا برویم سمت سرور)

namespace CommonDLL
{
public interface MyRemote
{
string GetTime();
string GetDate();
}
}

ali190
چهارشنبه 07 دی 1390, 13:56 عصر
سلام
ممنون بابت آموزشهايي كه تاكنون زحمتش رو كشيديد
آيا منظورتون از Common همون Client هست؟
ممنون
ياعلي

ASKaffash
شنبه 10 دی 1390, 07:06 صبح
سلام
Common یک Class Library است که به پروژه سمت Client و Server ریفرنس شده است و Interface درآن تعریف شده است

ASKaffash
شنبه 10 دی 1390, 07:15 صبح
سلام
حال باید بخش سرور راپیاده سازی کرد :
ابتدا یک کلاس که از کلاس MarshalByRefObject و اینترفیس ما که در dll درون Common است ارث بری می کنیم بنابراین مجبوریم که خواص یا متدهای درون اینترفیس را پیاده سازی کنیم به سورس ذیل نگاه کنید

public class CreateClass : MarshalByRefObject, MyRemote
{
public string GetTime()
{
return DateTime.Now.ToString("hh:mm:ss");
}
public string GetDate()
{
DateTime MiladiDate = DateTime.Now;
PersianCalendar PerCldr = new PersianCalendar();
return PerCldr.GetYear(MiladiDate).ToString() + "/" +
PerCldr.GetMonth(MiladiDate).ToString() + "/" +
PerCldr.GetDayOfMonth(MiladiDate).ToString();
}

متدهای GetTime و GetDate که درون اینترفیس بوده اند پیاده سازی شده اند. در ادامه مثلا درون یک فرم از طریق یک پورت و با استفاده از کلاس TcpServerChannel آماده دریافت دستور می شویم :

public partial class RemoteServer : Form
{
public RemoteServer()
{
InitializeComponent();
}
private TcpServerChannel TSC = new TcpServerChannel(1355);
private void RemoteServer_Load(object sender, EventArgs e)
{
RemotingConfiguration.ApplicationName = "MyApp";
ChannelServices.RegisterChannel(TSC, false);
RemotingConfiguration.RegisterWellKnownServiceType (typeof(CreateClass), "MyService", WellKnownObjectMode.SingleCall);
}
private void RemoteServer_FormClosing(object sender, FormClosingEventArgs e)
{
ChannelServices.UnregisterChannel(TSC);
}

شماره پورت و MyApp و ... بعدا توسط Clinet از طریق یک URL باید ارائه گردد

ali190
شنبه 10 دی 1390, 18:33 عصر
سلام جناب کفاش عزیز
متد ارسال و دریافت رو هم توضیح میدید؟
ممنونم
یاعلی

ASKaffash
یک شنبه 11 دی 1390, 07:13 صبح
سلام
سمت Client خیلی آسانتر از سمت Server است کافی است
- یک URL ایجاد کنید
- یک کانال جهت ارتباط معرفی کنید
- در هنگام فراخوانی متدهای مورد نظر باید Cast به اینترفیس شما انجام شده سپس مقادیر را دریافت کنید


public partial class MyClient : Form
{
public MyClient()
{
InitializeComponent();
}
TcpClientChannel TCC =newTcpClientChannel();
string URL =@"tcp://SohSony:1355/MyApp/MyService";
private void Form1_Load(object sender, EventArgs e)
{
ChannelServices.RegisterChannel(TCC, false);
}
private void button1_Click(object sender, EventArgs e)
{
MyRemote RS = (MyRemote)Activator.GetObject(typeof(MarshalByRefO bject), URL);
this.Text = RS.GetTime();
}
private void button2_Click(object sender, EventArgs e)
{
MyRemote RS = (MyRemote)Activator.GetObject(typeof(MarshalByRefO bject), URL);
this.Text = RS.GetDate();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
ChannelServices.UnregisterChannel(TCC);
}
}

تمام شد حالا شما یک ارتباط بین Client و Server با استفاده از دات نت ریموتینگ (Dot Net Remoting) دارید و هر تعداد متد / ... که بخواهید می توانید اضافه کنید

ASKaffash
یک شنبه 11 دی 1390, 07:20 صبح
سلام جناب کفاش عزیز
متد ارسال و دریافت رو هم توضیح میدید؟
ممنونم
یاعلی

سلام
پارامترهای ورودی از طریق خواص یا پارامترهای ورودی متد می تواند به سرور ارسال شود و خروجی مثلا برای متد شما خروجی مورد نظر شما است مثلا برای مسئله شما فرض کنیم که نام فایل شما بعنوان ورودی با یک متد ارسال ودر سمت سرور این فایل از مسیر موردنظر تبدیل به یک Stream شده و یک Stream تحویل کلاینت شود و کلاینت در صورت تمایل می تواند Stream را به یک فایل در هارد تبدیل کند
یک موضوع مهم :
به نظرم عنوان تاپیک با عنوان آموزش شباهت ندارد لطفا اگر پیگیری نمائید که مدیران تالار عنوان را اصلاح کنند برای دیگران مفید خواهدشد سر وقت در مورد 3 روش دیگر هم می توان بحث کرد ولی همین قدر بدانید که ترتیب سختی پیاده سازی به ترتیب ذیل است :
- سوکت
- ریموتینگ
- WCF
- وب سرویس

ASKaffash
دوشنبه 12 دی 1390, 07:20 صبح
سلام
اینهم سورس کامل روش Dot Net Remoting در ضمن شاید برای تعدادی از افراد کمی موضوع سنگین باشد در هر صورت نوشتن یک سرویس بخصوص ریموتینگ که از روش های دیگر نسبتا سخت تر است کمی گیج کننده به نظر برسد ولی پیشنهاد می کنم قبلا در خصوص مفاهیم ذیل مطالعه نمائید :
- انواع Member های یک کلاس
- مفهوم اینترفیس در دات نت (برای استفاده در چند ریختی)
- serialization و de serialization
- انواع پروتکل های ارتباطی (WCF / WebService / ...)