ای‌جکس بازی » به‌یاد هایپرترمینال

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

من دقیقاً با همین قسمت آخر ماجرا کار دارم. این که یک صفحه‌ای داشته باشم و از طریق آن با یک یا چند نفر دیگر به‌صورت زنده گفت‌وگو کنم و ضمناً تایپ‌کردن من را ببینند و من هم تایپ‌کردن آن‌ها را. آماده‌اید؟

مواد لازم پی اچ پی هست و مای اس کیو ال و کتاب‌خانه‌ی جی کوئری.

ابتدا یک صفحه با نام index.php می‌سازم، کتاب‌خانه‌ی جی‌کوئری را واردش می‌کنم و یک فرم هم که حاوی یک کادرمتن هست در آن قرار می‌دهم:

<form action="" id="htForm">
     <textarea name="chatbox" class="chatbox" id="chatbox"></textarea>
</form>

دیتابیس

در ادامه یک دیتابیس باید بسازم برای ذخیره‌کردن متن گفت‌وگو. دستورات زیر را اس‌کیوال می‌کنم تا جدول و فیلد‌های موردنیازم ایجاد شوند:

CREATE TABLE IF NOT EXISTS `tbl_chat` (
`id` int(11) NOT NULL auto_increment,
`chat` LONGTEXT CHARACTER SET utf8  NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci AUTO_INCREMENT=1 ;

INSERT INTO `tbl_chat` (`chat`) VALUES ('type here...');

پی‌اچ‌پی

حالا یک فایل با نام config.php می‌سازم و با آن به دیتابیسی که ساختم، وصل می‌شوم:

<?php
// Mysql Config; enter your host name, database name, database username and password.
define('DB_HOST', 'localhost');
define('DB_NAME', 'database_name');
define('DB_USER', 'database_username');
define('DB_PASSWORD', 'database_password');

// Connecting to database...
$connection = @mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) or die('Database Error!');
@mysql_select_db(DB_NAME,$connection);
?>

یک فایل دیگر می‌سازم برای ارسال متن به دیتابیس. نام این فایل send.php هست:

<?php
@include('config.php');

$chat = $_POST['chatbox'];
$query = "UPDATE tbl_chat SET chat = '$chat' WHERE id = 1";
$do = @mysql_query($query);
?>

و فایلی دیگر با نام recive.php برای گرفتن متن از دیتابیس:

<?php
@include('config.php');

$query = "SELECT * FROM tbl_chat WHERE id = 1";
$do = @mysql_query($query);
$row = @mysql_fetch_array($do);
echo ($row[chat]);
?>

جی‌کوئری

حالا دیگر کارم با پی‌اچ‌پی تمام شده است؛ می‌روم سراغ جی‌کوئری.

با توابع load() و ajax() قبلاً کارهایی کرده‌ایم (این‌جا و این‌جا). این‌بار هم به این دو تابع پرکاربرد نیاز داریم و اصل کارمان را همین دو تابع انجام می‌دهند.

ابتدا باید متنی که در کادر متن نوشته می‌شود را با تابع ajax() بفرستم برای فایل send.php و این فایل هم متن را می‌گیرد و می‌فرستد به دیتابیس. و البته باید به‌خاطر داشته باشید که می‌خواهم هم‌زمان که در حال تایپ‌کردن هستم، شخص مقابل تایپ‌کردن ِ من را مشاهده کند. پس باید تابع ajax() را در یک رویدادی مثل keyup() قرار بدهم تا با هربار فشردن و رهاکردن یک دکمه‌ی کی‌برد، متن‌ها به دیتابیس ارسال شوند. به‌این‌صورت هر حرف جدیدی که تایپ می‌کنم، ذخیره می‌شود و به این ترتیب، تایپ کردن ِ من به‌صورت زنده مشاهده می‌شود.

$(document).ready(function() {
     $('#chatbox').keyup(function () {

     var chatbox = $('#chatbox');
     var data = 'chatbox=' + chatbox.val();

     $.ajax({
          url: 'send.php',
          type: 'POST',
          data: data,
          cache: false,
          success: function(){}
     });
     return false;
     });
});

تا به اینجای کار، فقط متن گفت‌وگو ذخیره می‌شود و هنوز چیزی از دیتابیس لود نشده است تا شخص مقابل مشاهده نماید. همان‌طور که پیش‌تر هم اشاره کردم، از تابع load() برای لود کردن متن از دیتابیس استفاده می‌کنم و خب باید متن گفت‌وگو درهمان کادرمتن لود شود، پس به این صورت عمل می‌کنم:

$(document).ready(function() {
	$('#chatbox').load('receive.php');
});

فایل recive.php را به تابع لود دادم و از این طریق متن گفت‌وگو لود شده و در کادرمتن #chatbox نمایش داده می‌شود.

اما مسئله این است که به این شکل فقط یک‌بار متن‌ها از دیتابیس لود می‌شوند و متن‌های جدید دیگر مشاهده نخواهند شد. راه حل ساده‌ست، من تابع لود را می‌سپارم به دست یک حلقه تا دائماً اجرا شود و متن‌های جدیدتر نیز لود و دیده شوند. بازه‌ی زمانی حلقه را روی ۱۰۰ میلی‌ثانیه می‌گذارم تا هر تغییر کوچکی که در متن‌های گفت‌وگو ایجاد شود خیلی سریع به شخص مقابل نمایش داده شود:

$(function(){
var timer = setInterval(receive_chat, 100);
});
function receive_chat() {
 $(document).ready(function() {
	$('#chatbox').load('receive.php');
 });
}

کار دیگر تمام است و می‌توانم نتیجه را در صفحه‌ی index.php ببینم.

مشکلی که وجود دارد این است که در چنین روش‌هایی با سرور ریکوئست بالایی روبه‌رو هستیم. این یعنی برای اجرا در پروژه‌های بزرگ، به سرورهای قوی نیاز داریم. تصور کنید که در هر ۱۰۰ میلی‌ثانیه یک ریکوئست فرستاده می‌شود و فایل recive.php اجرا می‌شود. جدا از این، با هربار فشردن یک دکمه از کی‌برد، باز یک ریکوئست ارسال می‌شود و فایل send.php اجرا می‌شود.

منابع:
jQuery ajax()
jQuery load()

به دلیل برخی محدودیت‌ها نمی‌توانم نسخه‌ی دمو از این نمونه قرار بدهم اما می‌توانید آن را همین پایین کامل دریافت کنید:

