سوالات مبتدی در مورد سوکتینگ
سلام
این مجموعه سوالاتی هست که تو ذهنم در مورد Web Socketing ایجاد شده ، اما منبع فارسی مناسب پیدا نکردم ، در مقاله های انگلیسی هم که یا سطح بالا توضیح داده شده یا انگلیسی من جوابگو نیست D: ، مثل این لینک
- یه توضیح مختصر در مورد سوکتینگ !
- آیا برای سوکتینگ نیاز هست که یک ارتباط همیشه زنده (Alive) نکه داشته باشه ؟
- (اگر 2 بله ) آیا برای Keep Alive یا زنده نگه داشتن این ارتباط باید مقداری از پهنای باند کاربر در هر لحظه ی این ارتباط مصرف بشه ، یا فقط در زمان تبادل داده ؟
- ( اگر 2 خیر ) آیا سرور میتونه برسی کنه که آیا کاربر آنلاین هست یا کاربر باید خودش درخواست تغییر وضعیت آنلاین آفلاین شدن رو به سرور بده !
- آیا سرور میتونه در ارتباط با کاربری که Ip static نداره ، شروع کننده ارتباط باشه ؟ (یعنی بگه کاربر جان ! ، حالا که به اینترنت وصل هستنید این داده ها رو بگیرید !
در آخر هم اگر منبع خوبی برای شروع سوکتینگ می شناسید ، لطفا معرفی کنید
ممنون
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- خیر. اول کلاینت خودشو رجیستر میکنه. حتی در وب سوکت هم آغاز با کلاینته، بعدا سرور میگه کاربرجان و الی آخر
درک یه موضوع برای من سخته و شاید علتش تجربه ی کم من باشه ، ببخشید :|
ما معمولا با کاربر اینجوری ارتباط برقرار میکنیم
Domain.com/Appserver.php
حالا اگه قرار باشه در یک لحظه کار انجام بشه ، کافیه پاسخ Appserver.php برسی بشه (مثلا برای گرفتن لیست یادداشت های سمت سرور ! )
قرار نیست که کلاینت ما در هر لحظه درخواست بده بگه " چه خبر ! اعلان معلان جدید چی داری ؟! "، پس ارتباط به چه شکل میشه ؟
اگه بخوام رو هوا کد بنویسم اینجوری میگم !
NotifyUser(int ClientID, String ResponseJson){
}
خوب بدنه ی این تابع چیه ؟ ، یعنی چطور این Json رو به ClientID میرسونه ؟
ممنون
بدنه تابع معمولی نوشته میشه
یه سری کلاینت هستن که سمت سرور رجیستر شدن. یه شناسه دارن که لزوما 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 نداره
در مورد کامنت های mr.neo
sse راهکار یکطرفه سرور به کلاینت تحت استاندارد html5 هستش. یعنی در محیط مرورگر با کلاینت جاوااسکریپتی غالب محیط پیاده سازی رو تشکیل میده
long polling برقراری ارتباط طولانی مدت تا دریافت جواب سروره در حالیکه web sockets راهکار ارتباط دو طرفه کلاینت سروریه
این روش ها بر پایه tcp عمل میکنن
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .