آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

مجتبی یگانه  12 سال پیش  11 سال پیش
+16 0

سلام

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

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

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

ممنون

0 0
ممنونم (12 سال پیش)
0 0
بابت چی ؟ D: (12 سال پیش)
0 0
گفتم یه چیزی گفته باشم :) (12 سال پیش)
0 0
آها ، واسه مشترک شدن ! مبحث خیلی خوبیه :) - به قول خودتون اگه از سوال خوشتون اومد لایک کنید ! (12 سال پیش)
0 0
حتما به استاد لینک این سوال را پیام شخصی بده که آخر شب اومد یه توضیح کامل بده ... هدف اصلی را هم براش توضیح بدی بهتره (12 سال پیش)
0 0
هدف که کاملا مشخصه ، تولید اورانیم غنی شده با غلظت بالا و کیک زرد خوشمزه :)) - راه اندازی Push Notification روی سرور شخصی خودم ! (12 سال پیش)
0 0
البته تو یه تاپیک فکرنم توضیح داده بود (12 سال پیش)
0 0
بحث جالبیه، با اجازه منم مشترک میشم :) (12 سال پیش)
0 0
ممنون ، (مشترک) :) (12 سال پیش)
0 0
پس منم مشترک شدم. یه پیشنهاد هم به استاد میدم. که وقتی دکمه ستاره رو زدیم یعنی از موضوع خوشمون اومده دیگه یا برامون مهمه. پس اتوماتیک مشترک بشیم :) (12 سال پیش)
0 0
مشتــــــــــــــــــــــــــــــــــــــــــــــــــــــرک (12 سال پیش)
0 0
با این استقبالی که شده ، بهتر استاد یه سری ویدیو در این رابطه تدوین کنند :) (12 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
محمد حسین زاده  12 سال پیش
+14 0

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- خیر. اول کلاینت خودشو رجیستر میکنه. حتی در وب سوکت هم آغاز با کلاینته، بعدا سرور میگه کاربرجان و الی آخر

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

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

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

 Domain.com/Appserver.php

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

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

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

NotifyUser(int ClientID, String ResponseJson){

}

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

ممنون

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

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

یه سری کلاینت هستن که سمت سرور رجیستر شدن. یه شناسه دارن که لزوما 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 نداره

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

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

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

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

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

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

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