PDA

View Full Version : اعلام رفرش در سمت کلاینت ها و سرور به کاربران



mhsmity
جمعه 03 آبان 1392, 19:01 عصر
اعلام رفرش در سمت کلاینت ها و سرور به کاربران برنامه ای وجود دارد که دارای چند لیست می باشد. برای این که شما تغییرات لیست جاری که در حال مشاهده آن هستید را بییند فقط فقط کافی است از دکمه رفرش استفاده نماید. حال می خواهیم هر یک از کلاینت ها و یا سرور در لیست جاری که من در حال مشاهده آن هستم تغییری ایجاد کردند به من اطلاع داده شود. نحوه استفاده از برنامه: برنامه را دانلود نماید. دو کامپیوتر را با کابل شبکه با آپی های زیر شبکه کنید. 192.168.10.1 192.168.10.2 برروی هر کامپیوتر یک نسخه از نرم افزار را اجرا نماید و نتیجه را مشاهده نماید. اگه سوالی بود در خدمت شما عزیزان هستم. و در آخر از زحمات دوستان خوبم امیر مهرشاد و hamid_hr تشکر فراوان دارم.

mhsmity
شنبه 04 آبان 1392, 22:50 عصر
سلام دوستان کسی نبود
MHSmity

mhsmity
یک شنبه 05 آبان 1392, 19:16 عصر
سلام دوستان کسی نبود
MHSmity

هیچ کس راه حلی برای این مسئله نداره؟

saied_max
یک شنبه 05 آبان 1392, 19:58 عصر
میتونی از تایمر استفاده کنی و هر چند ثانیه یک بار اطلاعات رو fill کنی اما اگه حجم اطلاعات جدولت زیاد بشه به سرور فشار میاد.میتونی از یک جدول دیگه استفاده کنی و یه trigger برای ثبت آخرین تغییرات هر جدول یک جدول دیگر استفاده کنی و فقط چک کنی که اطلاعات کی تغییر کرده که رفرش کنی. این یه راه حله اما به نظر خودم جالب نیست(اگه خجم اطلاعات زیاد باشه و هی تغییر کنه). اگه عجله نداری باید چک کنم تا یه راه منطقی خوب پیدا کنم

امیر مهرشاد
یک شنبه 05 آبان 1392, 22:27 عصر
{ توجه داشته باشيد که اين تغيير از سمت سرور و کلاينت ها صورت مي گيرد }
چطوري اين تغييرات رو در فرم جاري سرور و کلاينت اعمال کنم.

حلا کلاینت 2 در لیست A تفییری ایجاد می که چه طوری به سرور علامت بدم که باید لیست خودش رو رفرش کنه ؟


وقتی خودتون میگید تحت شبکه نوشتید خب یک دیتابیس که بیشتر در سرور نداریم بمحض تغیرات همزمان کلاینت ها هم شاهد تغیرات هستند استفاده از یه trigger روش خوبیه ولی تایمر برای اینکار اصلا حرفه ای نیس اگر متد Refresh یا Updateجوابگوی شما نیست از روش پایین استفاده کنید البته روش های بهینه تری هم حتما هست

یک خط پایین تر از کدی که تغیرات رو در بانک اعمال میکنید یه آداپتر بسازید و با دیتاآداپتر یک سلکت دیگه بگیرید و در قالب دیتاست بخورد دیتاسورس گریدتون یا هرجایی که میخواید بدید بهمین راحتی شاهد رفرش لحظه ای خواهید بود

اما روش دیگه :

در جدولتون یک فیلد رو بعنوان کلید تعریف کنید
در لود فرمتون جدول رو توی دیتاست بریزید و بدیدش بخورد دیتاگریدتون
یک کلاس که حاوی متد آپدیت هست (سلکت یا ...) بنویسید و هر جایی مورد نیاز بود صداش بزنید
یا توی همون جایی که گرید رو گزاشتید



SqlDataAdapter da = new SqlDataAdapter("Your Command",cn);
SqlCommandBuilder cm = new SqlCommandBuilder(da);
da.Update("Ds","YourTable");

بعد شسته رفته تحویل دیتا سورس گریدتون بدید سوالی داشتید در خدمتتون هستم

YourTable نام جدولی که در دیتاست تعریف کردید

Ds هم دیتاستی که ساختید

امیر مهرشاد
یک شنبه 05 آبان 1392, 22:52 عصر
پیرامون پیامی که دادید خیلی خلاصه بعد اینکه با کد اصلی تغیراتی در یک جدول اعمال کردید با یه آداپتر دوباره سلکت بزنید و نتیجه سلکت رو توی هر شی که خواستید نمایش بدید ازین خلاصه تر :متفکر:

اگه این نیست منظورتونو دقیق تر بگید

mhsmity
یک شنبه 05 آبان 1392, 22:55 عصر
از توجه شما ممنونم.
بیشتر با برنامه ای که نوشتم آشنا بشیم.
پوشه برنامه در سرور شیر شده و در کلاینت ها یک شرکات از فایل اجرای برنامه وجود دارد.
وقتی تغییری ایجاد میشه در خود سرور هم یاید رفرش صورت بگیرد وگرنه تغییرات در دیتا گرید ویو نمایش داده نمی شود.

من خودم فکر می کنم به مشکل خیلی سختی برخورد کرده ام و راحل مناسب و ساده به ذهنم نمی رسه.
چون:
برنامه مثل یه فایل متنی هستش که داخل شبکه شیر شده تا این فایل متنی سمت سرور یا کلاینت بسته نشده و دوباره باز نشه تغیرات نفر دومی دیده نمی شه

