PDA

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



silsin
جمعه 01 خرداد 1394, 15:22 عصر
سلام
کلا توضیح میدم قضیه چیه که بهتر سوالم درک بشه
هدف من در اینجا این بوده که یه پیغام رو از طریق کلاینت به سرور بفرستم
تو بحث ارسال هیچ مشکلی نیست مسلما . اتصال برقرار میشه و می فرسته اما زمانی که می فرسته من می خوام یه کاری کنم که سرور به صورت خودکار در صورتی که پیغامی رو دریافت کرد خودش نشون بده .
یعنی زمانی که پیغامی ارسال شد به سرور ما مجبور نباشیم برای خوندن پیغام ارسال شده خودمون عمل کنیم و این کار به صورت خودکار انجام بشه
فکری که اول به ذهنم رسیده اینه که تابع خوندن به صورت خودکار انجام بشه مثلا یه تایمر تعریف کنم که خودش هر چند لحظه یک بار مقادیر ارسالی یک طرف رو بخونه اما واقعا این کار درسته ؟؟؟
راه دیگه ای نیست که این کار رو انجام بدیم که طرف ها به صورت خودکار زمانی که پیغام رو دریافت می کنن نشون بدن ؟؟؟
دوستان لطف می کنن به بنده اگه تجربه ای یا اطلاعاتی مشابه دارند پاسخ بدن

RmeXXXXXXXXX
شنبه 02 خرداد 1394, 00:03 صبح
من ک دقیقاً متوجه نشدم.
میخواهیم پیغامی از کلاینت به سرور بفرستیم و سرور به محض دریافت پیام اونو نشون بده! این منظورتون بوده!
سرور به سوکت (آی پی و پورت مورد نظر) گوش میده. به محض دریافت پیام اونو پردازش میکنه (نشون میده) و دوباره برمیگرده سر جای اولش و دوباره شروع به گوش دادن میکنه. نکته: برنامه سرور باید قبل از کلاینت اجرا بشه و به پورت گوش بده.
اگر هم میخواهید که سرور بعد از دریافت پیام از کلاینت، جوابی بهش صادر کنه تا کلاینت هم بتونه دریافت کننده باشه -- بحث یکم ستخت تر میشه و باید از سوکت دو طرفه استفاده کنین.
منبع آنلاین برای سوکت پروگرمینگ سراغ ندارم ولی کتاب "برنامه نویسی شبکه به زبان C# "آقای جعفرنژادقمی ر و من مطالع کردم خیلی خوب و مفید بوده... پیشنهاد میکنم حتماً تهیه بفرمائید خیلی میتونه مفید باشه

ali_72
شنبه 02 خرداد 1394, 07:40 صبح
سلام
کلا توضیح میدم قضیه چیه که بهتر سوالم درک بشه
هدف من در اینجا این بوده که یه پیغام رو از طریق کلاینت به سرور بفرستم
تو بحث ارسال هیچ مشکلی نیست مسلما . اتصال برقرار میشه و می فرسته اما زمانی که می فرسته من می خوام یه کاری کنم که سرور به صورت خودکار در صورتی که پیغامی رو دریافت کرد خودش نشون بده .
یعنی زمانی که پیغامی ارسال شد به سرور ما مجبور نباشیم برای خوندن پیغام ارسال شده خودمون عمل کنیم و این کار به صورت خودکار انجام بشه
فکری که اول به ذهنم رسیده اینه که تابع خوندن به صورت خودکار انجام بشه مثلا یه تایمر تعریف کنم که خودش هر چند لحظه یک بار مقادیر ارسالی یک طرف رو بخونه اما واقعا این کار درسته ؟؟؟
راه دیگه ای نیست که این کار رو انجام بدیم که طرف ها به صورت خودکار زمانی که پیغام رو دریافت می کنن نشون بدن ؟؟؟
دوستان لطف می کنن به بنده اگه تجربه ای یا اطلاعاتی مشابه دارند پاسخ بدن

https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx
msdn کد کامل داره. کار خاصی نداره :لبخند:

silsin
شنبه 02 خرداد 1394, 10:03 صبح
من ک دقیقاً متوجه نشدم.
میخواهیم پیغامی از کلاینت به سرور بفرستیم و سرور به محض دریافت پیام اونو نشون بده! این منظورتون بوده!
سرور به سوکت (آی پی و پورت مورد نظر) گوش میده. به محض دریافت پیام اونو پردازش میکنه (نشون میده) و دوباره برمیگرده سر جای اولش و دوباره شروع به گوش دادن میکنه. نکته: برنامه سرور باید قبل از کلاینت اجرا بشه و به پورت گوش بده.
اگر هم میخواهید که سرور بعد از دریافت پیام از کلاینت، جوابی بهش صادر کنه تا کلاینت هم بتونه دریافت کننده باشه -- بحث یکم ستخت تر میشه و باید از سوکت دو طرفه استفاده کنین.
منبع آنلاین برای سوکت پروگرمینگ سراغ ندارم ولی کتاب "برنامه نویسی شبکه به زبان C#‎‎‎‎ "آقای جعفرنژادقمی ر و من مطالع کردم خیلی خوب و مفید بوده... پیشنهاد میکنم حتماً تهیه بفرمائید خیلی میتونه مفید باشه

نمی دونم چه جوری توضیحش بدم
قبل از همه در مورد اون کتابه واقعا افتضاحه ترجمه اش :لبخند: نکات خوب داخلش داره ولی افتضاحه واقعا ترجمه اش
یک بار دیگه می گم اینبار سعی می کنم بیشتر توضیح بدم
تو سناریویی که ما در نظر می گیریم به این صورته که :
اول مسلما تمامی کارهای مربوط به برنامه نویسی سوکت رو انجام میدیم
راه اندازی سرور و کلاینت و اتصالشون به همدیگه و اینجور حرفها
حالا می خوایم یه پیغام از کلاینت به سرور بفرستیم تا اینجاش که مشکلی نیست البته اینی که می گم برعکسش هم صادقه . خب زمانی که این پیغام رو می فرستیم به سرور مسلما یه فرایند Read ای هم باید در سرور باشه که این رو بخونه . اما چه طوری میشه کاری کرد که سرور خودش چک کنه و بیینه که ایا کلاینت پیغامی فرستاده بهش و اگر فرستاده اون رو بخونه . تو مثال های دیگه دیده بودم مثلا دوتا دکمه میزاشتن زمانی که با یکی پیغام رو فرستادی دومی رو کلیک می کنی و بعدش این پیغامی که ارسال شده Read میشه . می خوام بدونم اصلا
من دارم اشتباه می کنم از پایه و اساس یا اینکه روش بهتری واسه این قضیه وجود داره
البته خب یه روش به ذهن خودم رسیده می خوام قبل از اینکه روش وقت بزارم و انجامش بدم ببینم دوستان می تونن من رو راهنمایی کنن یا نه (دیگه از این قشنگ تر نمی تونستم توضیح بدم :لبخند:)

silsin
شنبه 02 خرداد 1394, 17:36 عصر
https://msdn.microsoft.com/en-us/library/fx6588te(v=vs.110).aspx
msdn کد کامل داره. کار خاصی نداره :لبخند:

ممنون از شما ببینم می تونم باهاش کاری کنم یا نه

silsin
یک شنبه 03 خرداد 1394, 13:27 عصر
خب این لینکه هم مشکل من رو برطرف نکرد
هیچ کسی هم جواب نداد متاسفانه . پس میرم همون ایده خودم رو پیاده میکنم
یه متد میسازم که دائما این رو اجرا کنه تا بتونه دریافت رو انجام بده تو اینترنت هم متاسفانه چیز به درد بخوری ندیدم. اگه حداقل مثالی هم باشه که بتونم ببینم چه جوری این کار رو انجام دادن باز هم خوب میشد

ali_72
یک شنبه 03 خرداد 1394, 13:42 عصر
خب این لینکه هم مشکل من رو برطرف نکرد
هیچ کسی هم جواب نداد متاسفانه . پس میرم همون ایده خودم رو پیاده میکنم
یه متد میسازم که دائما این رو اجرا کنه تا بتونه دریافت رو انجام بده تو اینترنت هم متاسفانه چیز به درد بخوری ندیدم. اگه حداقل مثالی هم باشه که بتونم ببینم چه جوری این کار رو انجام دادن باز هم خوب میشد
من از همین لینک استفاده کردم یه پروژه کامل هم نوشتم
یه تکه کدتو میذاشتی ببینیم چی نوشتی
داری سخت میگیری یا من متوجه مشکلت نشدم؟ ارسال و دریافت که کاری نداره

silsin
دوشنبه 04 خرداد 1394, 01:11 صبح
یه نکته ای که یادم رفتم بگم اینه که چیزی که من دارم میسازمش یه dll نه یه برنامه
برای مثال :
131609

اگه تو برنامه دقت کنین من یه دکمه ای هم برای دریافت پیغام گذاشتم . اگر دریافت کننده کنسول بود مشکلی نبود . اما حالا که هم دریافت کننده و هم فرستنده فرم هستن من چه جوری می تونم از شر دکمه دریافتی که تو مثالی که فرستادم گذاشتم راحت بشم ؟ یعنی منظورم اینه که چه جوری مثلا زمانی که از کلاینت فرستادم به صورت خودکار ورودی سوکت رو چک کنه اگر پیغامی بود چاپ کنه دیگه نیازی نباشه تو این مثال هی واسه پیغام رو دکمه دریافت کلیک کنم (دیگه قشنگ تر ازین نمی تونم منظورم رو برسونم به خدا :لبخند:)
کد dll هم لازم بود بگین بزارم

ali_72
دوشنبه 04 خرداد 1394, 09:23 صبح
یه نکته ای که یادم رفتم بگم اینه که چیزی که من دارم میسازمش یه dll نه یه برنامه
برای مثال :
131609

اگه تو برنامه دقت کنین من یه دکمه ای هم برای دریافت پیغام گذاشتم . اگر دریافت کننده کنسول بود مشکلی نبود . اما حالا که هم دریافت کننده و هم فرستنده فرم هستن من چه جوری می تونم از شر دکمه دریافتی که تو مثالی که فرستادم گذاشتم راحت بشم ؟ یعنی منظورم اینه که چه جوری مثلا زمانی که از کلاینت فرستادم به صورت خودکار ورودی سوکت رو چک کنه اگر پیغامی بود چاپ کنه دیگه نیازی نباشه تو این مثال هی واسه پیغام رو دکمه دریافت کلیک کنم (دیگه قشنگ تر ازین نمی تونم منظورم رو برسونم به خدا :لبخند:)
کد dll هم لازم بود بگین بزارم

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

silsin
سه شنبه 05 خرداد 1394, 00:34 صبح
ممنون از شما
اینکه همین کار رو بابتش انجام بدم هم تو فکر خودم بود . اما خب باید ریسک بالارفتن پردازش ترد رو هم در نظر گرفت . به فرض من صد تا کاربر داشته باشم میشه صدتا تک ترد ! . وگرنه مگه هر ترد می تونه واسه چند تا باشه ؟؟؟
ایده دیگه که به ذهنم رسیده استفاده از یه تایمره که به ازای ثانیه های مشخص این تابع رو اجرا کنه که خب مشکلی که داره اولا فعال و یا غیر فعال کردنشه یا مثلا بخوای کاری کنی که هماهنگ بشه با تایم اوت ارسال یا دریافت کلی دردسر داره
راه حل سوم هم که هنوز امتحان نکردم امیدوارم دوستانی که تجربه دارن راهنمایی بکنن . تو جایی خونده بودم میشه به وسیله رفلکشن میشه یه چیزی تو مایه های متد Update تو نرم افزار unity3d ساخت ! ( منظورم الگوی مونو این نرم افزاره ) اما هنوز هیچ مثال به درد بخوری پیدا نکردم که حتی یه سر نخ هم بهم بده در این مورد

ali_72
سه شنبه 05 خرداد 1394, 07:39 صبح
ممنون از شما
اینکه همین کار رو بابتش انجام بدم هم تو فکر خودم بود . اما خب باید ریسک بالارفتن پردازش ترد رو هم در نظر گرفت . به فرض من صد تا کاربر داشته باشم میشه صدتا تک ترد ! . وگرنه مگه هر ترد می تونه واسه چند تا باشه ؟؟؟
ایده دیگه که به ذهنم رسیده استفاده از یه تایمره که به ازای ثانیه های مشخص این تابع رو اجرا کنه که خب مشکلی که داره اولا فعال و یا غیر فعال کردنشه یا مثلا بخوای کاری کنی که هماهنگ بشه با تایم اوت ارسال یا دریافت کلی دردسر داره
راه حل سوم هم که هنوز امتحان نکردم امیدوارم دوستانی که تجربه دارن راهنمایی بکنن . تو جایی خونده بودم میشه به وسیله رفلکشن میشه یه چیزی تو مایه های متد Update تو نرم افزار unity3d ساخت ! ( منظورم الگوی مونو این نرم افزاره ) اما هنوز هیچ مثال به درد بخوری پیدا نکردم که حتی یه سر نخ هم بهم بده در این مورد
فک کنم ترد خیلی بهتر از تایمر هست
من برنامه رو برای تعداد کاربر بالا تست نکردم

silsin
سه شنبه 05 خرداد 1394, 10:36 صبح
ولی احتمالا اون مشکلی که گفتم برای کاربران با تعداد بالا پیش میاد .
اگه بشه متدی ایجاد کرد که بتونه دستورات داخل خودش رو دائما اجرا کنه . انجین بازی سازی یونیتی یه همچین چیزی رو داره داخل خودش با نام متد Update داره که این متد به قول خودشون در هر کلاک فریم صدا زده میشه و دستورات داخل خودش رو دائما اجرا میک نه . کلی گشتم دنبال اینکه این متد رو چه جوری ساختن یا میسازن . می خوام همچین چیزی رو پیاده سازی کنم اما متاسفانه حتی مثالی هم نیست که اینو نشون بده همه جا گفتن از تایمر استفاده کنین


System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
timer1.Interval=300000;//5 minutes
timer1.Tick += new System.EventHandler(timer1_Tick);
timer1.Start();

private void timer1_Tick(object sender, EventArgs e)
{
//do whatever you want
RefreshMyForm();
}

private void RefreshMyForm()
{

//update form with latest Data

}

silsin
پنج شنبه 07 خرداد 1394, 12:33 عصر
اخرش هم به هر دری زدم نتونستم اون چیزی که می خوام رو بسازم . می خواستم کاری کنم که کاربر فقط با استفاده از تابعی که من نوشتم بتونه Read کردن رو اتوماتیک اجرا کنه ولی نشد که نشد . مشکلی این نیست که این روشی که می خوام انجام بدم انجام نمیشه وگرنه اگه همین کار رو تو برنامه ای که ساخته میشه انجام بدیم خیلی راحت میشه ولی من می خوام تو dll بنویسم که بشه فقط با فراخوانی اون اجرا ش کرد که هنوز نتونست م