دیدگاه‌ها (۳۰)

  • مثل همیشه استاد عالی بود

    پاسخ

  • چه باحاااله این علی جان… دست گلت درد نکنه؛ میریم برای تست

    پاسخ

  • عالی بود
    ممنون از آموزش های خوبتون

    پاسخ

  • ممنون … خیلی خوب بود
    اگر یه دمو آنلاین هم بود خیلی بهتر میشد

    پاسخ

  • چرا برنامه های رادیو تعطیل شد !

    پاسخ

  • من عاشق این جی کوئری و پی اچ پی ام با این امکانات فوق العادش :دی
    خیلی جالب میشه اینجوری
    دستت درد نکنه علی جون
    :)

    پاسخ

  • از هایپر ترمینال یاد شد..
    باید از خیلی های دیگه هم یاد کنیم!! :)
    مرسی..
    خدا قوت @};-

    پاسخ

  • یه سوال
    کسی می دونه پرسپکتیو کاربر نهایی با پرسپکتیو ویزیتور یا همون بیننده چه فرقی داره؟!؟!
    به طور دقیق و کاربردی.. حتی المقدور با مثال!!
    سوال اصلی اینه که چه خصیصه هایی به دومی وابسته هستن که به اولی نیستن؟!
    متشکرم..

    پاسخ

    هردوطرف با یک خروجی کاملا مشابه روبه‌رو هستند. فرضا اگر شما در حال تایپ یک جمله، اینتر بزنید و برید به خط بعدی، شخص مقابل هم این ماجرا را می‌بیند و برعکس.

    پاسخ

    متوجه نمی شم! یعنی هر دو رو یه موجودیت در نظر گرفتید؟!
    فک کنم..
    سوء تفاهم شده ..
    با عرض شرمندگی سوالم به هایپر ترمینال و این پروژه که طراحی کردید ربطی نداشت..
    در کل در مورد وب ماینینگ بود..

    پاسخ

  • چی بگم ؟؟؟؟؟؟

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

    وقت کردی یه سری به سایت فکسنی ما هم بزن . همین امروز راش انداختم . هنوز چیزی نداره :دی

    بازم میگم خییییلی باحالی . به خصوص با اون تی وی علیها و رادیو علیها . خیلی حال کردم باهاش .

    دوباره میگم اییییییول

    پاسخ

  • سلام
    خیلی جالب بود
    فقط دو تا نکته :
    ۱ – من متوجه فیلد ID نشدم که چرا وقتی که همیشه ID = 1 رو می گردیم وجودش اونم auto_increment برای چیه؟
    ۲ – اگر کد شما جنبه فقط نمایش کارکرد و اون ایده رو داره که مشکلی نیست و خیلی عالیه ولی چون فایل آماده رو گذاشتید و ممکنه کسی استفاده کنه عرض می کنم . فایل send مشکل امنیتی نداره؟

    پاسخ

    ۱- من فرضم بر این است که شاید کسی قصد توسعه‌ی همچین چیزی را داشته باشد به این شکل که کسانی که دارند از این طریق به اصطلاح چت می‌کنند دارای هویت باشند و در این صورت ما به بیش از یک رکورد برای ذخیره‌ی متن گفت‌وگو نیاز داریم و به همین‌خاطر auto_increment گذاشتم فیلد id را. دلیل دیگری ندارم برای این کار.

    ۲- این یک نمونه‌ی ساده هست و روی کاملا امن بودنش کاری انجام ندادم. به عنوان مثال، مطمئنن جلوی حملات xss را نمی‌تواند بگیرد.
    http://en.wikipedia.org/wiki/Cross-site_scripting

    پاسخ

  • kheyli be in niaz dashtam.
    thanks alot :D

    پاسخ

  • نمیخای جواب ما رو بدی با مرام ؟؟؟

    پاسخ

  • علی جان من میل دادم وی جوابی ندادی…. لطفاً یه میل به من بده…. کارت دارم….

    با احترام

    پاسخ

  • وقتای لاگین نشدن یاهو یادم میاد اچ.تی بدرد میخورد

    پاسخ

  • سلام… علی جان خیلی سرت شلوغه؟؟ من میخواستم ببینمت… جواب میل نمیدی! جواب نظر نمیدی… آخه چرا :(

    من یه طرح داشتم… پی‌اس‌دی‌شو خودم زدم مونده کارای تبدیل به دابلیو‌پی (wordpress) … آخه من چطوری باهات ارتباط برقرار کنم :(( یه راه حل پیش روم بذار =((

    پاسخ

  • خیلی عالیه مرسی

    پاسخ

  • :)))) این نظرایی که مردم می نویسن واست علیرضا جان …
    متاسفانه باید بگم هیچکدوم حتی این کدتون رو تست هم نکردن!!!

    پاسخ

  • خیلی جالب بود

    پاسخ

  • خیلی خوشحالم که با سایتت آشنا شدم!

    بعید میدونم کد اچ تی ال ام کار کنه! چپکی شده!

    پاسخ

  • اااا کار کرد ولی استایلش نه! آقا از ajax کامنتت خیلی خوشم اومد! :D
    کلا فضای قشنگی درست کردی اینجا! به زودی سایتم درست میشه میام اینجا به شمام معرفیش میکنم!
    راستی اگه چیزی درباره XMPP هم میدونی بذار! کارای جالبی میشه باهاش کرد!

    پاسخ

  • سلام
    وب سایت فوق العاده داری.
    اگه مایل به تبادل اینک بودین خبر کنید.

    با سپاس فراوان

    پاسخ

  • سلام.
    میدونم که مطلب جنبه ی آشنایی داشت ولی keyup و interval صد میلی ثانیه برای ارسال درخواست یکم فضایی نیست؟ برای چنین کارهایی Comet و WebSocket ایده جالبتریه…

    ممنون برای آموزش.

    پاسخ

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

    پاسخ

  • سلام
    من تست کردم
    اما چطوری کار میکنه ؟
    طرف مقابل اصلا نمیبینه هرچی تابپ می کنم

    پاسخ

  • خیلی عالی بود. مرسی.

    پاسخ

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

    پاسخ

بازتاب‌ها (1)

دیدگاه خود را ارسال کنید


می‌توانید از برخی کدهای HTML استفاده نمایید:


<a> <b> <blockquote> <i> <em> <pre> <code> <strong>