لیست های A و B و C رو فرض کنید
یک جدول درست کنیم با فیلدهای از نوع Boolin با نام های A , B ,C هر وقت در هر لیست تغییری ایجاد شد مقادر این فیلدها در جدول تغییرات برابر True شود.
بعد برای هر لیست یک تایمر تعریف کنیم که این مقادیر رو چک کنه و در صورت صحت عمل رفرش رو انجام بده.

ولی مشکل هست :
وقتی تعداد کلاینت ها به 3 عدد یا بیشتر برسه باید چی کار کرد؟
این حالت هارو برای هر کلاینت باید چه طوری چک کرد و یا ذخیره کرد؟:افسرده:

امیر مهرشاد
یک شنبه 05 آبان 1392, 23:16 عصر
مشکلتون رو خودتون سخت میکنید با تظیمات خود منیجمنت و تعریف رل در سمت سرور اینکار براحتی قابل انجام است نمیدونم شما چرا مسرانه میخوایید لقمه رو ...؟! شیر کردن و ...
یا اگه میخوایید از از سوکت استفاده کنید - سرور دائما در حال گوش دادن به کلاینت ها هست و از اینهمه دنگ و فنگی که شما میگید خبری نیست (تایمر و ...)

امیر مهرشاد
یک شنبه 05 آبان 1392, 23:20 عصر
این 112296 رو مطالعه کنید در مورد Socket و Send - Receive و Client و Server

hamid_hr
دوشنبه 06 آبان 1392, 08:36 صبح
ميتونيد هر نسخه از نرم افزار كه تغييري در اطلاعات داد يه broadcast تو شبكه ارسال كنه و بقيه سيستم ها گوش ميكنن و وقتي اينو دريافت كردند ميفهمند بايد رفرش كنن اطلاعاتو

mhsmity
دوشنبه 06 آبان 1392, 14:02 عصر
ميتونيد هر نسخه از نرم افزار كه تغييري در اطلاعات داد يه broadcast تو شبكه ارسال كنه و بقيه سيستم ها گوش ميكنن و وقتي اينو دريافت كردند ميفهمند بايد رفرش كنن اطلاعاتو
ممنون.
فکر کنم زدیید وسط خال دقیقا همین رو می خواستم.
میشه بیشتر توضیح بدین باید از کجا شروع کنم .

hamid_hr
دوشنبه 06 آبان 1392, 14:46 عصر
سلام
شما سوكت پروگرمينگ رو بخون همه چيز دستت مياد

mhsmity
سه شنبه 07 آبان 1392, 11:41 صبح
دست همه دوستان درد نکنه.
برنامه زیر به صورت broadcast :
پیغامی رو ارسال می کنه و کلاینت ها اون رو دریافت می کنن.

وقتی عمل received برای اولین بار صورت می گیرد برنامه قفل می کنه. چی کار کنم که این قفل شدن رو نداشته باشه ؟

hamid_hr
سه شنبه 07 آبان 1392, 11:55 صبح
بايد recive رو به صورت ترد اجرا كني
وقتي به خط
recv = sock.ReceiveFrom(data, ref ep);
ميرسه منتظر اطلاعات ميشه تا دريافت كنه و برنامه ميره تو حالت هنگ
اين تايع رو با ترد اجرا كن

mhsmity
سه شنبه 07 آبان 1392, 12:03 عصر
بايد recive رو به صورت ترد اجرا كني
وقتي به خط
recv = sock.ReceiveFrom(data, ref ep);
ميرسه منتظر اطلاعات ميشه تا دريافت كنه و برنامه ميره تو حالت هنگ
اين تايع رو با ترد اجرا كن


وقتی برنامه رو می بندم از حافظه خارج نمی شه ؟

hamid_hr
سه شنبه 07 آبان 1392, 13:34 عصر
Th.IsBackground = true;

hamid_hr
سه شنبه 07 آبان 1392, 13:44 عصر
يه سوال
چرا recive رو داخل تايمر گذاشتين؟

mhsmity
سه شنبه 07 آبان 1392, 15:53 عصر
سرور من دارای آپی زیر میباشد: 192.168.10.1

کلاینت من درای آپی زیر میباشد:
192.168.10.2

وقتی برنامه که گذاشتم از سمت سرور اجرا میشه درست کار میکنه ولی در سمت کلاینت درست اجرا نمی شه اشکال کار کجاست؟

تابع ارسال من :

try
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 1433);
byte[] data = Encoding.ASCII.GetBytes(tableName);
sock.SendTo(data, iep);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

hamid_hr
سه شنبه 07 آبان 1392, 17:02 عصر
اگه خطا ميده بگين خطاش چيه
اگه نميدي منظورتون از كار نميكنه چيه/

mhsmity
سه شنبه 07 آبان 1392, 17:18 عصر
اگه خطا ميده بگين خطاش چيه
اگه نميدي منظورتون از كار نميكنه چيه/

دست شما درد نکنه لان داره کارمی کنه؟

mhsmity
سه شنبه 07 آبان 1392, 17:45 عصر
نتیجه این پرسش و پاسخها در تاپیک زیر:

http://barnamenevis.org/showthread.php?425797-%D8%A7%D8%B9%D9%84%D8%A7%D9%85-%D8%B1%D9%81%D8%B1%D8%B4-%D8%AF%D8%B1-%D8%B3%D9%85%D8%AA-%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA-%D9%87%D8%A7-%D9%88-%D8%B3%D8%B1%D9%88%D8%B1-%D8%A8%D9%87-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86