PDA

View Full Version : نوشتن سرویس چت شبیه Facebook



IamOverlord
جمعه 02 تیر 1391, 23:30 عصر
سلام دوستان.
می خوام یه سرویس چتی شبیه سرویس Facebook بنویسم...
PHP و Javascript و ... بلدم. حالا می خواستم نظر شما رو بدونم، کسی تا حالا این کارو کرده؟ می خوام شی گرا بنویسم و تمیز کار کنم... باید از چه چیز هایی استفاده کنم؟

ayub_coder
جمعه 02 تیر 1391, 23:58 عصر
اولین چیزایی که باید یاد بگیری یکی Ajax هستش و یک کتابخانه جاوا اسکریپ مثل JQuery. برای پروژه های این چنینی جزء ملزومات هستن!

IamOverlord
شنبه 03 تیر 1391, 00:07 صبح
من قبلا یه کم با هر کدومشون ور رفتم... اما یه مقدار گیج شدم... نمونه ی عملی ساده ای دارید؟

ayub_coder
شنبه 03 تیر 1391, 00:14 صبح
نمونه ساده عملی از چی می خواید؟

IamOverlord
شنبه 03 تیر 1391, 00:46 صبح
می خوام یه ChatBox کوچیک باشه، که با یکی از User های آنلاین توش چت کنیم و اون هم بدون نیاز به Refresh صفحه پیام رو دریافت کنه...
اگه می شه راهنمایی کنید خودم می نویسم... PHP و HTML و ... این قسمت های عادی شو بلدم، اما تو AJAX موندم و jQuery ...

IamOverlord
شنبه 03 تیر 1391, 00:49 صبح
AJAX رو که می دونم برای ارتباط با Server در حین چت لازمه، jQuery برای کجای کار لازمه؟

plague
شنبه 03 تیر 1391, 02:39 صبح
php , mysql بدرد اینکار نمیخورن
سرعت پایین و نیاز به منابع از عمده دلایلی هستن که هیچوقت همچین اپلیکیشنی در سطح استفاده بالا با انها نوشته نمیشه
من قبلا برای سایتی نوشتم همچین چیزی رو ولی هنوز سایت پابلیک نشده و نمیتونم بهتون نشون بدم

روش های رایج استفاده از تکنولوژی های کامت و پوش هستن که نیاز به سرور های خاص خودشون رو دادرن که پشتیبانی بکنه
روش پینگ یا هارت بیت هست که شما میای مثلا هر 4-5 ثانیه یکبار یه درخواست میفرستی به سرور و چک میکنی که مثلا پیامی داشتی یا نه یا کسی برای شما درخواست چت فرستاده یا نه
اگه در خواستی فرستاده شده بود برای شما چک میکنی که پنجره چت بازه یا نه اگه باز نبود بازش میکنی و بعد پیام رو توش نمایش میدی

توی مبدا هم به همین شیوه


روش مستظعفیش اینه که به دلیل درخواست های بالا منابع زیادی مصرف میکنه و کمی کنده ولی برای اپلیکیشن های کوچیک با استفاده کم جواب میده
استفاده جی کوئری هم مثلا برای ساخت و نمایش پیام ها و خوده پنجره چت و همچنین ارسال درخواست ایجکسه که با جی کوئری خیلی جمع و جور و آسون تره

اگه یچیز درست و حسابی میخای بسازی 2 راه داری
1 تهیه سرویس هایی که در بالا نام بردم
2 استفاده از تکنولوژی و زبان های سریعتر مثل Node.js

ayub_coder
شنبه 03 تیر 1391, 08:55 صبح
یعنی فیسبوک از همین دو تکنولوژی استفاده نمیکنه؟ خوب درسته نیاز به یک سرور قوی هست و لی نشد نداره. میشه انجام داد!

