درخواست راهنمایی برای ایجاد ارتباط ساکت به کمک php

reza21681

Member
سلام دوستان
امیدوارم حال همگی خوب باشه.
اگر تمایل دارید قبل از هرچیز بخش انتهایی رو که سوالاتم هست بخونید ...

با پیشنهاد یکی از دوستانم و استادم قرار بود یک محیط چت با فلش نوشته بشه که به عنوان بخش پشتیبانی آنلاین به کار بره. اول میخواستم به راحتی با استفاده از XML یا حتی پایگاه داده یه برنامه چت بنویسم که با فلش و پی اچ پی قابل پیاده سازی بود. اما متاسفانه استاد به سرباری که به دلیل چک کردن هر چند لحظه یکبار از طرف فلش به سرور ارسال میشد گیر داد و اینطوری شد که مجبور شدم از محیط چت ساده کوچ کنم به یه چت نسبتاً پیچیده به کمک ساکت (سوکت) (فقط جهت اطلاع میگم که اگر قرار بود چت رو با استفاده از XML بنویسم؛ قصدم این بود که وقتی کاربر وارد محیط چت میشه یه سری جدول توی یک پایگاه داده ایجاد میشد که ساعت ورود و نام و ... بود، بعد قصد داشتم از طرف محیط چت اپراتور هر چند لحظه یکبار این جدول رو چک کنم تا ببینم آیا کسی آنلاین شده یا نه و برای تمام حالت های دیگه مثل چت کردن و ارسال فایل و ... هم همین قصد رو داشتم که خوب باعث میشد حتی اگر چتی صورت نمیگیره، پهنای باند اپراتور یا حتی کاربر بی جهت و بدون دلیل مشغول بشه...!!!!). برای طراحی محیط چت با ساکت از اونجایی که دستورات XML Socket قابل فهم و ساده به نظر میرسیدن، شروع کردم به مطالعه چند نمونه از سایت‏های خارجی. اوایل توی مفهموم خود ساکت مشکل داشتم اما کم کم مشکلات بیشتر و بیشتر شد تا اینکه حالا اینجام و از شما دوستان گرامی می‏خوام که اگر می‏تونید من رو راهنمایی کنید.

تا به امروز همیشه به عنوان یه مصرف کننده به سایت مجید آنلاین سر میزدم اما تصمیم گرفتم وقتی مشکلم با این محیط چت برطرف شد یه آموزش کامل در رابطه با طراحی این محیط چت روی اینترنت به زبان فارسی و انگلیسی قرار بدم. چون تمام آموزشهایی که من بهشون بر خوردم چه بسا کامل بودن اما کاستی‏های کوچک و مهمی داشتن که باعث شد نتونم از هیچکدوم استفاده کنم.

اول مجبورم یه کوچولو توضیح بدم تا بعد به مشکلاتم اشاره کنم...

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


من خیلی از آموزشهای اینترنتی رو مطالعه کردم که تقریباً همشون مثل همدیگه بودن برای همین اینجا به دو تا از آموزشها اشاره میکنم و از شما میخوام که کمکم کنید تا مشکلشون رو متوجه بشم.

برای مشاهده دوتا از آموزشهایی که فکر میکنم خیلی کامل و مفید هستن میتونید لینک های زیر رو ببنید:


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

