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

من دقیقاً با همین قسمت آخر ماجرا کار دارم. این که یک صفحهای داشته باشم و از طریق آن با یک یا چند نفر دیگر بهصورت زنده گفتوگو کنم و ضمناً تایپکردن من را ببینند و من هم تایپکردن آنها را. آمادهاید؟
مواد لازم پی اچ پی هست و مای اس کیو ال و کتابخانهی جی کوئری.
ابتدا یک صفحه با نام 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()
به دلیل برخی محدودیتها نمیتوانم نسخهی دمو از این نمونه قرار بدهم اما میتوانید آن را همین پایین کامل دریافت کنید:









احمد
در ۸۹/۱۰/۰۹ گفت:مثل همیشه استاد عالی بود
پاسخ
علی
در ۸۹/۱۰/۰۹ گفت:چه باحاااله این علی جان… دست گلت درد نکنه؛ میریم برای تست
پاسخ
Gharibe
در ۸۹/۱۰/۰۹ گفت:عالی بود
ممنون از آموزش های خوبتون
پاسخ
دانیال
در ۸۹/۱۰/۰۹ گفت:ممنون … خیلی خوب بود
اگر یه دمو آنلاین هم بود خیلی بهتر میشد
پاسخ
dorche
در ۸۹/۱۰/۱۰ گفت:چرا برنامه های رادیو تعطیل شد !
پاسخ
اشکـ+ـان
در ۸۹/۱۰/۱۳ گفت:من عاشق این جی کوئری و پی اچ پی ام با این امکانات فوق العادش :دی
خیلی جالب میشه اینجوری
دستت درد نکنه علی جون
:)
پاسخ
فاطیما
در ۸۹/۱۰/۱۳ گفت:از هایپر ترمینال یاد شد..
باید از خیلی های دیگه هم یاد کنیم!! :)
مرسی..
خدا قوت @};-
پاسخ
فاطیما
در ۸۹/۱۰/۱۳ گفت:یه سوال
کسی می دونه پرسپکتیو کاربر نهایی با پرسپکتیو ویزیتور یا همون بیننده چه فرقی داره؟!؟!
به طور دقیق و کاربردی.. حتی المقدور با مثال!!
سوال اصلی اینه که چه خصیصه هایی به دومی وابسته هستن که به اولی نیستن؟!
متشکرم..
پاسخ
علیها
در دی ۱۳م, ۱۳۸۹هردوطرف با یک خروجی کاملا مشابه روبهرو هستند. فرضا اگر شما در حال تایپ یک جمله، اینتر بزنید و برید به خط بعدی، شخص مقابل هم این ماجرا را میبیند و برعکس.
پاسخ
فاطیما
در دی ۱۳م, ۱۳۸۹متوجه نمی شم! یعنی هر دو رو یه موجودیت در نظر گرفتید؟!
فک کنم..
سوء تفاهم شده ..
با عرض شرمندگی سوالم به هایپر ترمینال و این پروژه که طراحی کردید ربطی نداشت..
در کل در مورد وب ماینینگ بود..
پاسخ
Mohsen
در ۸۹/۱۰/۲۱ گفت:چی بگم ؟؟؟؟؟؟
کارت خییییلی درسته علی . ایول دادا . من تازه با وبلاگت اشنا شدم . و خیییییییلی خوشحالم . جدی گفتم .
وقت کردی یه سری به سایت فکسنی ما هم بزن . همین امروز راش انداختم . هنوز چیزی نداره :دی
بازم میگم خییییلی باحالی . به خصوص با اون تی وی علیها و رادیو علیها . خیلی حال کردم باهاش .
دوباره میگم اییییییول
پاسخ
علی.ب
در ۸۹/۱۰/۲۱ گفت:سلام
خیلی جالب بود
فقط دو تا نکته :
۱ – من متوجه فیلد ID نشدم که چرا وقتی که همیشه ID = 1 رو می گردیم وجودش اونم auto_increment برای چیه؟
۲ – اگر کد شما جنبه فقط نمایش کارکرد و اون ایده رو داره که مشکلی نیست و خیلی عالیه ولی چون فایل آماده رو گذاشتید و ممکنه کسی استفاده کنه عرض می کنم . فایل send مشکل امنیتی نداره؟
پاسخ
علیها
در دی ۲۱م, ۱۳۸۹۱- من فرضم بر این است که شاید کسی قصد توسعهی همچین چیزی را داشته باشد به این شکل که کسانی که دارند از این طریق به اصطلاح چت میکنند دارای هویت باشند و در این صورت ما به بیش از یک رکورد برای ذخیرهی متن گفتوگو نیاز داریم و به همینخاطر auto_increment گذاشتم فیلد id را. دلیل دیگری ندارم برای این کار.
۲- این یک نمونهی ساده هست و روی کاملا امن بودنش کاری انجام ندادم. به عنوان مثال، مطمئنن جلوی حملات xss را نمیتواند بگیرد.
http://en.wikipedia.org/wiki/Cross-site_scripting
پاسخ
hossein
در ۸۹/۱۰/۲۲ گفت:kheyli be in niaz dashtam.
thanks alot :D
پاسخ
Mohsen
در ۸۹/۱۰/۲۷ گفت:نمیخای جواب ما رو بدی با مرام ؟؟؟
پاسخ
وحید دی آی
در ۸۹/۱۱/۰۹ گفت:علی جان من میل دادم وی جوابی ندادی…. لطفاً یه میل به من بده…. کارت دارم….
با احترام
پاسخ
آرش
در ۸۹/۱۱/۲۳ گفت:وقتای لاگین نشدن یاهو یادم میاد اچ.تی بدرد میخورد
پاسخ
وحید دی آی
در ۸۹/۱۲/۰۵ گفت:سلام… علی جان خیلی سرت شلوغه؟؟ من میخواستم ببینمت… جواب میل نمیدی! جواب نظر نمیدی… آخه چرا :(
من یه طرح داشتم… پیاسدیشو خودم زدم مونده کارای تبدیل به دابلیوپی (wordpress) … آخه من چطوری باهات ارتباط برقرار کنم :(( یه راه حل پیش روم بذار =((
پاسخ
نام
در ۸۹/۱۲/۱۰ گفت:خیلی عالیه مرسی
پاسخ
یونا
در ۸۹/۱۲/۱۷ گفت::)))) این نظرایی که مردم می نویسن واست علیرضا جان …
متاسفانه باید بگم هیچکدوم حتی این کدتون رو تست هم نکردن!!!
پاسخ
مرتضی
در ۸۹/۱۲/۱۹ گفت:خیلی جالب بود
پاسخ
mehdi
در ۸۹/۱۲/۲۴ گفت:خیلی خوشحالم که با سایتت آشنا شدم!
بعید میدونم کد اچ تی ال ام کار کنه! چپکی شده!
پاسخ
mehdi
در ۸۹/۱۲/۲۴ گفت:اااا کار کرد ولی استایلش نه! آقا از ajax کامنتت خیلی خوشم اومد! :D
کلا فضای قشنگی درست کردی اینجا! به زودی سایتم درست میشه میام اینجا به شمام معرفیش میکنم!
راستی اگه چیزی درباره XMPP هم میدونی بذار! کارای جالبی میشه باهاش کرد!
پاسخ
رامین
در ۹۰/۰۲/۲۸ گفت:سلام
وب سایت فوق العاده داری.
اگه مایل به تبادل اینک بودین خبر کنید.
با سپاس فراوان
پاسخ
امیرحسین
در ۹۰/۰۴/۲۷ گفت:سلام.
میدونم که مطلب جنبه ی آشنایی داشت ولی keyup و interval صد میلی ثانیه برای ارسال درخواست یکم فضایی نیست؟ برای چنین کارهایی Comet و WebSocket ایده جالبتریه…
ممنون برای آموزش.
پاسخ
علیها
در تیر ۲۷م, ۱۳۹۰دقیقا درسته، روشهای خیلی بهتر و مناسبتری برای اینکار وجود داره و این روش بالا خود به خود میتونه یه دیداس شدید هم ایجاد کنه. منتها برای ساده شدن ماجرا از همون اینترول استفاده کردم.
پاسخ
محسن
در ۹۰/۰۶/۰۸ گفت:سلام
من تست کردم
اما چطوری کار میکنه ؟
طرف مقابل اصلا نمیبینه هرچی تابپ می کنم
پاسخ
هادی
در ۹۰/۰۹/۱۰ گفت:خیلی عالی بود. مرسی.
پاسخ
علی
در ۹۰/۱۰/۲۵ گفت:واقعا آموزش خوبی بود. درسته ساده بود ولی نوع آموزش و اینکه کپی برداری از سایت های خارجی نبود خودش یه دنیا ارزش داره. خوشحالم که توی کشور ما هم همچین سایت هایی هستن من با سایت شما از طریق سایت جشنواره وب ایران آشنا شدم. واقعا ممنونم از اینکه وقت میذارید و علم ماهارو بالا میبرید.
پاسخ