IamOverlord
شنبه 03 تیر 1391, 17:41 عصر
یه چیزی پیدا کردم، نیگا کنید: anantgarg.com/2009/05/13/gmail-facebook-style-jquery-chat (http://anantgarg.com/2009/05/13/gmail-facebook-style-jquery-chat/)
حالا می خوام اینو جوری توسعه بدم که کاربرا بتونن لاگین کنن که فقط آدرس ایمیلشون رو وارد می کنن، بعد هر کاربر می تونه با داشتن آدرس ایمیل یکی دیگه باهاش چت کنه...
باید چی کار کنیم؟ مثلا من اومدم به جای این:

<?php
session_start();
$_SESSION['username'] = "johndoe" // Must be already set
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/loose.dtd" >

<html>
<head>
<title>Sample Chat Application</title>
<style>
body {
background-color: #eeeeee;
padding:0;
margin:0 auto;
font-family:"Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
font-size:11px;
}
</style>

<link type="text/css" rel="stylesheet" media="all" href="css/chat.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/screen.css" />

<!--[if lte IE 7]>
<link type="text/css" rel="stylesheet" media="all" href="css/screen_ie.css" />
<![endif]-->

</head>
<body>
<div id="main_container">

<a href="javascript:void(0)" onclick="javascript:chatWith('janedoe')">Chat With Jane Doe</a>
<a href="javascript:void(0)" onclick="javascript:chatWith('babydoe')">Chat With Baby Doe</a>
<!-- YOUR BODY HERE -->

</div>

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/chat.js"></script>

</body>
</html>
این رو گذاشتم:

<?php
session_start();
$_SESSION['username'] = $_REQUEST['username'] // Must be already set
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/loose.dtd" >

<html>
<head>
<title>Sample Chat Application</title>
<style>
body {
background-color: #eeeeee;
padding:0;
margin:0 auto;
font-family:"Lucida Grande",Verdana,Arial,"Bitstream Vera Sans",sans-serif;
font-size:11px;
}
</style>

<link type="text/css" rel="stylesheet" media="all" href="css/chat.css" />
<link type="text/css" rel="stylesheet" media="all" href="css/screen.css" />

<!--[if lte IE 7]>
<link type="text/css" rel="stylesheet" media="all" href="css/screen_ie.css" />
<![endif]-->

</head>
<body>
<div id="main_container">

<a href="javascript:void(0)" onclick="javascript:chatWith('janedoe')">Chat With Jane Doe</a>
<a href="javascript:void(0)" onclick="javascript:chatWith('babydoe')">Chat With Baby Doe</a>
<!-- YOUR BODY HERE -->

</div>

<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/chat.js"></script>

</body>
</html>

ببینید درسته؟! من که هر چی می زنم پیام ها ارسال نمی شن...

plague
شنبه 03 تیر 1391, 18:33 عصر
یعنی فیسبوک از همین دو تکنولوژی استفاده نمیکنه؟ خوب درسته نیاز به یک سرور قوی هست و لی نشد نداره. میشه انجام داد!

منم نگفتم نمیشه من گفتم تکنولوژیشون ماله اینکار نیست
شما با پیکان نمیری مسابقه بدی اگر هم رفتی انتظار اول شدن رو نباید داشته باشی
برای چت فیسبوک حتما سرور خاص خوده اپلیکیشن رو دارن و از چیزی سریعتر از این دو استفاده میکنن


ببینید درسته؟! من که هر چی می زنم پیام ها ارسال نمی شن...

فانکشن جاوااسکریپتت رو درست کن هنوز جان دو رو میگیره به عنوان آرگومان سشن یوزر نیم رو بقزار جاش

IamOverlord
یک شنبه 04 تیر 1391, 01:17 صبح
سلام دوستان.

این یه سرویس چت عمومی که هر کس با یه Nickname وارد می شه و همه با هم چت می کنن. محتویات چت داخل chat.txt دخیره می شه.
myphphost.newhost.ir/03 (http://barnamenevis.org/myphphost.newhost.ir/03)

حالا من برای Private کردن این سرویس این کد ها رو تغییر دادم.


فایل chat.js:

/*
Created by: Kenrick Beckett

Name: Chat Engine
*/

var instanse = false;
var state;
var mes;
var file;

function Chat () {
this.update = updateChat;
this.send = sendChat;
this.getState = getStateOfChat;
}

//gets the state of the chat

function getStateOfChat(){
//function getStateOfChat(nickname,destination){
if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'getState',
'nickname': nickname,
'destination': destination,
'file': file
},
dataType: "json",

success: function(data){
state = data.state;
instanse = false;
},
});
}
}