توی صفحه شماره یک؛ توضیح مختصر و مفیدی درباره طراحی محیط چت در برنامه ادوب فلش داده. صفحه شماره دو ( http://www.kirupa.com/developer/flash8/php5sockets_flash8_2.htm ) کدهایی که باید با استفاده از XMLSocket تو فلش نوشته بشه رو توضیح داده. کدها ساده هستن و برای اینکه دسترسی شما رو راحت کنم پایین کپیشون کردم:

[LTR] mySocket = new XMLSocket();

mySocket.onConnect = function(success) {

if (success) {

msgArea.htmlText += "<b>Server connection established!</b>";

} else {

msgArea.htmlText += "<b>Server connection failed!</b>";

}

};

mySocket.onClose = function() {

msgArea.htmlText += "<b>Server connection lost</b>";

};

XMLSocket.prototype.onData = function(msg) {

msgArea.htmlText += msg;

};

mySocket.connect("dyn.obi-graphics.com", 9999);

//--- Handle button click --------------------------------------

function msgGO() {

if (inputMsg.htmlText != "") {

mySocket.send(inputMsg.htmlText+"\n");

inputMsg.htmlText = "";

}

}

pushMsg.onRelease = function() {

msgGO();

}; [/LTR]​


به نظر میرسه این کد تو قسمت XMLSocket.prototype.onData یه مشکل کوچیک داره چون به جای XMLSocket. احتمالاً باید می‏نوشت mySocket.prototype.onData حالا این زیاد مهم نیست چون هنوز به بخش ارسال داده نسیدیم...

تو قسمت mySocket.connect("dyn.obi-graphics.com", 9999); یه آدرس اینترنتی به علاوه پورت 9999 رو تعیین میکنه تا فلشی که طراحی کرده به اون پورت وصل بشه. حالا اولین سوال اینجاست که با توجه به اینکه آدرس اینترنتی dyn.obi-graphics.com غیر فعاله باید جای این آدرس یه آدرس دیگه گذاشت. ترجیح من اینه که روی لوکال کار کنم اما خوب برای اینکه لوکال بذارم از آدرس آی پی 127.0.0.1 استفاده کردم که به یه مشکل خوردم.

کسایی که با ساکت کار کردن میدونن که یه سری از ساکتها برای کارهای خاصی رزرو شدن و ساکت 80 ساکتیه که نه فیلترشکن نا آنتی ویروس نه هیچ چیز دیگه اون رو بررسی نمیکنه و همیشه بازه. فلش با ساکتهای زیر 1024 ارتباط برقرار نمیکنه بنابراین نمیشه مستقیم از ساکت 80 استفاده کرد. حالا اصلاً نپیچونم مسئله رو...

وقتی شما آدرس آی پی رو توی فایل فلش عوض کنید به لوکال هاست؛ یعنی جای dyn.obi-graphics.com بزنید 127.0.0.1 اونوقت اگر توی محیط خود ادوب فلش، تست بگیرید با پیغام Server connection established! روبرو میشید. یعنی برنامه شما به درستی وصل شده ...

اما اگر خارج از محیط خود ادوب فلش تست بگیرید؛ مثلاً فایلتون رو با یه اچ تی ام ال باز کنید (البته توجه دارید که منظورم از باز کردن فایل با اچ تی ام ال یا هر چیز دیگه ای در محیط لوکال هاست یا سرور می‏باشد.) با پیغام Server connection failed! روبرو می‏شید. یعنی اینکه اتصال برقرار نمیشه ... :(

حالا چرا ؟؟؟

یه مبحثی هست به نام privacy policy که احتمالاً به اون ربط داره ولی خوب من چطوری باید فایل .swf ام رو با php یا html باز کنم و ارتباط برقرار بشه؟؟؟

این اولین مشکل...
دومین مشکل اینجاست که، وقتی ادامه‏ی آموزش رو میخونید تو صفحه شماره سه میاد و درباره php سمت سرور آموزش میده. این php وظیفه اش ایجاد یک ارتباط بین فلش ما و سایر فلشهادی دیگه (کاربران دیگه) به کمک پورت و ساکت ایجاد شده در سرور هست.
حالا اینجا چندتا سوال پیش میاد.
من از کجا باید بفهمم که آیا پورتی مثل 9999 باز هست یا نه؟
اولین چیزی که استاد راهنمامون گفت این بود که تل نت بزنید ...
منم جستجو کردم و از تو cmd کلی تلنت زدم ولی کار نکرد. فکر کنم برای تلنت زدن باید کار خاصی بکنم. من هرچقدر از تو کامنت پرومت ویندوز تلنت زدم با اخطار برقراری ارتباط نمیتواند ایجاد شود روبرو شدم...
روی هیچ پورتی به غیر از پورت 80 نتونستم تلنت بزنم. تازه روی پورت 80 هم وقتی تلنت میزنم مثلاً میزنم:
telnet www.yahoo.com 80​
تا اینتر رو فشار میدم صفحه سیاه میشه...
این مسئله روی تمام سایتهای دیگه هم مشابه همینه
حتی روی لوکال هاست !!!
پس اینجا سوال اول من اینه که چطوری باید بفهمم یه پورت باز هست یا نه. و اگر بسته بود چطوری باید بازش کنم. دوباره یادآوری میکنم اینجا ترجیح من بیشتر روی لوکال هاسته...
سوال دومی که ایجاد میشه اینه که...
دستورات زیر که بخش php سرور هست به نظر خیلی ساده میاد:

[LTR]
#!/usr/bin/php -q

<?php

/*

Raymond Fain

Used for PHP5 Sockets with Flash 8 Tutorial for Kirupa.com

For any questions or concerns, email me at [email protected]

or simply visit the site, www.php.net, to see if you can find an answer.

*/

error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$address = '192.168.0.16';
$port = 9999;

//---- Function to Send out Messages to Everyone Connected ----------------------------------------

function send_Message($allclient, $socket, $buf) {
foreach($allclient as $client) {
socket_write($client, "$socket wrote: $buf");
}
}

//---- Start Socket creation for PHP 5 Socket Server -------------------------------------

if (($master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed, reason: " . socket_strerror($master) . "\n";
}
socket_set_option($master, SOL_SOCKET,SO_REUSEADDR, 1);
if (($ret = socket_bind($master, $address, $port)) < 0) {
echo "socket_bind() failed, reason: " . socket_strerror($ret) . "\n";
}
if (($ret = socket_listen($master, 5)) < 0) {
echo "socket_listen() failed, reason: " . socket_strerror($ret) . "\n";
}

$read_sockets = array($master);

//---- Create Persistent Loop to continuously handle incoming socket messages ---------------------
while (true) {
$changed_sockets = $read_sockets;
$num_changed_sockets = socket_select($changed_sockets, $write = NULL, $except = NULL, NULL);
foreach($changed_sockets as $socket) {
if ($socket == $master) {
if (($client = socket_accept($master)) < 0) {
echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
continue;
} else {
array_push($read_sockets, $client);
}
} else {
$bytes = socket_recv($socket, $buffer, 2048, 0);
if ($bytes == 0) {
$index = array_search($socket, $read_sockets);
unset($read_sockets[$index]);
socket_close($socket);
}else{
$allclients = $read_sockets;
array_shift($allclients);
send_Message($allclients, $socket, $buffer);
}
}
}
}
?>​
[/LTR]

اما اینجا باز یه نکته ای هست. اونم اینکه من وقتی $address = '192.168.0.16' رو تغییر میدم به $address = '127.0.0.1' و فایلم رو روی لوکال هاست یا روی سرور قرار میدم...

وقتی فایل رو از طریق مرورگرم اجرا میکنم یعنی مثلاً توی لوکال هاست مینویسم:

http://localhost/socketTut.php

متن زیر رو داخلش می‏نویسه:

[LTR]
#!/usr/bin/php -q
Warning: socket_bind() [function.socket-bind]: unable to bind address [0]: An attempt was made to access a socket in a way forbidden by its access permissions. in C:\xampp\htdocs\sockets\socketTut.php on line 32

Warning: socket_listen() [function.socket-listen]: unable to listen on socket [0]: An invalid argument was supplied. in C:\xampp\htdocs\sockets\socketTut.php on line 36​
[/LTR]

حالا اینجا باز چندتا نکته هست.

اول اینکه اصلاً چیزی که توی آموزش هست منظورش چیه؟

توی آموزش یه فایل .bat تعریف میکنه که این فایل bat فایل socketTut.php رو فراخوانی میکنه. در حالی که قبلتر توی صفحه سه آموزش ( http://www.kirupa.com/developer/flash8/php5sockets_flash8_3.htm ) درباره فایلی با نام socketShell.php صحبت میکنه. حالا چون اطلاعات داخل هردو فایل یکیه ما جفتشون رو socketTut.php تصور میکنیم. در این رابطه میدونید چطوری باید این فایل پی اچ پی رو استفاده کرد؟

این خط نشون میده که فایل php باید تو محیط لینوکس اجرا بشه... #!/usr/bin/php –q و من دارم توی محیط ویندوز اجرا میکنم. حالا اگر بخوام توی محیط ویندوز اجرا بکنم باید چه تغییری بدم؟

هرچند وقتی اون فایل bat رو میسازه اشاره میکنه که اجرای این فایل بت برای کاربران ویندوزیه ...!

سوالاتم رو جمع بندی میکنم:

1- چرا وقتی یه ارتباط ساکت برقرار میشه از طریق برنامه فلش؛ توی خود برنامه ادوب فلش این ارتباط ایجاد میشه اما وقتی همون فلش رو از طریق یک html باز کنیم ارتباط برقرار نمیشه؟ و آیا راهی بلدید که بشه این ارتباط رو ایجاد کرد. به این مسئله هم توجه کنید که نیاز هست ارتباط روی پورتی تعیین شده از طرف خودمون باشه نه یه پورت پیش فرض مثل 80...!

2- برای ارتباط کاربر از طریق محیط فلش (client) به کاربران دیگه نیاز به یه مدیریت تحت سرور هست که اینجا اون مدیریت توسط فایل socketTut.php انجام میشه. اجرا کردن فایل socketTut.php چطوریه؟ همین که من این فایل رو کپی کنم روی سرور بعدش باید چیکار کنم؟ اون فایل bat باید چه کاری رو برای من انجام بده و چطوری؟

3- آموزش ارائه شده در محیط لینوکس خواهد بود اما من نیاز دارم به ویندوز. چه تغییراتی باید انجام بدم تا روی ویندوز بتونم تست کنم و جواب بگیرم؟

4- اگر کسی میتونه یه آموزش مرحله به مرحله ی خیلی ساده درباره ایجاد یک ساکت روی لوکال ویندوز و ارتباط خیلی ساده با فلش در حد اینکه ارتباط موفقیت آمیز بود یا نبود... ارائه بده یه دنیا ازش ممنون میشم.

- فایل های مورد نیاز رو که از خود آموزش میتونید دانلود کنید براتون پیوست کردم فقط موقع استفاده باید آدرس آی پی و آدرس سایت رو به ترتیب از 192.168.0.16 و dyn.obi-graphics.com به آدرس های مورد نظرتون تغییر بدید.

- من از ویندوز 7 استفاده میکنم

- به عنوان لوکال هاست از برنامه Erfan Server و XAMPP استفاده کردم.

- برای سرور از سرورهای رایگان سایت http://maroonhost.com و http://gigfa.com استفاده کردم. که پشتیبانی مارون اعلام کرد توی تنظیمات apache ساکت بازه و نباید مشکلی داشته باشم اما دارم. پشتیبانی گیگفا به نظر متوجه نشد چی میگم و اعلام کرد که احتمالاً باید سرورهای پولی گیگفا رو استفاده کنم...

- اگر هرگونه سوال دیگه ای بود ممنون میشم بپرسید تا جواب بدم.

- بابت هرگونه راهنمایی هم پیشاپیش تشکر میکنم و این قول رو میدم که سعی کنم راهنمایی شما دوستان بزرگوار بی پاسخ نمونه

- با اجازه مدیریت این مطلب رو توی دو بخش سایت کپی کردم یکی بخش برنامه نويسي Server Side و دیگری بخش برنامه Flash اگر باعث ایجاد مشکلی میشه (یا شده) لطفاً بهم اطلاع بدید.


بابت صبر و شکیباییتون برای خوندن این متن بلند متشکرم
خدانگهدار
رضا
 

پیوست ها

  • sockets.zip
    199 کیلوبایت · بازدیدها: 13

جدیدترین ارسال ها

بالا