بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

سوالات مبتدی در مورد سوکتینگ

مدیریت گفتگو
مجتبی یگانه 12 سال پیش
آخرین تغییر: 11 سال پیش

سلام

این مجموعه سوالاتی هست که تو ذهنم در مورد Web Socketing ایجاد شده ، اما منبع فارسی مناسب پیدا نکردم ، در مقاله های انگلیسی هم که یا سطح بالا توضیح داده شده یا انگلیسی من جوابگو نیست D:  ، مثل این لینک

  1. یه توضیح مختصر در مورد سوکتینگ !
  2. آیا برای سوکتینگ نیاز هست که یک ارتباط همیشه زنده (Alive) نکه داشته باشه ؟
  3. (اگر 2 بله ) آیا برای Keep Alive یا زنده نگه داشتن این ارتباط باید مقداری از پهنای باند کاربر در هر لحظه ی این ارتباط مصرف بشه ، یا فقط در زمان تبادل داده ؟
  4. ( اگر 2 خیر ) آیا سرور میتونه برسی کنه که آیا کاربر آنلاین هست یا کاربر باید خودش درخواست تغییر وضعیت آنلاین آفلاین شدن رو به سرور بده !
  5. آیا سرور میتونه در ارتباط با کاربری که Ip static نداره ، شروع کننده ارتباط باشه ؟ (یعنی بگه کاربر جان ! ، حالا که به اینترنت وصل هستنید این داده ها رو بگیرید !

در  آخر هم اگر منبع خوبی برای شروع سوکتینگ می شناسید ، لطفا معرفی کنید

ممنون

نظرات

Wolf 12 سال پیش
ممنونم
Wolf 12 سال پیش
گفتم یه چیزی گفته باشم :)
مجتبی یگانه 12 سال پیش
آها ، واسه مشترک شدن ! مبحث خیلی خوبیه :) - به قول خودتون اگه از سوال خوشتون اومد لایک کنید !
حامد 12 سال پیش
حتما به استاد لینک این سوال را پیام شخصی بده که آخر شب اومد یه توضیح کامل بده ... هدف اصلی را هم براش توضیح بدی بهتره
مجتبی یگانه 12 سال پیش
هدف که کاملا مشخصه ، تولید اورانیم غنی شده با غلظت بالا و کیک زرد خوشمزه :)) - راه اندازی Push Notification روی سرور شخصی خودم !
حامد 12 سال پیش
البته تو یه تاپیک فکرنم توضیح داده بود
CreativeBoy 12 سال پیش
بحث جالبیه، با اجازه منم مشترک میشم :)
javac 12 سال پیش
ممنون ، (مشترک) :)
sadeghbarout 12 سال پیش
پس منم مشترک شدم. یه پیشنهاد هم به استاد میدم. که وقتی دکمه ستاره رو زدیم یعنی از موضوع خوشمون اومده دیگه یا برامون مهمه. پس اتوماتیک مشترک بشیم :)
Spirit 12 سال پیش
مشتــــــــــــــــــــــــــــــــــــــــــــــــــــــرک
javac 12 سال پیش
با این استقبالی که شده ، بهتر استاد یه سری ویدیو در این رابطه تدوین کنند :)

پاسخ‌ها 4

محمد حسین زاده 12 سال پیش

1- سوکتینگ به هر نوع ارتباط با مشخصه آشنا میگن. قبل تر ها این مشخصه آشنا صرفا آی پی بود. ارتباط سوکت بر اساس یه پروتکل انجام میشه یا tcp یا udp که عمده تفاوت در امنیت بالاتر tcp و سرعت بالاتر upd خلاصه میشه

2- چهار نوع ارتباط برای این مورد (حداقل) باید بررسی بشه :

a) Forever frame

فقط در IE پشتیبانی می‌شود. در این روش یک Iframe مخفی توسط مرورگر تشکیل شده و از طریق آن درخواستی به سرور ارسال می‌شود. سپس سرور متناوبا با تزریق اسکریپت‌هایی به این Iframe سبب فراخوانی مجدد وضعیت خود می‌گردد. در این روش به ازای هر درخواست و پاسخ، ارتباطات گشوده و بسته خواهند شد.

b) Long polling

به آن HTTP Streaming یا Comet هم گفته می‌شود. این روش نسبتا هوشمند بوده و کلاینت اتصالی را به سرور برقرار خواهد کرد. سرور در این حالت تا زمانیکه اطلاعاتی را در دسترس نداشته باشد، پاسخی نخواهد داد.