//Updates the chat
function updateChat(){
//function updateChat(nickname, destination){
if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'update',
//'nickname': nickname,
//'destination': destination,
'state': state,
'file': file
},
dataType: "json",
success: function(data){
if(data.text){
for (var i = 0; i < data.text.length; i++) {
$('#chat-area').append($("<p>"+ data.text[i] +"</p>"));
}
}
document.getElementById('chat-area').scrollTop = document.getElementById('chat-area').scrollHeight;
instanse = false;
state = data.state;
},
});
}
else {
setTimeout(updateChat, 1500);
}
}

//send the message
function sendChat(message, nickname)
//function sendChat(message, nickname, destination)

{
updateChat();
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'send',
'message': message,
'nickname': nickname,
//'destination': destination,
'file': file
},
dataType: "json",
success: function(data){
updateChat();
},
});
}

به جای:

/*
Created by: Kenrick Beckett

Name: Chat Engine
*/

var instanse = false;
var state;
var mes;
var file;

function Chat () {
this.update = updateChat;
this.send = sendChat;
this.getState = getStateOfChat;
}

//gets the state of the chat
function getStateOfChat(){
if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'getState',
'file': file
},
dataType: "json",

success: function(data){
state = data.state;
instanse = false;
},
});
}
}

//Updates the chat
function updateChat(){
if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'update',
'state': state,
'file': file
},
dataType: "json",
success: function(data){
if(data.text){
for (var i = 0; i < data.text.length; i++) {
$('#chat-area').append($("<p>"+ data.text[i] +"</p>"));
}
}
document.getElementById('chat-area').scrollTop = document.getElementById('chat-area').scrollHeight;
instanse = false;
state = data.state;
},
});
}
else {
setTimeout(updateChat, 1500);
}
}

//send the message
function sendChat(message, nickname)
{
updateChat();
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'send',
'message': message,
'nickname': nickname,
'file': file
},
dataType: "json",
success: function(data){
updateChat();
},
});
}


--------------------------------------------------------------------------------

فایل index.php


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
chrom
<title>index.php</title>

<link rel="stylesheet" href="style.css" type="text/css" />

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="chat.js"></script>
<script type="text/javascript">



// ask user for name with popup prompt
var name = prompt("Enter your chat name:", "Guest");
var destination=prompt("Who do you want to chat with?:","Guest")

// default name is 'Guest'
if (!name || name === ' ') {
name = "Guest";
}
if (!destination || destination === ' ') {
destination = "Guest";
}

// strip tags
name = name.replace(/(<([^>]+)>)/ig,"");
destination = destination.replace(/(<([^>]+)>)/ig,"");

// display name on page
$("#name-area").html("You are: <span>" + name + "</span>");

// kick off chat
var chat = new Chat();
$(function() {

//chat.getState()
chat.getState(name,destination);

// watch textarea for key presses
$("#sendie").keydown(function(event) {

var key = event.which;

//all keys including return.
if (key >= 33) {

var maxLength = $(this).attr("maxlength");
var length = this.value.length;

// don't allow new content if length is maxed out
if (length >= maxLength) {
event.preventDefault();
}
}
});
// watch textarea for release of key press
$('#sendie').keyup(function(e) {
alert
if (e.keyCode == 13) {

var text = $(this).val();
var maxLength = $(this).attr("maxlength");
var length = text.length;

// send
if (length <= maxLength + 1) {

//chat.send(text, name)
chat.send(text, name, destination);
$(this).val("");

} else {

$(this).val(text.substring(0, maxLength));

}


}
});

});
</script>

