تعداد بازدید: 3269

PHP Socket Programming – Part2

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

Socket Server/Client Program

راه اندازی یک ارتباط سوکت نیاز به یک سری برنامه ها در سمت سرور و یک سری برنامه ها در سمت کلاینت ها می باشد. این کد ها را به دو قسمت PHP Server و PHP Client تقسیم بندی می کنیم.

ابتدا یک سرور باید شروع ارتباط باشد. یعنی تنظیمات اولیه در آن انجام شود و شروع به شنیدن سیگنال های کلاینت ها باشد. (open listen) . این مرحله باید به صورت یک حلقه بی نهایت باشد که هر زمان که لازم بود پیام های کلاینت را دریافت کند. پس سوکت سرور یک برنامه در حال اجرا است. (set_time_limit(-1

پس از آن کلاینت باید از طریق آی پی و پورت به سرور متصل گردد. (open client) به طور کلی کلاینت در سوکت چهار عمل اصلی زیر را انجام می دهد :

  • اتصال به سرور یا ماشین راه دور
  • ارسال داده
  • دریافت داده
  • بستن یا خاتمه اتصال میان کلاینت و سرور

 

php socket programming between client and server

در بالا مرحله دوم و سوم جایی که یک نشست میان سرور و کلاینت برقرار شده است . در این جا داده ها میان سرور و کلاینت رد و بدل می شود.

در ادامه یک مثال از ارتباط سوکت میان یک سرور و یک کلاینت را بررسی می کنیم . به طوری که روی یک پورت سرور و کلاینت با هم ارتباط سوکت برقرار می کنند و کلاینت یک رشته را ارسال می کند و سرور آن رشته را برعکس کرده و به سمت کلاینت می فرستد.

PHP Server – server program

تنظیمات اولیه ) هر سوکت متشکل از یک آی پی و یک پورت می باشد. همچنین برای اجرای کد ها در سرور به طور متمادی و بدون وقفه نیاز داریم تا کد سرور را بدون زمان پایان ادامه دهیم که برای این کار set_time_limit را برابر -1 قرار می دهیم تا کد ها متوقف نشوند.

$host = "127.0.0.1";
$port = 5353;
// No Timeout 
set_time_limit(0);

گام یک ساخت سوکت ) در این مرحله به وسیله تابع create_socket یک سوکت می سازیم .خروجی این تابع یک متغیر یا یک handler می باشد که در مراحل بعدی مورد استفاده قرار می گیرد.

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");
  • پارامتر اول domain می باشد که برای معرفی خانواده پروتکل مورد استفاده قرار می گیرد.
  • پارامتر دوم type نوع ارتباط مورد استفاده سوکت را مشخص می کند که در آن SOCK_STREAM برابر با پرتکل TCP می باشد و SOCK_DGRAM برابر با پروتکل UDP می باشد.
  • پارامتر سوم برای رفع ابهامات دو پارمتر قبل مورد استفاده قرار می گیرد که معمولا برابر 0 می باشد.

گام دو اتصال سوکت به یک آی پی و پورت یا مرحله bind ) در این مرحله با استفاده از تابع socket_bind و متغیری که از مرحله قبل بدست آوردیم سوکت را متصل به یک آی پی و پورت می کنیم.

$result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

پورت انتخاب شده برای این ارتباط باید یک عدد میان 1024 تا 65535 می باشد. هر پورت می تواند بیانگر یک ارتباط میان سرور و کلاینت ها باشد . به طور مثال به پور 2000 سه کلاینت و سرور متصل می باشد.

گام سه انتظار برای برقراری ارتباط ) در این روش سرور منتظر برقراری ارتباط با کلاینت می ماند . تا این مرحله در درون یک حلقه می باشد که بتواند ارتباط را کلاینت های در صف برقرار کند.

$result = socket_listen($socket, 3) or die("Could not set up socket listener\n");

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

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

$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");

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

گام پنج خواندن و نوشتن روی سوکت ) در این مرحله بوسیله توابع socket_read و socket_write تبادل داده میان سرور و کلاینت اتفاق می افتد.

$input = socket_read($spawn, 1024) or die("Could not read input\n");

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

socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");

پارامتر اول همان سوکتی است که خروجی گام قبل بود و پارامتر دوم داده ارسالی است و پارامتر سوم طول داده ارسالی به سمت کلاینت می باشد.

گام شش بستن سوکت ) در این مرحله سوکت ابتدایی و سوکتی که پس از اتصال با کلاینت ساخته شد را می بندیم :

socket_close($spawn);
socket_close($socket);

PHP Client – client program

تنظیمات اولیه ) در این مرحله باید از طریق یک آی پی و پورت به سرور متصل گردیم . به طور مثال ما در مرحله زمان سرور یک سوکت روی یک آی پی و پورت ایجاد کردیم . حال کلاینت برای اتصال باید از همان آی پی و پورت استفاده کند.

$host = "127.0.0.1";
$port = 5353;
// No Timeout 
set_time_limit(0);

گام اول ساخت سوکت )

$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

گام دوم اتصال به سرور ) در این مرحله بر خلاف مرحله متناظر سرور آن این بار سوکت به یک هاست و پورت متصل می شود (connect)

$result = socket_connect($socket, $host, $port) or die("Could not connect toserver\n");

گام سه خواندن و نوشتن روی سرور ) برخلاف گام متناظر سرور خواندن و نوشتن روی سوکت اولیه ایجاد شده انجام می شود. این مرحله همان نشست سرور و کلاینت در ارتباط سوکت می باشد.

socket_write($socket, $message, strlen($message)) or die("Could not send data to server\n");
$result = socket_read ($socket, 1024) or die("Could not read server response\n");

گام چهار بستن سوکت )

socket_close($socket);

برای اجرای این ارتباط سوکت باید یک فایل server.php داریم که برنامه های سرور در آن نوشته شده است و یک یا چند فایل client.php به ازای هر کلاینت خواهیم داشت که با هر بار اتصال به سرور این داده ها جابه جا می شوند.

در ابتدا باید فایل سرور اجرا گردد که socket را روی یک آی پی و پورت bind کرد. پس با استفاده از هر یک وب سرور فایل را اجرا می کنیم. سپس فایل های کلاینت با هر بار اجرا اطلاعاتی را میان سرور و کلاینت جا به جا می کنند و این یک ارتباط ساده میان یک کلاینت و یک سرور می باشد. در این لینک فایل کامل کد ها را در سرور و کلاینت می توان مشاهده کرد.

مطالب مشابه

php socket programming

PHP Socket Programming – Part1

برنامه نویسی سوکت یک راه برای ارتباط مانا میان دو node ( کلاینت و سرور ) می باشد. یک سوکت (یا node) تحت یک IP و پورت به...

Apache HTTP Server – htaccess

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

ftp-protocol-in-php

کار با پروتکل FTP در PHP

یکی دیگر قوانین حاکم بر دنیای وب ( از پروتکل های اینترنت لایه application ) پروتکل ftp است که با استفاده از آن می...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

2 دیدگاه برای PHP Socket Programming – Part2

  1. سلام دوست عزیز امکان استفاده از این کد بر روی لوکال هاست وجود دارد یا حتما باید بر روی یک سرور جدا تست شود.

    • برای اجرای سوکت نیاز به PHP و یک وب سرویس مثل آپاچی است . برای راه اندازی سوکت نیاز است که دستوراتی را در محیط ترمینال وارد کنید. پس در هاست های معمولی قابل اجرا نیست چون دسترسی به ssh برای شما بسته است.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *