در این آموزش ، قصد داریم نحوه ساخت یک چت روم ساده با php و سوکت پروگرمینگ ایجاد کنیم . ساخت چت روم با php و قابلیت HTML5 ساده و جالب است . WebSocket یکی از قابلیت های جالب HTML5 برای ایجاد یک ارتباط (connection) بین یک مرورگر وب و سرور است .
در اینجا درواقع از WebSocket برای ایجاد پلی برای ارسال یا دریافت پیام ها از سرور چت php استفاده می کنیم.
برای ساخت یک ارتباط سوکت بین سرور و کلاینت ، ما از پروتکل WebSocket (ws://) برای ایجاد یک ارتباط دو طرفه بین سرور و کلاینت با اسکریپت php استفاده می کنیم. بعد از ساخت WebSocket ، توابع بازگشتی برای مدیریت رویداد های بین سرور و کلاینت حین پروسه چت وجود داردند . اولین بار که یک کانکشن با سرور ایجاد شد , همه داده های WebSocket که بصورت frame است به جای ارسال درخواست های HTTP , به صورت مستقیم از یک سوکت رد می شود.. این قابلیت به ما امکان پیاده سازی کانکشن های پایدار بین مرورگر و سرور را می دهد.
ساخت WebSocket و مدیریت رویدادها
اسکریپت زیر برای ساخت یک webSocket کلاینت ساید و تعریف توابع بازگشتی برای مدیریت رویداد های مختلف چت ها استفاده می شود. این هندل ها به ما اطلاعاتی در مورد وضعیت اتصال ، پیام ها و هر نوع خطای دیگری را می دهند. پیام ها با فرمت داده JSON کد شده و به سمت سرور ارسال می شوند.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<script> function showMessage(messageHTML) { $('#chat-box').append(messageHTML); } $(document).ready(function(){ var websocket = new WebSocket("ws://localhost:8090/demo/php-socket.php"); websocket.onopen = function(event) { showMessage("<div class='chat-connection-ack'>Connection is established!</div>"); } websocket.onmessage = function(event) { var Data = JSON.parse(event.data); showMessage("<div class='"+Data.message_type+"'>"+Data.message+"</div>"); $('#chat-message').val(''); }; websocket.onerror = function(event){ showMessage("<div class='error'>Problem due to some Error</div>"); }; websocket.onclose = function(event){ showMessage("<div class='chat-connection-ack'>Connection Closed</div>"); }; $('#frmChat').on("submit",function(event){ event.preventDefault(); $('#chat-user').attr("type","hidden"); var messageJSON = { chat_user: $('#chat-user').val(), chat_message: $('#chat-message').val() }; websocket.send(JSON.stringify(messageJSON)); }); }); </script> |
برنامه نویسی سوکت برای ساخت چت روم با php
کد php زیر درخواست یک کانکشن جدید سوکت را برررسی می کند . اگر هر درخواست اتصال جدید پیدا شد ، بعد با ایجاد یک ارتباط سه طرفه یک سوکت را ایجاد می کند و سپس اطلاعاتی در مورد اتصال به صورت اینکد شده ارسال می کند.
بعد از دریافت اطلاعات از اتصال فعلی و دیکد کردن ، آن را به کلاینت چت ارسال میکند . همه این موارد توسط کلاس ChatHandler مدیریت می شود.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php define('HOST_NAME',"localhost"); define('PORT',"8090"); $null = NULL; require_once("class.chathandler.php"); $chatHandler = new ChatHandler(); $socketResource = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socketResource, SOL_SOCKET, SO_REUSEADDR, 1); socket_bind($socketResource, 0, PORT); socket_listen($socketResource); $clientSocketArray = array($socketResource); while (true) { $newSocketArray = $clientSocketArray; socket_select($newSocketArray, $null, $null, 0, 10); if (in_array($socketResource, $newSocketArray)) { $newSocket = socket_accept($socketResource); $clientSocketArray[] = $newSocket; $header = socket_read($newSocket, 1024); $chatHandler->doHandshake($header, $newSocket, HOST_NAME, PORT); socket_getpeername($newSocket, $client_ip_address); $connectionACK = $chatHandler->newConnectionACK($client_ip_address); $chatHandler->send($connectionACK); $newSocketIndex = array_search($socketResource, $newSocketArray); unset($newSocketArray[$newSocketIndex]); } foreach ($newSocketArray as $newSocketArrayResource) { while(socket_recv($newSocketArrayResource, $socketData, 1024, 0) >= 1){ $socketMessage = $chatHandler->unseal($socketData); $messageObj = json_decode($socketMessage); $chat_box_message = $chatHandler->createChatBoxMessage($messageObj->chat_user, $messageObj->chat_message); $chatHandler->send($chat_box_message); break 2; } $socketData = @socket_read($newSocketArrayResource, 1024, PHP_NORMAL_READ); if ($socketData === false) { socket_getpeername($newSocketArrayResource, $client_ip_address); $connectionACK = $chatHandler->connectionDisconnectACK($client_ip_address); $chatHandler->send($connectionACK); $newSocketIndex = array_search($newSocketArrayResource, $clientSocketArray); unset($clientSocketArray[$newSocketIndex]); } } } socket_close($socketResource); ?> |
و کلاس ChatHandler به اینصورت است :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
<?php class ChatHandler { function send($message) { global $clientSocketArray; $messageLength = strlen($message); foreach($clientSocketArray as $clientSocket) { @socket_write($clientSocket,$message,$messageLength); } return true; } function unseal($socketData) { $length = ord($socketData[1]) & 127; if($length == 126) { $masks = substr($socketData, 4, 4); $data = substr($socketData, 8); } elseif($length == 127) { $masks = substr($socketData, 10, 4); $data = substr($socketData, 14); } else { $masks = substr($socketData, 2, 4); $data = substr($socketData, 6); } $socketData = ""; for ($i = 0; $i < strlen($data); ++$i) { $socketData .= $data[$i] ^ $masks[$i%4]; } return $socketData; } function seal($socketData) { $b1 = 0x80 | (0x1 & 0x0f); $length = strlen($socketData); if($length <= 125) $header = pack('CC', $b1, $length); elseif($length > 125 && $length < 65536) $header = pack('CCn', $b1, 126, $length); elseif($length >= 65536) $header = pack('CCNN', $b1, 127, $length); return $header.$socketData; } function doHandshake($received_header,$client_socket_resource, $host_name, $port) { $headers = array(); $lines = preg_split("/\r\n/", $received_header); foreach($lines as $line) { $line = chop($line); if(preg_match('/\A(\S+): (.*)\z/', $line, $matches)) { $headers[$matches[1]] = $matches[2]; } } $secKey = $headers['Sec-WebSocket-Key']; $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))); $buffer = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . "Upgrade: websocket\r\n" . "Connection: Upgrade\r\n" . "WebSocket-Origin: $host_name\r\n" . "WebSocket-Location: ws://$host_name:$port/demo/shout.php\r\n". "Sec-WebSocket-Accept:$secAccept\r\n\r\n"; socket_write($client_socket_resource,$buffer,strlen($buffer)); } function newConnectionACK($client_ip_address) { $message = 'New client ' . $client_ip_address.' joined'; $messageArray = array('message'=>$message,'message_type'=>'chat-connection-ack'); $ACK = $this->seal(json_encode($messageArray)); return $ACK; } function connectionDisconnectACK($client_ip_address) { $message = 'Client ' . $client_ip_address.' disconnected'; $messageArray = array('message'=>$message,'message_type'=>'chat-connection-ack'); $ACK = $this->seal(json_encode($messageArray)); return $ACK; } function createChatBoxMessage($chat_user,$chat_box_message) { $message = $chat_user . ": <div class='chat-box-message'>" . $chat_box_message . "</div>"; $messageArray = array('message'=>$message,'message_type'=>'chat-box-html'); $chatMessage = $this->seal(json_encode($messageArray)); return $chatMessage; } } ?> |
برقراری اتصال توسط خط فرمان (command line)
تصویر زیر عکسی از خط فرمان برای ایحاد یک کانکشن با سیستم چت را نشان می دهد :
خروجی ساخت چت روم با php :
هرگونه سوال یا مشکلی داشتید یا اینکه قصد توسعه اسکریپت را دارید لطفا از قسمت نظرات با ما در ارتباط باشید . ممنونم . موفق باشید
سلام
ممنون از آموزش خوبتون
درپاسخ به یکی از سوالات شما فرمودید بجای command line از cronjob استفاده کنیم
در پاسخ به سوال دیگری فرمودید در هاست اشتراکی از این برنامه نمی شه استفاده کرد و حتما باید از سرور مجازی استفاده کنیم
من ratchet websocket رو در xampp به خوبی اجرا کردم و از هاستی استفاده می کنم که به ssh و terminal دسترسی دارم و می تونم فایل server.php رو اجرا کنم . با ترمینال اجرا می کنم اما بدلیل بسته بودن پورتها برنامه من کار نمی کند.
اینطور که متوجه شدم در هاست اشتراکی پورتها باز نیستند.
آیا هیچ راهی برای استفاده از سوکت در هاست اشتراکی وجود ندارد؟
از پاسخ های شما به سوالات متوجه نشدم به هر حال از برنامه ای که شما در این آموزش قرار دادید در هاست اشتراکی می شود استفاده کرد یا خیر؟
سلام.
بله روی هاست اشتراکی نمیتونید استفاده کنید
سلام
http://uplod.ir/au5x35vg60d5/2021-01-16_215435.png.htm
من این فایلارو آپلود کردم ولی سایت لینکی به من نمیده
من قبلا توی این سایت فایلامو آپلود می کردم لینک میداد ( منظورم فایل های html هست)
بعد پسوند فایل index.php رو به html تغییر میدم لینک میده ولی پیام ها ارسال نمیشه!
تروخدا بگید چیکار کنم.
سلام.
روی لوکال هاست میتونید تست کنید این موارد رو و نیاز به هاست رایگان ندارید
سلام و خسته نباشید . این ران کردم پیام ها ارسال نمیشن چرا
سلام ممنون.
باید باز کردن پورت بدرستی انجام بشه
سلام میخواستم بپرسم این برنامه رو دایرکت ادمین هاست اجرا میشه
چون محیط command برای php -q http://localhost/demo/php-socket.php
نداره
با تشکر
سلام. خیر ولی میتونید از cron job برای اجرای این دستور استفاده کنید
سلام آقای شفیعی
میخواستم بدونم دقیقا کار تابع doHandshake چیه ؟؟؟
و اینکه چطوری میتونم resource سوکت کاربرانی که متصل شده اند رو ببینم یا در یک فایل text بنویسم (میخوام بدونم چی به چیه) ؟
این کار رو انجام میدم ولی فایل خام هست و چیزی توش نوشته نمیشه
این کد ها رو بعد از خط socket_accept اضافه میکنم ولی جواب نمیده و فایل خالی ذخیره میشه
$h = fopen(“d:\socket.txt”, “a+”);
fwrite($h, json_encode($socketResource));
fwrite($h, PHP_EOL);
fwrite($h, json_encode($spawn));
fclose($h);
سلام.
در فایل جزییات تابع doHandshake قابل مشاهده است و اگر ببینید متوجه می شوید که با تابع socket_write یک سوکت را باز و اطلاعات به آن پاس داده می شود.
آدرس دهی رو چک کنید و قبل ذخیره حتما $socketResource رو بررسی کنید که آیا مقداری دارد یا خیر.
موفق باشید.
سلام وقتتون بخیر باشه .
اول از همه ممنون بخاطر توضیحات خوبتون . من تونستم کد رو اجرا کنم که این به لطف شماست
دو تا سوال داشتم
۱- سایت هایی که خدمات پشتیبان آنلاین میدن ( چت آنلاین با کاربر سایت ها ) از سوکت استفاده می کنن ؟ چون با آجاکس به نظرم به سخت افزار بالایی نیاز باشه
۲- من میخوام برای سایت خودم که قبلا با سیستم آجاکس سیستم پشتیبان آنلاین طراحی کردم با استفاده از سوکت این سیستم رو دوباره طراحی کنم .
پیشنهاد شما برای بهترین نوع طراحی سیستم پشتیبان آنلاین برای سایتم چی هست ؟
من این کد رو خوندم اما خوب بدون شک نیاز به مطالعه ی بیشتر داره . برای هر کاربری که آنلاین میشه یک فیلد جدید تو بانک داده ی خودم میسازم و اون کد رو توی سیشن میریزم تا این کاربر یک کلید برای چت آنلاین با پشتیبان داشته باشه .
حالا ثبت اطلاعات اتفاق سختی نیست با کدی که دادین اما میخوام کاربر رسیو اطلاعاتش رو ( مثل سیستم آجاکس که هر ۵ ثاتیه رفرش میکرد ) هر زمان پشتیبان مثلا متنی رو براش نوشت همون زمان با استفاده از این سیستم دریافت اطلاعات از بانک داده انجام بشه . ) یکم در هم نوشتم . ممنون میشم به شکل کلی راهنمایی کنین
سلام. ممنون. خوشحالیم که مفید واقع شده.
۱. بله می تونید استفاده کنید البته برای کارایی بیشتر از زبان های nodejs یا python برای همچنین سیستم های real-time استفاده میشه که خب با php مطمینا کمی سخت افزار رو باید ارتقا بدید.
از کتابخانه ratchat متعلق به socketo.me برای طراحی چت آنلاین استفاده کنید تا از حداکثر کارایی این امکان بهره ببرید و داکیومنت هم واقعا کامل و جامع است و سوال و جواب های مربوطه فراوان که خیلی در مرحله توسعه میتونه کمک کنه.
موفق باشید.
سلام مجدد آقای شفیعی عزیز .
ممنون بخاطر راهنماییتون .
و شرمنده به خاطر اینکه باز هم دارم وقتتون رو میگیرم .
۱- بین نود جی اس و پایتون کدوم رو انتخاب کنم بهتره ؟ یعنی کدومشون توی سیستم های ریل تایم بهتر جواب میده ؟ و دوم اینکه راه اندازی کدوم روی سرور بهتر هست ؟
برای شروع این کار بهتره یادگیری رو از کجا شروع کنم ؟ از مقدماتی نود جی اس ؟
سلام. خواهش می کنم.
نود جی اس از هر لحاظر گزینه بهتری برای ریل تایم هست.
بله از مقدماتی nodejs شروع کنید https://www.tutorialspoint.com/nodejs/
موفق باشید.
یه سوال دیگه هم دارم.
میشه با وب سوکت عکس هم ارسال کرد ؟
سلام. بله میتونید تصویر رو بصورت base64 اینکد و بعد در فرمت صحیح آن در کد HTML بصورت embed شده ارسال و نمایش بدید.
به جای [CODE] باید کد base64 تصویر را ارسال کنید که این کد را با یک زبان سمت سرور مثل php یا ابزار آنلاین https://www.base64-image.de می توانید بدست بیارید.
موفق باشید.
سلام وقتتون بخیر خسته نباشید.
بنده سرور ابنتو خریدم.
و لمپ را نصب کردم. و در مشخصات phpinfo() وب ساکت enabeld می باشد.
و در پوشه /var/www/html هر سه فایلی که در لب تاب خودم به خوبی کارمیکرد رو برای چت قرار دادم.
و در فایل index.php به جای localhost در متن زیر آی پی سرور را قرار دادم.
new WebSocket(“ws://localhost:8090/php-socket.php”);
و در فایل php-socket.php به جای localhost آی پی سرور را در متن زیر را قرار دادم.
define(‘HOST_NAME’,”localhost”);
اما وقتی در مرورگر برای اجرا باز میکنم عمل نمیکند.
در قسمت چت روم بالا هیچ متنی اعم از وصل شدن یا نشدن ارسال نمیشود.
کارهایی که انجام دادم درست نبوده است ؟
یا کار دیگه ای هم باید انجام میدادم ؟
ممنون از پاسخگویی
سلام ممنون.
ابتدا باید اطمینان حاصل کنید که پورت مورد نظر ۸۰۹۰ به درستی در سرور اوپن شده و قابل استفاده است و ورودی ها توسط فایروال ریجکت نمیشه که معمولا با باز کردن پورت و حالت listen گذاشتن پورت این مشکل حل میشه
اگر مشکل پورت مورد نظر باشه مطمینا بعد از باز کردن آن با اجرای ws://IP:8090/file.php نتیجه را خواهید دید.
موفق باشید.
سلام وقت بخیر بنده ند های بالا رو داخل زمپ اجرا گردم و کار کرد.
ولی داخل هاست اشتراکی اجرا نشد.
وب ساکت فعاله.
از طریق کرون جاب هم فایل رو اجرا کردم ولی نشد.
اگه امکان داره یه آموزش مختصر برای اجرای گدهای بالا در هاست منتشر کنید.
ممنون.
یه پروژه هم دارم اگر وقت برای انجامش دارین به شماره بنده پیام بدین ممنون.
سلام ممنون. داخل هاست اشتراکی چون یک سرور بین کلاینت های زیادی از جمله شما مشترک است برای همین اجازه ست کردن پورت های ورودی incomming به لوکال سرور رو نمی دن .
همچنین شما برای اینکار نیاز به دسترسی به شل دارید که بعضی بسته به شرکت هاستینگ این گزینه هم ممکن است وجود نداشته باشه یا برای انجام این کار نیز محدود باشه.
پس نیاز که یک سرور مجازی یا اختصاصی رو برای اینکار انتخاب کنید.
erorr:http://uploader.vcn.ir/download/31bhna5rqszzq6tf23du5v7hn
شما باید بتونید با سرچ کردن ارور ها با نحوه رفع انها آشنا باشید . این توی برنامه نویسی جز موارد پایه است و بهتره دیباگینگ رو یاد بگیرید.
به هر حال پورت مورد نظر اشغال است که با این دستور netstat -an میتوانید ببنید پورت ها توسط چه سرویسی در حال استفاده هستند. پس با تغییر پورت مشکل شما حل میشه
موفق باشید.
سلام
من به این مشکل برخوردم
http://uploader.vcn.ir/download/uuil8pvzkvyb8ccwxqjb0uyx0
سلام . نیاز است که extension=php_sockets.dll را از طریق فایل php.ini فعال و بعد وب سرور را ریستارت کنید.
موفق باشید.
سلام
این کد مشکل داره لطفا بررسی کنید بعضی از پارامتر ها پر نشده ارور میده
روی لوکال تست کردم
سلام . هیچ مشکلی نداره . سورس کد کامل رو دانلود و اون رو اجرا کنید.
موفق باشید.
سلام
ممنون بابت مطلب خوبتون
اما من توی پروژه که با php میخوام وقتی x دیتابیس رو آپدیت کرد بدون اینکه y ریکوست بزنه آپدیتو به y بفرسته چند جا خوندم که سوکت ای او و نود جی اس اما اونا برای چت بود آیا میشه همچین سندی از سرور بدون ریکوست کاربر در موقع آپدیت دیتابیس سرور داشت؟
میشه لینک مطلب بهم بدین؟
سلام . خوشحالم که مفید واقع شده.
دقیقا متوجه نشدم چه موردی رو قصد دارید پیاده کنید . اگر واضح تر توضیح میدادید من و یا دوستان میتونیم پاسخ مناسبی رو براتون ارسال کنیم.
سلام
ممنون از سایت خوبتون
برنامه رو اجرا کردم خیلی عالی بود چطوری میشه با سوکت پیام خصوصی به یکی از کاربر ها ارسال کرد؟
سلام . خوشحالم که مفید واقع شده .
هر کلاینتی که متصل می شود یک id و یک آبجکت حاوی اطلاعاتی از کانکشن را دارد که با دسترسی به آن می توانید به هر یوزر خاصی پیامی خصوصی بفرستید که فقط از کانکشن کلاینت مورد نظر رد میشه و به شخص میرسه .
موفق باشید.
سلام حسین جان
وبسایت و مطالبت خیلی عالیه من در قسمتهایی از php که کار نکردم وقتی سرچ میکنم یکی از وبسایتهایی که مطالب جدیدی از php ارائه داده این وبسایته.
راستش من در قسمت streams یا همون جریانها در php مشکل دارم و ازش سردرنمیارم در سطح وب فارسی هم مطلبی در موردش پیدا نکردم اگر امکان داره در این مورد مطلب قرار بدید.
ممنون.
سلام . ممنون . خیلی خوشحالم که مورد رضایت شما دوست عزیز قرار گرفته
در یکی از نظرات بصورت خلاصه در این مورد توضیح دادم که میتوانید مطالعه کنید.
https://netparadis.com/access-form-data-from-php/
حتما انشالا بزودی مطلب کاملی در این مورد تهیه و اطلاع رسانی خواهد شد
موفق و پیروز باشید.
سرور مجازی دارم و این افزونه ها هم نصب هستن و فعال هم هستن اما نمی دونم چطوری باید تنظیمشون کنم
همین مورد رو در سایتهای خارجی هم گفته بودن و یک مثال هم زده بودن اما تست کردم جواب نداد.
اگر بتونید در این مورد کمک کنید خیلی ممنون میشم چون وجود ssl برام ضروری هست.
این مورد معمولا جواب میده اگر براتون مقدور بود اطلاعات سرور رو از طریق ایمیل اصلی سایت در بخش تماس با ما ارسال کنید تا بعد از بررسی نتیجه نهایی را برای شما ارسال کنم .
موفق باشید
به ایمیل سایتتون ارسال کردم:
totalsec99{@}gmail.com
سلام منتظر اعلام نتیجه هستم
سلام شرمنده فرصت نشد برزسی کنم . از طریق تلگرام اطلاع میدم
موفق و پیروز باشید
درود بر شما؛ همچنان منتظر تماس تلگرامی شما هستم.
۰۹۱*****۰۴
سلام
پاسخ ارسال شد .
سلام مجدد، تلگرام خودتون رو چک کنید اطلاعات مورد نیاز رو ارسال کردم.
با تشکر
با سلام
آموزش مفیدی هست
ازتون می خوام در مورد هماهنگ سازی وب سوکت با ssl راهنمایی بفرمایید هر چقدر روی سایتهای خارجی بررسی کردم نتیجه نگرفتم.
سلام . خوشحالم که مفید واقع شده .
برای اینکار باید یک سری تنظیمات در وب سرور خودتون انجام بدید . اگر از سرور اشتراکی استفاده می کنید معمولا این دسترسی را ندارید و لی اگر سرور مجازی و یا اختصاصی دارید میتوانید ماژول های
mod_proxy.so
mod_proxy_wstunnel.so
و از ProxyPass در فایل کانفیگ httpd.conf بهره ببرید .
موفق باشید.
با سلام
ضمن تشکر از مطالب بسیار مفید شما.یه سوال از خدمتتون داشتم.فرض کنید همه کلاینت ها آنلاین هستند و ارتباطشون برقراره و توی همین موقعیت برای چندتا از همین کاربرها توی سرور یک رویداد جدید بوجود میاد و لازمه به اونها خبر بدین ، چطور می تونیم به متد Send یک کلاینت توی وب سوکت از یکجای دیگه کدهای php دسترسی داشته باشیم تا بتونیم برای این کلاینت ها رویداد رو بفرستیم(به طور ساده تر یعنی سرور بدون نیاز به کلاینت و متد Onmessage خودش بتونه هروقت خواست برای کلاینت های متصل دیتا ارسال کنه؟) سوال و کدهای من توی سایت استک آور فلوو هست ، لطفا راهنمایی بفرمایید واقعا به این موضوع نیاز دارم. باتشکر
https://stackoverflow.com/questions/46846645/how-to-send-data-to-some-clients-in-ratchet-websocket-from-out-of-messagecompone
سلام . خواهش میکنم . این مورد رو حقیقتا تست نکردم . بعد از بررسی پاسخ رو ارسال می کنم .
موفق باشید.
این مورد هم کار سختی نیست کافیه با یک حلقه for به تمام کلاینتهای متصل پیامت مورد نظر رو Send کنید
دوست عزیز، فناوری WebSocket فقط برای درست کردن چت نیست، هزاران کاربرد بزرگتر و بیشتری داره
درضمن چیزی بنام ارتباط ۳ طرفه وجود نداره، مگر اینکه منظورت دوطرفه همزمان باشه
مطلب رو اصلاح کنید و از انتشار مطالب اشتباه خودداری کنید!
در این مقاله به هیچ وجه سعی در تشریح تمام قابلیت های websocket نداشتم . فقط از آن برای ساخت یک ارتباط بین کلاینت و سرور برای ارسال و دریافت پیام استفاده کردیم همین !! .همچنین هر کانکشن HTTP باید یک TCP handshake که یک ارتباط ۳ طرفه است داشته باشد بنابراین ما در هنگام استفاده از websocket دو ارتباط ۳ طرفه داریم . برای فهمدین موضوع ارتباط سه طرفه این عبارت را جستجو کنید
TCP 3-way handshake
موفق باشید !
با سلام و تشکر از مطالبتون
یه سوال داشتم ، من درحال ساخت یه وب سایت فول ajax هستم که تا به الان تقریبا تموم شده و الان برای دریافت realtime رویداد های جدید هر کاربر به صورت نوتیفیکیشن قصد دارم از وب سوکت ratchet استفاده کنم، آیا کانکت بودن وب سوکت با سرور و درخواست های هم زمان ajax یک کلاینت تداخلی ایجاد نمی کنه ؟ از نظر پرفرمنس و سرعت چطور ؟ لطفا راهنمایی بفرمایید.
تشکر از شما مهندس عزیز
سلام . خواهش می کنم .
نه وب سوکت با ایجاد یک کانکشن tcp پایدار (stable) به شما این اطمینان خاطر را می دهد که به هیچ وجه تداخلی با request های دیگه ای که توسط ajax ارسال و نتیجه آن دریافت می شود ، وجود نخواهد داشت . با خیال راحت از این قابلیت در پروژتون استفاده کنید .
سلام و عرض ادب و احترام خدمت جناب شفیعی
آقای شفیعی . بنده قصد دارم کدهای این چت روم رو به گونه تغییر بدم که بتونم به صورت خصوصی پیام ارسال کنم. با توجه به منابعی که در بالا به بنده ارائه دادید قصد داشتم این کار رو انجام بدم. اما هر کاری می کنم نمیشه با این چت روم این کار رو کرد. میشه بنده رو راهنمایی کنید که چطور می تونم این چت روم رو به گونه ای تغییر داد که بشه به صورت خصوصی پیام ارسال کرد ؟
با تشکر از تمام راهنمایی هاتون …
در سایت رسمی php درباره ی socket_select به این صورت توضیح داده :
socket_select() accepts arrays of sockets and waits for them to change status. Those coming with BSD sockets background will recognize that those socket resource arrays are in fact the so-called file descriptor sets. Three independent arrays of socket resources are watched.
اما دقیق متوجه نمیشم که منظورش چیه !!!
کار تابع socket_select مدیریت کانکشن ها است تا اینکه بررسی کند آیا یک سوکت قابل خواندن است یا نه آیا مشکلی برای یک سوکت پیش اومده یا نه که همانطور که میبینید در یک حلقه قرار دادیم . بنابراین تابع socket_select برای مانیتور کلاینت ها استفاده می شود و ببیند کدوم کلاینت چه پیامی را ارسال کرده است
با تشکر از جناب مهندس .
امکانش هست به بنده نیز توضیح بدید که کار تایع socket_select در خط ۱۷ چیه ؟
ممنون
مطلب خیلی خوبی بود . خیلی به دردم خورد . تشکر .
جناب مهندس ! این برنامه چت توانایی چت کردن گروهی برای چند نفر رو داره ؟ به طور کلی در بحث سوکت ، چند نفر می تونن به سوکت کانکت بشن و باهم به تبادل اطلاعات بپردازن ؟ آیا این مسئله به سخت افزار سرور نیز مرتبط هست ؟
خواهش می کنم . بله کاملا بستگی به میزان ریسورس های سرور از قبیل cpu و memory داره ولی سیستم های لینوکسی امروزی با این دیزاین خوب کرنل می تونند با یک رم ۳۰گیگاباتی تا ۱ میلیون کانکشن TCP فعال را به طور همزمان handle یا مدیریت کنند . حالا بر حسب اگر ۱۰۰هزار کلاینت فعال داشته باشید این مقدار منابع سخت افزاری بسیار بسیار پایین تر خواهد بود . پس مطمین باشید اگر تعداد کاربران فعال بیشتر از حد نباشه می تونید با یک سرور معمولی یک ارتباط stable (پایدار) را ایجاد کنید . همچنین خود وب سرور ها و php به طور پیش فرض مقادیری برای محدودیت کانکشن های TCP دارند که برای کانکشن های بسیار زیاد باید این مقدار پیش فرض رو تغییر بدید . در آپاچی این مقادیر با تغییر MaxClients و ServerLimit امکان پذیر است .
http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients
ممنون و تشکر بابت راهنمایی های عالی تون .
شما نیز موفق و پیروز باشید …
بسیار بسیار از لطف تون ممنونم . منابع واقعا عالی بودن جناب شفیعی. باز هم تشکر.
جناب شفیعی . سوال دیگه ای هم داشتم که ممنون میشم راهنماییم کنید. البته این سوال می تونه سوال خیلی از مخاطبین شما که این مطلب را در سایت شما مطالعه می کنن نیز باشه.
شما در پایان مطلب ( مقاله ) تون ، نحوه ی برقراری اتصال توسط خط فرمان (command line) رو توضیح دادید. خب این برای زمانی هست که ما بخواهیم این چت روم رو در کامپیوتر خودمون یعنی در لوکال هاست اجرا کنیم. اگر بنده بخواهم همین چت روم رو به هاست واقعی ببرم چطور باید این کار رو انجام بدم ؟ آیا در هاست واقعی نیز command line وجود داره ؟
ممنون میشم در این باره توضیحاتی رو ارائه بدید.
با تشکر از زحماتتون …
خواهش می کنم . در هاستینگ مقوله ای به اسم cronjob وجود دارد که می توانید کد مورد نظر را از اونجا اجرا کنید . دسترسی به این ابزار از طریق cpanel هم ممکن هستش .
همچنین اگر توابع اجرای دستورات مثل exec , shell_exec , passthru که از قسمت خروجی تابع phpinfo() و بخش disable_function می توانید ببینید (اگر none باشید ینی تمام توابع قابل اجرا است) , فعال باشد , می توانید command مورد نظر را اجرا کنید .
موفق و پیروز باشید.
با تشکر از راهنمایی تون جناب شفیعی.
حقیقتش من چند روز هست دارم دراین باره تحقیق می کنم اما مقاله ای که به این موضوع بپردازه رو پیدا نکردم .
ممنون میشم منبعی رو به بنده معرفی کنید که به این موضوع یعنی ارسال پیام خصوصی توسط سوکت بپردازه.
با تشکر از راشما
دو اسکریپت بسیار عالی که با این سوکت پیاده سازی شدن را می تونید از github دانلود کنید . امکانات زیادی دارند . همچنین نحوه ارسال پیام خصوصی رو هم نیز در کنار آنها قرار دادم که میتونید استفاده کنید
https://github.com/ratchetphp/Ratchet
https://github.com/ratchetphp/Ratchet/issues/261
https://github.com/ghedipunk/PHP-Websockets
https://github.com/ghedipunk/PHP-Websockets/issues/101
ممنون از راهنمایی تون جناب شفیعی .
جناب شفیعی . این برنامه ی چت مثل یک چت گروهی هست . یعنی هرکسی که متصل شود می تونه به همه ی کسانی که اتصال شون برقرار هست پیام ارسال کنه.
سوال من اینه که :
در بحث سوکت ما چطور می تونیم به یک کاربر خاص پیام ارسال کنیم ؟
مثلا در نرم افزاری مثل تلگرام و … ، آیا برای ارسال پیام بین مخاطبین از سوکت استفاده می شه ؟ اگر از سوکت استفاده میشه چطور ما می تونیم پیام خصوصی ارسال کنیم ؟
ممنون میشم بنده رو راهنمایی کنید .
با تشکر …
خواهش می کنم . بله هر کسی که به این سوکت متصل می شود به صورت یک چت گروهی میتواند پیام ها را ببینید و پیام ارسال کند.
هر کلاینتی که متصل می شود یک id و یک آبجکت حاوی اطلاعاتی از کانکشن را دارد که با دسترسی به آن می توانید به هر یوزر خاصی پیامی خصوصی بفرستید که فقط از کانکشن کلاینت مورد نظر رد میشه و به شخص میرسه .
websocket یک از قابلیت های html5 است با جستجو می توانید نمونه کد های این مورد را به راحتی پیدا کنید .
موفق باشید
با تشکر از مطلب خوب تون. من اجراش کردم و به خوبی کار کرد.
جناب شفیعی ؟ به نظرتون امنیت کدهای بالا در چه حده ؟
من می خوام از سوکت به صورت ارتباط سه طرفه در پروژه ی خودم استفاده کنم . قصد دارم از این کدها در پروژه ام استفاده کنم. می خوام بدونم این کدها از دیدگاه شما امنیت لازم رو داره ؟
سلام . خواهش می کنم . خیلی خوشحال شدم که تونستید با موفقیت کد ها رو اجرا کنید و نتیجه بگیرید .
از لحاظ امنیتی کد ها مشکلی ندارد . با خیال راحت می توانید این کد ها رو در پروژه خودتون استفاده کنیدو آن را گسترش بدید .
برای امنیت بیشتر در اتصالات می توانید از ssl استفاده کنید که البته نیاز به تغییراتی در فایل پیکربندی وب سرور داره .
موفق باشید
با تشکر از مطلب خوبتون
من در لوکال اجرا کردم و اوکی بود ولی برای اجرا در سرور مجازی لینوکسی اجرا نمیشه
آموزشی در دسترس دارید شما؟
خیلی ممنون .
دقیقا به چه مشکل یا اروری برخوردید چونکه من در هر دو مورد تست کردم و کاملا جواب می داد . امکان داد تنظیمات وب سرور و ورژن های php سرور لینوکسی شما متفاوت تر از لوکال هاست شما باشد . همچنین از برقراری اتصال و باز بودن پورت ها و مشخص کردت ip و دایرکتری مورد نظر در اسکریپت هم اطمینان حاصل پیدا کنید
این موارد را بررسی کنید . اگر هم اروری بود اینحا بفرستید چک کنم
بعد از بررسی دوباره نتیجه رو اعلام کنید
موفق باشید