</head>

//<body onload="setInterval('chat.update()', 1000)">
<body onload="setInterval('chat.update(name,destination)', 1000)">


<div id="page-wrap">

<h2>jQuery/PHP Chat</h2>

<p id="name-area"></p>

<div id="chat-wrap"><div id="chat-area"></div></div>

<form id="send-message-area">
<p>Your message: </p>
<textarea id="sendie" maxlength = '100' ></textarea>
</form>

</div>

</body>

</html>

به جای:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>Chat</title>

<link rel="stylesheet" href="style.css" type="text/css" />

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="chat.js"></script>
<script type="text/javascript">

// ask user for name with popup prompt
var name = prompt("Enter your chat name:", "Guest");

// default name is 'Guest'
if (!name || name === ' ') {
name = "Guest";
}

// strip tags
name = name.replace(/(<([^>]+)>)/ig,"");

// display name on page
$("#name-area").html("You are: <span>" + name + "</span>");

// kick off chat
var chat = new Chat();
$(function() {

chat.getState();

// watch textarea for key presses
$("#sendie").keydown(function(event) {

var key = event.which;

//all keys including return.
if (key >= 33) {

var maxLength = $(this).attr("maxlength");
var length = this.value.length;

// don't allow new content if length is maxed out
if (length >= maxLength) {
event.preventDefault();
}
}
});
// watch textarea for release of key press
$('#sendie').keyup(function(e) {

if (e.keyCode == 13) {

var text = $(this).val();
var maxLength = $(this).attr("maxlength");
var length = text.length;

// send
if (length <= maxLength + 1) {

chat.send(text, name);
$(this).val("");

} else {

$(this).val(text.substring(0, maxLength));

}


}
});

});
</script>

</head>

<body onload="setInterval('chat.update()', 1000)">

<div id="page-wrap">

<h2>jQuery/PHP Chat</h2>

<p id="name-area"></p>

<div id="chat-wrap"><div id="chat-area"></div></div>

<form id="send-message-area">
<p>Your message: </p>
<textarea id="sendie" maxlength = '100' ></textarea>
</form>

</div>

</body>

</html>

-----------------------------------------------------------------

فایل process.php:


<?php

$function = $_POST['function'];

$log = array();

switch($function) {

case('getState'):
$nickname = htmlentities(strip_tags($_POST['nickname']));
$destination = htmlentities(strip_tags($_POST['destination']));
if(strcmp(nickname,destination)<0){
$chatfilename=$nickname . "#" . $destination . ".txt";
}else{
$chatfilename=$nickname . "#" . $destination . ".txt";
}
if(file_exists($chatfilename)){
$lines = file($chatfilename);
}
$log['state'] = count($lines);
break;

case('update'):
$state = $_POST['state'];
$nickname = htmlentities(strip_tags($_POST['nickname']));
$destination = htmlentities(strip_tags($_POST['destination']));
if(strcmp(nickname,destination)<0){
$chatfilename=$nickname . "#" . $destination . ".txt";
}else{
$chatfilename=$nickname . "#" . $destination . ".txt";
}
if(file_exists($chatfilename)){
$lines = file($chatfilename);
}
$count = count($lines);
if($state == $count){
$log['state'] = $state;
$log['text'] = false;

}
else{
$text= array();
$log['state'] = $state + count($lines) - $state;
foreach ($lines as $line_num => $line)
{
if($line_num >= $state){
$text[] = $line = str_replace("\n", "", $line);
}

}
$log['text'] = $text;
}

break;

case('send'):
$nickname = htmlentities(strip_tags($_POST['nickname']));
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
$message = htmlentities(strip_tags($_POST['message']));
if(($message) != "\n"){

if(preg_match($reg_exUrl, $message, $url)) {
$message = preg_replace($reg_exUrl, '<a href="'.$url[0].'" target="_blank">'.$url[0].'</a>', $message);
}

$destination = htmlentities(strip_tags($_POST['destination']));

if(strcmp(nickname,destination)<0){
$chatfilename=$nickname . "#" . $destination . ".txt";
}else{
$chatfilename=$nickname . "#" . $destination . ".txt";
}

fwrite(fopen($chatfilename, 'a'), "<span>". $nickname . "</span>" . $message = str_replace("\n", " ", $message) . "\n");
}
break;

}