c) Server Sent Events یا SSE

این مورد جزو استاندارد HTML5 است. در اینجا اتصالی برقرار شده و داده‌ها از طریق اتصالات HTTP منتقل می‌شوند.

d) Web sockets

Web sockets در سکوی کاری ویندوز، تنها در ویندوز‌های 8، ویندوز سرور 2012 و دات نت 4 و نیم پشتیبانی می‌شود. هرچند این روش در حال حاضر به عنوان بهترین روش Push مطرح است اما به دلیل محدودیتی که یاد شد، مدتی طول خواهد کشید تا استفاده گسترده‌ای پیدا کند.

3- طبق جواب نا دقیقی که به مورد 2 داده شد حجم متفاوتی از پهنای باند لازمه

4- تحت هیچ شرایطی بدون ارسال درخواست از طرف کلاینت سرور نمیتونه متوجه وجود کلاینت بشه. اما کاربر نیازی نیست درخواستی بده. کلاینت این کار رو بر اساس مدل انتخابی مدیریت میکنه. چیزی که الان بیشتر در اندروید استفاده میشه long polling هست که تعداد کانکشن ها و بار پردازشی سرور رو کم میکنه

5- خیر. اول کلاینت خودشو رجیستر میکنه. حتی در وب سوکت هم آغاز با کلاینته، بعدا سرور میگه کاربرجان و الی آخر

نظرات

مجتبی یگانه 12 سال پیش
بسیار عالی ، خیلی ممنون :) ، سر نخ های خیلی خوبی بود ، پس من برای برنامه ام باید یک Reciver برای اتصال به اینترنت بنویسم ، وقتی اجرا شد ، سرور رو از آنلاین بودن مطلع کنه تا سرور بتونه درخواستش رو بفرسته ، اما در مورد روش ارتباط باید بگم که با مطالعه ی قبلی و از طریق stackoverFlow با long polling آشنا شدم و با جست و جو بیشتر به این لینک رسیدم لینک ، پرسش کاربر در مورد راه اندازی push notification روی سرور خودش بود (دقیقا مثل من ! ) و long polling رو برای اندوردید پیشنهاد داده بودند - با توجه به اینکه سرور تا زمانی که داده ای نداشته باشه ، پاسخی نمیده ، میشه گفت بهترین گزینه برای push notification هست ؟
نه. بهترین روش در حال حاضر مورد d هست. موارد رو به ترتیب بد به خوب نوشتم. ولی محدودیت سمت سرور داره. برای همین سمت کلاینت خیلی بهش پرداخته نشده. حتی خیلی از کلاینت های signalr که بهترین کارایی رو با مورد آخر داره ازش پشتیبانی نمیکنن
hamidd 12 سال پیش
آقای حسین زاده خط اول نوشتید "قبل تر ها این مشخصه آشنا صرفا آی پی بود" .مگه از مشخصه دیگری هم میشه استفاده کرد؟
مجتبی یگانه 12 سال پیش
الان واقعا فکر میکنم کار سختی نیست و میتونیم انجامش بدیم ، به پاسخ استاد در این سوال هم توجه داشته باشیم ، مرتبط هست لینک
خیر . نهایتا آیپیه. ولی کلاینت وقتی خودش رو رجستر میکنه، سمت سرور شما مستقیما با آیپی کار نمیکنی. با کلاینت آیدی کار میکنی. در حقیقت با یه لایه روی آیپی کار میکنی. چون تو اکثر راه کارهای جدید بر خلاف سوکت پروگرمینگ آیپی پنهان میشه و کلاینت و سرور بر اساس گاید با هم کار میکنن اینطور میشه نوشت
مجتبی یگانه 12 سال پیش
پس با این حساب از لحظه ی ارتباط ما با اینترنت ، یک کانکشن بین ما و سرور گوگل ایجاد میشه و تا قطع اتصال کانکشن پا برجا هست ، درسته ؟
لزوما نه ولی تقریبا آره. لحظه ی خبر دار شدن کلاینت از ارتباط ما با اینترنت ، یک کلاینت آی دی به ما تعلق میگیره و هرموقع کلاینت فهمید ارتباط قطع شده مجدد خودشو رجیستر میکنه.
override 12 سال پیش
میشه تفاوت بین long polling و web sockets رو توضیح بدید بعد تعریف sse برای من یه کم گنگ هست کلاً تفاوت بین نحوه ی دریافت دیتا در این تکنیک ها چیه؟آیااین روش ها پروتکل محسوب میشن؟ بعد مفهوم socket چیه؟انتظار ندارم در مورد همه ی سوال هام توضیح بدید اگر لینکی چیزی هم بذارید ممنون میشم.
override 12 سال پیش
از همه اینا من فقط long polling رو اونم تازه شاید متوجه شده باشم.
zrezvani 11 سال پیش
سلام شرمنده میتونم تفاوت وب سوکت و با Web Application Messaging Protocol (WAMP) بدونم؟ اخه تو سرچ، این موضوع کنار وب سوکت بودش
مجتبی یگانه 12 سال پیش

درک یه موضوع برای من سخته و شاید علتش تجربه ی کم من باشه ، ببخشید :|

ما معمولا با کاربر اینجوری ارتباط برقرار میکنیم

 Domain.com/Appserver.php

حالا اگه قرار باشه در یک لحظه کار انجام بشه ، کافیه پاسخ Appserver.php برسی بشه (مثلا برای گرفتن لیست یادداشت های سمت سرور ! )

قرار نیست که کلاینت ما در هر لحظه درخواست بده بگه " چه خبر ! اعلان معلان جدید چی داری ؟! "، پس ارتباط به چه شکل میشه ؟

اگه بخوام رو هوا کد بنویسم اینجوری میگم !

NotifyUser(int ClientID, String ResponseJson){

}

خوب بدنه ی این تابع چیه ؟ ، یعنی چطور این Json رو به ClientID میرسونه ؟

ممنون

نظرات

hamidd 12 سال پیش
چرا به جای php از Socket programming استفاده نمی کنی؟ هم سریعتره.اختصاصی تره.
CreativeBoy 12 سال پیش
نمیدونم درست منظور رو متوجه شدم یا نه ولی چیزی که فهمیدم رو مینویسم. اگر شما client باشی و به سرور یه درخواست بدی سرور به شما یک Session ID اختصاص میده که این id دارای یک زمان Expire هست، و تا قبل از این که این session ID منسوخ نشده از دید سرور ارتباط شما معتبره. (یکم نامفهوم توضیح دادم ولی امیدوارم که منظور رو رسونده باشم.)
مجتبی یگانه 12 سال پیش
مشکل اینه که چون تا حالا Socket Programming کار نکردم ، حتی سوالم بلد نیستم بپرسم ! ، لطفا شما هم تجربیاتتون رو بگید ، چون واقعا من 0 ام !
CreativeBoy 12 سال پیش
hamidd میشه یکم بیشتر توضیح بدی؟ خوب مگه با خود PHP نمیشه socket Programming کرد؟ ( لینک ).
hamidd 12 سال پیش
Socket programming کلا بحثش جداست . PHP با هزار تا واسطه از Socket programming استفاده میکنه.
مجتبی یگانه 12 سال پیش
CreativeBoy منظور این نبود ، ولی ممنون ، ایده ی خوبیه :) - منظورم اینه که چطور این اطلاعات بدست کاربر میرسه ؟ در سوکتینگ چیزی مثل onRecive وجود داره ؟
hamidd 12 سال پیش
ببین مجتبی جان وقتی شروع به یادگیری socket programming کنی کم کم جواب خیلی سوالاتو میگیری. ابتدا سرور باید در حال listening قرار بگیره. بعد طبق سیاستی که خودت برای برنامه در نظر میگیری ( مثلا می تونی Broadcast receiver هر وقت دستگاه آنلاین شد ) توی برنامه درخواست Connect به سرور میدی.بعد سرور ارتباط رو قبول میکنه و کانکشن برقرار میشه و Alive میمونه. حالا که ارتباط بین گوشی و سرور برقرار شده اینجا باید یه مقررارتی(پروتکل) خودت پیاده سازی کنی. مثلا برنامه اندرویدی پیغام "Pull" رو به سمت سرور میفرسته که سرور بعد از دریافت این پیغام، در صورتی که Notification ای موجود باشه ،اون Notification رو با پیغامی به کلاینت که همون دستگاه اندرویدی ه می فرسته.کلاینت بعد از این که Notification رو دریافت کرد نمایش میده و ارتباط رو با سرور قطع میکنه. تمام این مراحل با بالاترین سرعت ممکن انجام میشه چون کانکشن Alive ه .مثلا اگه کاربر اینترنت Dial UP داشته باشه توی 3-2 ثانیه انجام میشه.چند تا نکته اگه خواستی از این روش استفاده کنی : ارتباط TCP برقرار کن - امنیت رو خودت باید برقرار کنی چون اگه باگ STACK OVER FLOW یا چنین باگ های امنیتی ای تو برنامه ی تحت سرورت وجود داشته باشه ممکنه باعث هک شدن سرور بشه - تو این روش رمز گذاری رو هر طور دلت بخواد میتونی انجام بدی.با socket programming داده خیلی کمتری تبادل میشه ولی با پیاده سازی با PHP داده های اضافی نیز همراه پیغام ارسال میشه - پیغام ها رو رمز گذاری کن.
hamidd 12 سال پیش
یادش بخیر قبلا چه تروجانی با Socket Programming توی VB مینوشتیم.
الان دیگه socket programming خیلی منطقی نیست. الان دوره Web sockets شروع شده. در لایه های پایین از همون socket programming استفاده میکنه ولی با باگ کمتر ، بدون مشکل با فایر وال ها و کنترل های بیشتر سمت سرور و کلاینت. با خود سوکت راهی که بقیه رفتن رو باید با یه کدی که خودت نوشتی و قطعا پر از باگه جایگزین کنی.
hamidd 12 سال پیش
چیز خاصی نیست که بخواد باگ داشته باشه. خیلی آسون تر از اون چیزیه که فکرشو می کنید.
اولین چیزی که باگ تلقی میشه رفتار فایر والها با سوکته. منم با سوکت نوشتم. سخت نیست. ولی بدون باگ نوشتنش سخت؟ نه مصیبته. معمولا برقراری این ارتباط برای برنامه های اندرویدی در راستای کسب درآمد بیشتره. پس حتی یک کلاینت که پیغام رو دریافت نکنه مهمه
hamidd 12 سال پیش
قربون U
hamidd 12 سال پیش
رفتار فایر والها با سوکت که باگ تلقی نمیشه. لازمه برنامه رو به فایروال شناسوند. حالا یا به صورت برنامه نویسی یا به صورت دستی.
باگ هر چیزیه که رفتار برنامه رو از اون چیزی که توقع داری دور کنه. قابلیتهای جدیدی که بوجود میان و پایدار میشن قطعا در جعت رفع نواقص امکانات قبلین. سوکت خوبه ولی در شرایط کنونی بهترین انتخاب نیست. ضمنا صرفا در صورتی که ادمین باشی دسترسی تنظیمات فایروال رو داری. در حالات جدیدتر نیازی به این کار نیست و با پورت 80 کار رو انجام میدی.
hamidd 12 سال پیش
به طور کلی چون رو PHP زیاد کار شده و امتحان خودشو پس داده و پایدار شده، منم PHP رو توصیه می کنم .
hamidd 12 سال پیش
شناسوندن برنامه به فایروالها به هر طریقی رفتار برنامه رو از اون چیزی که توقع داریم دور نمی کنه بلکه نزدیکتر می کنه.
محمد حسین زاده 12 سال پیش