echo json_encode($log);

?>

به جای:


<?php

$function = $_POST['function'];

$log = array();

switch($function) {

case('getState'):
if(file_exists('chat.txt')){
$lines = file('chat.txt');
}
$log['state'] = count($lines);
break;

case('update'):
$state = $_POST['state'];
if(file_exists('chat.txt')){
$lines = file('chat.txt');
}
$count = count($lines);
if($state == $count){
$log['state'] = $state;
$log['text'] = false;

}
else{
$text= array();
$log['state'] = $state + count($lines) - $state;
foreach ($lines as $line_num => $line)
{
if($line_num >= $state){
$text[] = $line = str_replace("\n", "", $line);
}

}
$log['text'] = $text;
}

break;

case('send'):
$nickname = htmlentities(strip_tags($_POST['nickname']));
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
$message = htmlentities(strip_tags($_POST['message']));
if(($message) != "\n"){

if(preg_match($reg_exUrl, $message, $url)) {
$message = preg_replace($reg_exUrl, '<a href="'.$url[0].'" target="_blank">'.$url[0].'</a>', $message);
}


fwrite(fopen('chat.txt', 'a'), "<span>". $nickname . "</span>" . $message = str_replace("\n", " ", $message) . "\n");
}
break;

}

echo json_encode($log);

?>

--------------------------------------------------------------

قبلا فایل chat.txt وجود داشت تا پیام ها رو نگه داره...

اما الان یه فایل به این شکل: person1#person2.txt که حاوی پیام های ارسالی بین person1 و person2 هست.

--------------------------------------------------------------

jquery.js هم که لازم هست...

--------------------------------------------------------------

style.css هم که تغییر نمی دیم و به این صورت هست:
* { margin: 0; padding: 0; }
body { font: 12px "Lucida Grande", Sans-Serif; background: url(images/bg.png); }
h2 { color: #fa9f00; font: 30px Helvetica, Sans-Serif; margin: 0 0 10px 0; }
#page-wrap { width: 500px; margin: 30px auto; position: relative; }

#chat-wrap { border: 1px solid #eee; margin: 0 0 15px 0; }
#chat-area { height: 300px; overflow: auto; border: 1px solid #666; padding: 20px; background: white; }
#chat-area span { color: white; background: #333; padding: 4px 8px; -moz-border-radius: 5px; -webkit-border-radius: 8px; margin: 0 5px 0 0; }
#chat-area p { padding: 8px 0; border-bottom: 1px solid #ccc; }

#name-area { position: absolute; top: 12px; right: 0; color: white; font: bold 12px "Lucida Grande", Sans-Serif; text-align: right; }
#name-area span { color: #fa9f00; }

#send-message-area p { float: left; color: white; padding-top: 27px; font-size: 14px; }
#sendie { border: 3px solid #999; width: 360px; padding: 10px; font: 12px "Lucida Grande", Sans-Serif; float: right; }





اما نمی دونم چرا از بیخ و بن عمل نمی کنه و وقتی Enter رو می زنیم اصلا پیام رو نمی فرسته: myphphost.newhost.ir/02 (http://barnamenevis.org/myphphost.newhost.ir/02)

IamOverlord
یک شنبه 04 تیر 1391, 01:44 صبح
مشکل در کدی است که در index.php نوشتم،
همون خطی که نوشتم:
chat.getState(name,destination);
قبلا این جوری بود:
chat.getState();
چرا حالا کار نمی کنه؟!
تابع مربوطه که در chat.js هست رو همون طور که می بینید تغییر دادم. مشکل از کجاست؟!

IamOverlord
یک شنبه 04 تیر 1391, 02:35 صبح
کامنت ها رو حذف کردم و ...
پیام ارسال می شه به سرور.
اما مشکلی هست.
این که وقتی aaa و bbb دارن با هم چت می کنن، هم فایل aaa#bbb.txt ساخته می شه و هم فایل bbb#aaa.txt که نباید این اتفاق بیافته و بر اساس کدی که با strcmp نوشتم فقط باید یه فایل برای هر دو نفری ساخته بشه که دارن با هم چت می کنن، از این طریق که username ای که از لحاظ الفبایی کوچک تر هست باید اول فایل بیاد همیشه...

اما نمی دونم چرا هر دو فایل ساخته می شن! مشکل کجاست؟!

IamOverlord
یک شنبه 04 تیر 1391, 12:58 عصر
سلام دوستان.
یه سری از مشکلات در کدنویسی بود که حل شد.
الان پیام ها به سرور می رسه و سرور پیام های رد و بدلی بین دو نفر رو داخل یه فایل یکتا ذخیره می کنه.
مشکل فعلی اینه که کاربرا در پنجره ی چت هیچ پیامی نمی بینن. حالا این یکی رو چی کار کنم؟!
آخرین ویرایش:

index.php


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>index.php</title>

<link rel="stylesheet" href="style.css" type="text/css" />

<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="chat.js"></script>
<script type="text/javascript">



// ask user for name with popup prompt
var name = prompt("Enter your chat name:", "Guest");
var destination=prompt("Who do you want to chat with?:","Guest")


// default name is 'Guest'
if (!name || name === ' ') {
name = "Guest";
}
if (!destination || destination === ' ') {
destination = "Guest";
}


// strip tags
name = name.replace(/(<([^>]+)>)/ig,"");
destination = destination.replace(/(<([^>]+)>)/ig,"");

// display name on page
$("#name-area").html("You are: <span>" + name + "</span>");


// kick off chat
var chat = new Chat();
$(function() {


chat.getState(name,destination);

// watch textarea for key presses
$("#sendie").keydown(function(event) {

var key = event.which;

//all keys including return.
if (key >= 33) {

var maxLength = $(this).attr("maxlength");
var length = this.value.length;

// don't allow new content if length is maxed out
if (length >= maxLength) {
event.preventDefault();
}
}
});
// watch textarea for release of key press
$('#sendie').keyup(function(e) {
if (e.keyCode == 13) {

var text = $(this).val();
var maxLength = $(this).attr("maxlength");
var length = text.length;

// send
if (length <= maxLength + 1) {

//chat.send(text, name)

chat.send(text, name, destination);
$(this).val("");

} else {

$(this).val(text.substring(0, maxLength));

}


}
});

});
</script>

</head>

<body onload="setInterval('chat.update(name,destination)', 1000)">


<div id="page-wrap">

<h2>jQuery/PHP Chat</h2>

<p id="name-area"></p>

<div id="chat-wrap"><div id="chat-area"></div></div>

<form id="send-message-area">
<p>Your message: </p>
<textarea id="sendie" maxlength = '100' ></textarea>
</form>

</div>

</body>

</html>

process.php


<?php

$function = $_POST['function'];

$log = array();

switch($function) {

case('getState'):
$nickname = htmlentities(strip_tags($_POST['nickname']));
$destination = htmlentities(strip_tags($_POST['destination']));
if(strcasecmp($nickname,$destination)<0)
{
$chatfilename=$nickname . "#" . $destination . ".txt";
}
else
{
$chatfilename=$destination . "#" . $nickname . ".txt";
}
if(file_exists($chatfilename)){
$lines = file($chatfilename);
}
$log['state'] = count($lines);
break;

case('update'):
$state = $_POST['state'];
$nickname = htmlentities(strip_tags($_POST['nickname']));
$destination = htmlentities(strip_tags($_POST['destination']));
if(strcasecmp($nickname,$destination)<0)
{
$chatfilename=$nickname . "#" . $destination . ".txt";
}
else
{
$chatfilename=$destination . "#" . $nickname . ".txt";
}
if(file_exists($chatfilename)){
$lines = file($chatfilename);
}
$count = count($lines);
if($state == $count){
$log['state'] = $state;
$log['text'] = false;

}
else{
$text= array();
$log['state'] = $state + count($lines) - $state;
foreach ($lines as $line_num => $line)
{
if($line_num >= $state){
$text[] = $line = str_replace("\n", "", $line);
}

}
$log['text'] = $text;
}

break;

case('send'):
$nickname = htmlentities(strip_tags($_POST['nickname']));
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
$message = htmlentities(strip_tags($_POST['message']));
if(($message) != "\n"){

if(preg_match($reg_exUrl, $message, $url)) {
$message = preg_replace($reg_exUrl, '<a href="'.$url[0].'" target="_blank">'.$url[0].'</a>', $message);
}

$destination = htmlentities(strip_tags($_POST['destination']));

if(strcasecmp($nickname,$destination)<0){
$chatfilename=$nickname . "#" . $destination . ".txt";
}else{
$chatfilename=$destination . "#" . $nickname . ".txt";
}

fwrite(fopen($chatfilename, 'a'), "<span>". $nickname . "</span>" . $message = str_replace("\n", " ", $message) . "\n");
}
break;

}

echo json_encode($log);

?>

chat.js


/*
Created by: Kenrick Beckett

Name: Chat Engine
*/

var instanse = false;
var state;
var mes;
var file;

function Chat () {
this.update = updateChat;
this.send = sendChat;
this.getState = getStateOfChat;
}

//gets the state of the chat

//function getStateOfChat()
function getStateOfChat(nickname,destination){

if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'getState',
'nickname': nickname,
'destination': destination,
'file': file
},
dataType: "json",

success: function(data){
state = data.state;
instanse = false;
},
});
}
}

//Updates the chat
//function updateChat()
function updateChat(nickname, destination){
if(!instanse){
instanse = true;
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'update',
'nickname': nickname,
'destination': destination,
'state': state,
'file': file
},
dataType: "json",
success: function(data){
if(data.text){
for (var i = 0; i < data.text.length; i++) {
$('#chat-area').append($("<p>"+ data.text[i] +"</p>"));
}
}
document.getElementById('chat-area').scrollTop = document.getElementById('chat-area').scrollHeight;
instanse = false;
state = data.state;
},
});
}
else {
setTimeout(updateChat, 1500);
}
}

//send the message
//function sendChat(message, nickname)
function sendChat(message, nickname, destination)

{
updateChat();
$.ajax({
type: "POST",
url: "process.php",
data: {
'function': 'send',
'message': message,
'nickname': nickname,
'destination': destination,
'file': file
},
dataType: "json",
success: function(data){
updateChat();
},
});
}

IamOverlord
یک شنبه 04 تیر 1391, 13:08 عصر
... می گم شاید مشکل از سرعت پایین رد و بدل اطلاعات باشه... آخه گاهی پیام ها خیلی زود می رسیدن و خیلی وقتا هم که باید یه عالمه صبر کنیم... کسی می دونه این قضیه ی کندی به چی مربوط می شه؟مربوط به سرور؟ مربوط به برنامه ی خودم و سرعت Update؟ ...؟

IamOverlord
یک شنبه 04 تیر 1391, 14:48 عصر
سلام...
خوب درست شد مثلا الان کد سرویس چتمون رو داریم...
حالا می خوایم یه پنجره ی چت شبیه facebook یا یه چیزی شبیه gtalk درست کنیم از لجاظ ظاهری... من زیاد تجربه ای تو این زمینه ندارم. فقط می خوام ظاهر کار رو درست کنیم، کد مربوط به انجام عملیات چت نوشته شده...
می شه راهنمایی کنین یا یه نمونه ای بذارین؟ ...

ضمنا خود سرویس کار می کنه و راه افتاده : myphphost.newhost.ir/02 (http://myphphost.newhost.ir/02/) ، فقط ظاهرش مونده...