بدنه تابع معمولی نوشته میشه

یه سری کلاینت هستن که سمت سرور رجیستر شدن. یه شناسه دارن که لزوما SessionId نیست

تابع شما خروجی خودشو میسازه ، به همه کلاینتایی که ممکنه با هر کدوم از روش های بالا متصل باشن دیتا رو ارسال میکنه

یه سری کد های سمت کلاینت رو برات میذارم شاید واضح تر بشه :

Long polling

function getNewInfo(){
$.ajax("url", function (newinfo) {
// do something with the data
// start the new request
getNewINfo();
});
}
// start the polling loop
getNewInfo();

Server Sent Events

var eventSrc = new EventSource("url");
// register event handler for the message
eventSrc.addEventListener( "message",function (evt) {
//process the data
});

Web sockets

var socket = new WebSocket("url");
socket.onmessage = function (msg) {
var newInfo = msg.data;
// do something with the data
}
// client can also send request to server
socket.send(.... )

توجه کن که اینها کلاینت هستن. سرور هم بر اساس داشته های خودش و فریمورک انتخابی شما این درخواستها رو پردازش میکنه

مدل Periodic polling هم که بالا بهش اشاره ای نکردم اینه :

function getInfo() {
$.ajax("url", function ( newInfo){
if ( newInfo != null) {
// do something with the data
}
});
// poll again after 20 seconds
setTimeout(getInfo,20000);
}
// start the polling loop
getInfo();

پر واضحه که منابع سرور و کلاینت رو درگیر میکنه و خیلی تفاوت با حالت Forever frame نداره

نظرات

مجتبی یگانه 12 سال پیش
خیلی ممنون :) ، خیلی به جا بود تقریبا متوجه شدم ، اما یه شبه دیگه ، SSE در رویداد خاصی درخواست میده ، پاسخ می گیره و ارتباط رو قطع میکنه ؟ ، اگر اینطور تصور کنیم ، Web Service های برنامه ی اندوریدمون SSE هستن ، چرا که با یک رویداد مثل باز شدن برنامه درخواستی به سرور فرستاده میشه و جوابش رو میگیره ، Connectino.close() z اجرا میشه - اما در مورد Web Sockets : آیا چیزی شبیه به استریمینگ هست که ما Write کنیم و کلاینت Read کنه و برعکس ؟ - فکر کنم دیگه وقتشه خودم Socket Programming رو شروع کنم ، به نظرتون java php انتخاب مناسبی برای شروع هست ؟ - دوباره خیلـــــــــــــی ممنون
خیر. sse به ارسال های سرور گوش میده! وب سرویس های ما 1 درخواست - 1 پاسخ - قطع ارتباط هستن. WebSocket امکان ارتباط دوطرفه بین کلاینت و سرور را در قالب یک اتصال TCP فراهم می کنه. جاوا برای کلاینت اندرویدی مناسبه ولی با مقایسه امکانات، من هیچ وقت سمت php برای سرور نمیرم. اگه php تنها گزینه هست خوب چرا که نه!
مجتبی یگانه 12 سال پیش
ممنون ، بله ، فعلا php تنها گزینه ی روی میزه :))) ، البته asp مبتدی بلدم اما فعلا php رو ترجیح میدم
override 12 سال پیش
در این لینک یه مطلب پیدا کردم در مورد پروسه اجرای WebSocket server با php و ساختن یه کلاینت برای ارسال دریافت اطلاعات بر مبنای پروتکل webSocket 'گفتم شاید مفید باشه.
یه سری کامنت تو نوتیفای من هست که اینجا نمیبینم، قضیش چیه؟
override 12 سال پیش
من برای اولین پاسخ شما کامنت داده بودم.یه خرده برید بالاتر :)
مجتبی یگانه 12 سال پیش
mr.neo : میشه تفاوت بین long polling و web sockets رو توضیح بدید بعد تعریف sse برای من یه کم گنگ هست کلاً تفاوت بین نحوه ی دریافت دیتا در این تکنیک ها چیه؟آیااین روش ها پروتکل محسوب میشن؟ بعد مفهوم socket چیه؟انتظار ندارم در مورد همه ی سوال هام توضیح بدید اگر لینکی چیزی هم بذارید ممنون میشم.
مجتبی یگانه 12 سال پیش
mr.neo :در این لینک یه مطلب پیدا کردم در مورد پروسه اجرای WebSocket server با php و ساختن یه کلاینت برای ارسال دریافت اطلاعات بر مبنای پروتکل webSocket 'گفتم شاید مفید باشه.
مجتبی یگانه 12 سال پیش
mr.neo :در این لینک یه مطلب پیدا کردم در مورد پروسه اجرای WebSocket server با php و ساختن یه کلاینت برای ارسال دریافت اطلاعات بر مبنای پروتکل webSocket 'گفتم شاید مفید باشه.
مجتبی یگانه 12 سال پیش
mr.neo :از همه اینا من فقط long polling رو اونم تازه شاید متوجه شده باشم.
محمد حسین زاده 12 سال پیش

در مورد کامنت های mr.neo

sse راهکار یکطرفه سرور به کلاینت تحت استاندارد html5 هستش. یعنی در محیط مرورگر با کلاینت جاوااسکریپتی غالب محیط پیاده سازی رو تشکیل میده

long polling برقراری ارتباط طولانی مدت تا دریافت جواب سروره در حالیکه web sockets راهکار ارتباط دو طرفه کلاینت سروریه

این روش ها بر پایه tcp عمل میکنن

نظرات

override 12 سال پیش
ممنون، هنوز خیلی سوال دیگه دارم ولی فعلاً رفتم یه کم بیشتر در موردش اطلاعات جمع کنم.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .