درخواست های ارتباط
جستجو تنظیمات
لیست دوستان من

آموزش کامل وب سوکت سیستم گفتگو (چت)

21 نظرات

به نام خدا


با عرض سلام خدمت همه ی دوستان عزیز


بدون هیچ مقدمه ای بریم سر اصل مطلب ، در انتهای قسمت قبلی گفتیم که در قسمت سوم آموزش وب سوکت یه سیستم گفتگو (chat) مبتنی بر وب سوکت رو توسعه خواهیم داد. ابتدا قالب قسمت کاربر(client) رو با استفاده از html , css , js طراحی می کنیم که من یه قالب آماده از اینترنت برداشتم با کمی ویرایش به شکل زیر شد که فایل های این قالب و سایر قسمت ها در انتهای آموزش قابل دریافت هستند.


آموزش وب سوکت


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


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


var name = prompt("enter your name :");

کد بالا را به ابتدای فایل index.js اضافه می کنیم


سپس در همان فایل پس از کد زیر


$(document).ready(function() {

کد زیر را اضافه می کنیم


$("#myname").text(myname);

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


حالا باید نام گرفته شده از کاربر به سرور مون ارسال کنیم که این کاربر تازه وارد شده رو به لیست سایر افراد موجود هم اضافه بکنه البته موقع ارسال اسم کاربر که به منزله ورود یک نفر جدید به گفتگو می باشد ، ما در قسمت سرور بررسی می کنیم که آیا قبل این نفر کاربر دیگه در گفتگو هست یا نه اگر بود این کاربر جدید رو به لیست اونها اضافه بکنه نبود که هیچ


یه کار دیگه هم که باید بکنیم اینه که وقتی کاربر جدید وارد شد لیست نفرات قبلی رو هم که در سیستم آنلاین هستند رو بگیریم البته اگر قبلا نفری باشه نبود که هیچ


توضیح زیاد شد بریم سراغ سرور :)


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


<?php

include "PhpWebSocket.class.php";

$host="0.0.0.0";
$port=8000;
$Server = new PHPWebSocket();
$Server->bind('message', 'wsOnMessage');
$Server->bind('open', 'wsOnOpen');
$Server->bind('close', 'wsOnClose');
$Server->wsStartServer($host, $port);

function wsOnMessage($clientID, $message, $messageLength, $binary)
{
	global $Server;
	$ip = long2ip( $Server->wsClients[$clientID][6] );
	$Server->log( "$ip ($clientID) said : $message." );

	$Server->wsSend($clientID , "From Server : ". $message);

}

function wsOnOpen($clientID)
{
	global $Server;
	$ip = long2ip( $Server->wsClients[$clientID][6] );
	$Server->log( "$ip ($clientID) has connected." );
}

function wsOnClose($clientID, $status) {

	global $Server;
	$ip = long2ip( $Server->wsClients[$clientID][6] );
	$Server->log( "$ip ($clientID) has disconnected." );

}


اولین تغغیرات رو ما از تابع wsOnOpen می کنیم


در قسمت قبل گفته شد که این تابع در سرور زمانی فراخوانی می شود که کاربر (client) جدیدی به سرور وصل شود.خب ما هنگامی که کاربری به سرور وصل میشه شماره کاربری ( client id) اون رو در آرایه ای ذخیره می کنیم که بعدا بتونیم متانسب با هر شماره کاربری اسم اون رو هم ذخیره بکنیم پس یه ارایه اس به اسم clients پس از کد زیر بدین صورت ایجاد میکنیم :


نکته قابل توجه آرایه clients در این هست که این آرایه باید داخل یک کلاس باشه تا بتونیم اون رو از نوع static تعریف کنیم که در هر بار اتصال کاربر جدید محتویات قبلی اون که اطلاعات کاربران آنلاین شده قبلی هست پاک نشه


include "PhpWebSocket.class.php";
class core
{
	static $clients;
}

حالا در تابع wsOnOpen کد زیر رو اضافه میکنیم :


function wsOnOpen($clientID)
{
core::$clients[$clientID]=0;
	global $Server;
	$ip = long2ip( $Server->wsClients[$clientID][6] );
	$Server->log( "$ip ($clientID) has connected." );
}

اگر به کدی که اضافه کردیم دقت کنید ما در آرایه client اندیس شماره کاربر رو وارد کردیم و مقدار اون رو صفر قرار دادیم دلیل این کار این هست که چون ما بعدا نام کاربر رو ذخیره می کنیم ، و موقع اتصال کاربر به سرور نام کاربر رو نداریم الان صفر وارد می کنیم در مرحله بعدی نام کاربر رو در اندیس مربوط به خودش وارد می کنیم.


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


کد زیر رو در فایل Index.js پس از اولین سطر اضافه می کنیم :


var log=document.getElementById("log");
serverUrl = 'ws://127.0.0.1:8800/chat_ws/server/server.php';
if (window.MozWebSocket) {
    socket = new MozWebSocket(serverUrl);
} else if (window.WebSocket) {
    socket = new WebSocket(serverUrl);
}

  socket.binaryType = 'blob';
  socket.onopen = function(msg) {
    console.log("connected");
      return true;
  };

  socket.onmessage = function(msg) {

      return true;
  };
  socket.onclose = function(msg) {
    console.log("Bye Bye socket");
    return true;
  };

  function sendmsg(f,t)
  {
  socket.send(f+"**"+t);
  }

کد بالا تقریبا همون کدی هست که در قسمت قبل توضیح داده شد البته با اندکی تفاوت که اون رو توضیح میدیم :


تابع sendmsg دو پارامتر ورودی داره یکی به عنوان تابع یکی به عنوان متن پیام ما تابع و متن پیام رو در یک متغییر قرار میدیم و بین اونها کارکتری مثل * یا هرچیزی قرار میدیم که توی سرور بتونیم اونا رو از هم جدا بکنیم


و دلیل وجود چیزی به نام تابع برای این هست که ما زمانی می خایم از سرور لیست آنلاین ها رو بگیریم یا زمانی میخایم به سرور بگیم که ما رو به لیست آنلاین های بقیه اضافه بکنه و زمانی میخایم گفتگو رو انجام بدیم برای اینکه سرور بتونه درخواست های ما رو بدرستی پاسخ بده به همراه متن یک تابع رو هم ارسال میکنیم وقتی که پیام به سرور رسید اونجا جداسازی میکنیم و برای هر تابع کد های مخصوص به اون می نوسیم و پاسخ رو به کاربر ارسال میکنیم


خب حالا که با ضرورت وجود تابع آشنا شدیم اولین تابعی که نیاز داریم اینهست که نام کاربری کاربر رو در سرور ذخیره بکنه


پس بعد از اتصال به سرور کد زیر رو اضافه می کنیم


socket.onopen = function(msg) {
    console.log("connected");
    sendmsg("save_name",myname);
      return true;
  };

سطری که ما اضافه کردیم پس از اتصال به سرور ، save_name رو به همراه نامی که کاربر وارد کرده رو به سرور ارسال میکنه


حالا میریم سراغ سرور که در تابع wsOnMessage پیغام ارسالی از کاربر رو بگیریم


تابع wsOnMessage رو که قبلا به این صورت نوشته بودیم :


global $Server;
	$ip = long2ip( $Server->wsClients[$clientID][6] );
	$Server->log( "$ip ($clientID) said : $message." );
	$Server->wsSend($clientID , "From Server : ". $message);

به صورت زیر تغییر میدیم


	global $Server;
	$data=explode("**",$message);
	$f=$data[0];
	$t=$data[1];
	switch ($f) {
		case 'save_name':
			core::$clients[$clientID]=$t;
		break;
	}

	$ip = long2ip( $Server->wsClients[$clientID][6] );
	$Server->log( "$ip ($clientID) said : $message." );


کاری که ما کردیم این بود که با استفاده از تابع explode در php ( که معادل این تابع در جاوا اسکریپت هم split هست) تابع و متن رو از هم جدا کردیم و هرکدوم رو متغییر های f و t قرار دادیم سپس با استفاده از تابع switch در php برای حالات مختلف متغییر f که همون تابع ما شرط گذاری کردیم و اولین شرط ما برای زمانی هست که تابع ارسالی از طرف کلاینت save_name هست که برای این قسمت همونطور که بالا اشاره شد در آرایه client در اندیس شماره کاربری که مقدار صفر رو ذخیره کردیم حالا بجای صفر نامی رو که کاربر برای خودش وارد کرده و الان در متغییر t اون رو در دسترس داریم قرار میدیم (طبق کد زیر ) :


$client[$clientID]=$t;

خب حالا نوبت به این میرسه که به بقیه کاربر ها (البته در صورتی که قبل از این کاربری به سرور وصل شده باشه) اعلام کنیم که یه کاربر جدید به گفتگو وارد شد به قول تلگرامی join شد :)


برای این کار ابتدا چک می کنیم که قبلا کاربری به سرور وصل شده یا نه اگر شرطمون صحیح بود به همه ی کاربر ها نام این کاربر جدید رو بفرستیم ، طبق کد زیر :


	core::$clients[$clientID]=$t;
			if ( sizeof($Server->wsClients) > 1 )
			{
				foreach ( $Server->wsClients as $id => $c )
					if ( $id != $clientID )
						$Server->wsSend($id, "new_join**$t");

حالا یه نکته ای که حائز اهمیته اینه که ما وقتی به تک تک کاربر ها عبارت join**username (اینجا منظور از user

name همان نامی است که کاربر برای خودش وارد کرده و در متغییر t موجوده) برای سایر کاربر ها ارسال کردیم همه اون عبارت رو دریافت می کنند ولی در قسمت کلاینت هم باید مثل سرور باید متغییری داشته باشیم که تابع رو از متن جدا کنیم و داخل اون قرار بدیم و سپس اون رو شرط گذاری بکنیم که مثلا وقتی سرور تابع new

join رو برات فرستاد تو به لیست افراد آنلاین یکی رو اضافه کن دقیقا همون کاری که در قسمت سرور انجام دادیم پس در قسمت کلاینت و در تابع socket.onmessage که وقتی پیغامی از سمت سرور میاد این تابع فراخوانی میشه اینجا ما ابتدا جداسازی میکنیم و سپس با استفاده از switch حالات مختلف تابع رو بررسی میکنیم دقیقا مثل قسمت سرور !


مثل کد زیر :


socket.onmessage = function(msg) {
    data=msg.data.split("**");
    console.log(data);
      return true;
  };

متغییر msg.data همون پیغامی رو داره که سرور اونو میفرسته و ما تو سرور بین نام کاربری و اسم تابع که new_join بود دوتا ستاره گذاشتیم حالا اینجا با تابع split اونا رو از هم جدا می کنیم و میره (البته این کار و برعکس این هم که تو قسمت سرور انجام شد رو هم میشه با json انجام داد ولی برای من این ساده تر بود)


در سطر بعدی توی کنسول لاگ میگیریم که چی از سرور اومد


برای درک بهتر من سرور رو اجرا کردم ابتدا با مررگر chrome وارد شدم و اسم farhad رو زدم سپس با مرورگر opera رفتم و با اسم reza وارد شدم چون قبل از reza کسی به اسم farhad در سیستم وجود داره باید ورود و یا همون join شدن reza رو به فرهاد بگه که طبق تصویر زیر میبینید که توی مرورگر chrome که با farhad وارد شده توی کنسول ورود رضا از طرف سرور اعلام میشه


آموزش وب سوکت چت


حالا کاری که باید بکنیم اینه که توی جاوا اسکریپت یا با جی کوئری کدی بنویسیم که وقتی تابع ما new_join بود به لیست نفرات آنلاین این رو اضافه بکنه


خب توی کد بالا کد لاگ کردن توی کنسول رو حذف میکنیم چون یه بار دیدیم که سرور درست میفرسته پس دیگه نیازی نداریم و در ادامه کد زیر رو اضافه می کنیم :


data=msg.data.split("**");
    switch (data[0]) {
      case 'new_join':
        friendData='<li><img width="50" height="50" src="img/user.png">';
          friendData+='<div class="info">';
            friendData+='<div class="user">'+data[1]+'</div>';
            friendData+='<div class="status on"> online</div>';
          friendData+='</div>';
        friendData+='</li>';
          $(".list-friends").append(friendData);
        break;
      default:

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


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


برای این کار برمیگردیم سراغ سرور دقیقا همون جایی که اگر قبل این کاربر جدید ، کاربر قبلی بود ورودش رو اعلام بکنه بعد از اون کد ما با استفاده از اون آرایه client که اطلاعات بقیه کاربر ها رو داره اون ها رو به کاربر تازه وارد شده میفرستیم به کد زیر توجه بنمایییید :


در واقع کد نهایی قسمت save_name به صورت زیر می شود :


case 'save_name':
			core::$clients[$clientID]=$t;
			if ( sizeof($Server->wsClients) > 1 )
			{
				foreach ( $Server->wsClients as $id => $c )
					if ( $id != $clientID )
						$Server->wsSend($id, "new_join**$t");

				foreach(core::$clients as $cID=>$name)
				{
					if ($cID!=$clientID)
					$Server->wsSend($clientID, "online_list**$name");
				}
			}
		break;

که تابع Online_list هم اسامی کاربران موجود به غیر از خودش رو برای اضافه کردن به لیست کاربر تازه وارد شده میفرسته


حالا میریم به قسمت کلاینت تا لیست نفرات آنلاین رو وقتی کاربر جدید وارد شد توی نوار سمت چپی نمایش بدیم


کد زیر رو اضافه می کنیم (برای همون سوئیچی که قبلا در قسمت کلاینت نوشتیم) :


case "online_list" :
        friendData='<li><img width="50" height="50" src="img/user.png">';
          friendData+='<div class="info">';
            friendData+='<div class="user">'+data[1]+'</div>';
            friendData+='<div class="status on"> online</div>';
          friendData+='</div>';
        friendData+='</li>';
          $(".list-friends").append(friendData);
      break;

هرچند کد این تابع با تابع new_join یکی هست ولی بهتره که جدا باشند شاید در آینده یه تغییری ایجاد شد پس احتیاط لازم هست که از بهم ریختگی کد ها پیشگیری کنیم (پیشگیری بهتر از درمان D: )



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



خب یه نفس عمیق بکشید :) خستگی در کنید بریم سراغ خود گفتگو (chat)



کار زیادی نمونده توی دوتا سوئیچمون دوتا حالت در نظر میگیریم برای وقتی که تابع ما مقدارش برابر new_message باشه


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


میریم سراغ فایل index.js


کد زیر باعث میشه وقتی کلید Enter یا روی دکمه ی send کلیک میکنیم تابع insertI رو فراخوانی بکنه


  $("#texxt").keypress(function(e) {
      if (e.keyCode === 13) {
        insertI();
        return false;
      }
    });

خب حالا بریم سراغ تابع insertI


خیلی کد خاصی نداره ! فقط ابتدا چک میکنه که محتوای فیلد ورودی اگر خالی نباشه مقدارش رو برداره و تو صفحه گفتگو نمایش بده سپس اونو به سرور هم بفرسته و نهایتا مقدار فیلد ورودی رو خالی بکنه


insertI = function() {
    var innerText;
    innerText = $.trim($("#texxt").val());
    if (innerText !== "") {
      $(".messages").append("<li class=\"i\"><div class=\"head\"><span class=\"time\">" + (new Date().getHours()) + ":" + (new Date().getMinutes()) + " AM, Today</span><span class=\"name\"> "+myname+"</span></div><div class=\"message\">" + innerText + "</div></li>");
      claerResizeScroll();
      sendmsg("new_message",innerText);
    }
  };

خب حالا ما وقتی یه چیزی تایپ کنیم و Enter بزنیم تو گفتگو نشون داده میشه و اونو به سرور هم ارسال میکنه حالا میریم سراغ قسمت سرور و کدی رو می نویسیم برای زمانی که تابع new_message شد متن ارسالی رو به سایر کاربر ها ارسال بکنه


case 'new_message' :
		if ( sizeof($Server->wsClients) > 1 )
		{
			foreach ( $Server->wsClients as $id => $c )
				if ( $id != $clientID )
					$Server->wsSend($id, "new_message**".core::$clients[$clientID]."**$t");
		}
		break;

کد بالا دیگه باید براتون مفهوم باشه فقط نکته ای که وجود داره ما اینجا ابتدا new_message و سپس نام کاربر (کسی که پیام میفرسته برای گفتگو) و در آخر متن ارسالی کاربر رو در یک عبارت قرار میدیم و بینشون ** میزاریم که بعدا توی کلاینت جداسازی بکنیم یعنی این بار ما سه تا پارامتر میفرستیم به کلاینت خب حالا توی سوئیچ کلاینت هم به صورت زیر عمل می کنیم :


case "new_message" :
        $(".messages").append("<li class=\"friend-with-a-SVAGina\"><div class=\"head\"><span class=\"time\">" + (new Date().getHours()) + ":" + (new Date().getMinutes()) + " AM, Today</span><span class=\"name\"> " + data[1] + "</span></div><div class=\"message\">" + data[2] + "</div></li>");
      break;

خیلی ساده ! ما سه تا پارامتر ارسال کردیم و این دفعه توی آرایه data ما سه تا مقدار وجود داره که به ترتیبت تابع ، نام کاربر اسرال کننده پیام و متن ارسالی کاربر هست


خب کار تمومه الان وقتی کاربر پیامی رو ارسال میکنه به بقیه هم میره !


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


البته یه جزئی تغییرات میخاد (مثل ثبت تاریخ و زمان شمسی و اینکه وقتی کاربری خارج میشه اونو از لیست آنلاین ها حذف بکنه که با توجه به مطالبی که گفته شد نوشتنش براتون خیلی ساده اس که البته اگر عمری باقی بود نسخه دوم این که ثبت نام و عضویت و ... هم باشه به اضافه این دو مورد رو ، توسعه میدیم )


انگار زیاد شد : | اگر سوالی داشتین بپرسین


دریافت فایل های پروژه


در پناه حق موفق باشید



نویسنده : فرهاد مهریاری


منبع : انجمن تخصصی فناوری اطلاعات ایران


هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.


آیا این مطلب را پسندیدید؟
ردیف عنوان قیمت
1 آموزش کامل وب سوکت - قسمت اول رایگان
2 آموزش کامل وب سوکت - قسمت دوم رایگان
3 آموزش کامل وب سوکت سیستم گفتگو (چت) رایگان
  • بااین سه قسمت کامل میشه؟؟/؟



    دیگه هیچی نیست بهش اضافه کنی؟


  • قابلیت مکالمه رومیگم مکالمه صوتی


  • برنامه نویسی هیچ وقت کامل نمیشه


    بسته به نیاز و خلاقیت همیشه جا برای توسعه هست.


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


  • سلام آموزش تون عالیه



    فقط یه سوال ما تو سرور لوکال فایل server.php رو با استفاده از cmd یا shell اجرا میکنیم و از اون استفاده میکنیم.


    حالا اگه بخواهیم این فایل رو توی سرور اصلی و در cpanel اجرا کنیم چه کار باید بکنیم تو cpanel که cmd نداره بخواهیم فایل و اجرا کنیم.


    من میخوام فایل server.php همیشه رو سرور اجرا باشه.


  • سلام ممنون از لطفتون


    با سی پنل یا بهتر بگیم توی هاست های اشتراکی چنین امکانی وجودنداره که فایل php رو از طریق ترمینال یا shell اجرا بکنید


    برای راه اندازی این سرور نیاز دارین که VPS یا همون سرور مجازی خریداری بکنین


  • سلام، ممنون از آموزش عالیتون


    چند تا سوال دارم


    1- آیا هاست غیر اشتراکی هم داریم یا نه؟؟


    2- من یه هاست دارم که نوشته sockets-support=enabled یعنی چی؟؟


    3- یه جا خوندم که راهی هست که websocket خودش اجرا بشه، چطوری؟؟؟


    ممنون از پاسخ هایی که خواهید داد، پیشاپیش :)


  • سلام خواهش میکنم.


    1-بله هاست غیر اشتراکی میشه همون vps یا سرور مجازی


    2-سوکت فعال باشه شرط لازم هست ، شرط کافی اینه که به شما دسترسی بده که فایل php رو از طریق ترمینال اجرا بکنید


    3-خود به خود فکر نمیکنم بشه ! خب یه فایل عه ! باید از طریق کاربر اجرا بشه



  • یه سوال دیگه


    et chat


    چطوری کار می کنه؟؟؟ اونم از websocket استفاده می کنه؟؟؟


  • سلام


    میشه آموزش استفاده از Ratchet PHP WebSocket رو توی سایت قرار بدید.


  • et chat از وب سوکت استفاده نمی کنه.


    ratchet هم پایه و کانسپتش دقیقا همین مواردی هست که توی این آموزش ها بیان شد یعنی ابزار جدید ارتباطی اضافه نکرده ، فقط نوع کد نویسیش متفاوت هست که از شی گرائی و namespace استفاده کرده


  • عرض سلام و خسته نباشید ! سوالی داشتم اونم اینکه برای استفاده از این توی لاراول باید چیکار بکنم ؟



  • سرور شما مستقل از لاراول و در صورت نیاز مستقیما با دیتابیس کار میکنه ،


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


  • سلام


    ممنون از آموزش خوبت


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


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


    موقع ارسال و دریافت باید از \n استفاده کنم؟


    ممنون میشم راهنمایی کنید


  • نه نیازی به /n نیست !


    از چه کتابخونه ای استفاده می کنید؟


  • از کتابخونه خارجی استفاده نمیکنم، از کلاس های داخلی اندروید


    مشکل رو متوجه شدم از کجاست، از handshake


    ولی نمیدونم چطوری باید سمت اندروید پیاده سازیش کنم


    الان کد زیر رو برای handshake گزاشتم ولی درست کار نمیکنه


    private void handshake(PrintWriter output, BufferedReader input) {
            String line = "";
            try {
                while((line = input.readLine()) != null) {
                    if(line.contains("Sec-WebSocket-Key: ")) { // check if its the header-line containing the websocket key
                        break;
                    }
                }
            } catch(IOException e) {
                Log.e(G.TAG, e.getMessage(), e);
            }
            Pattern pattern = Pattern.compile("Sec-WebSocket-Key:[ ]*([^\r^\n]*)");
            Matcher matcher = pattern.matcher(line); // with pattern "Sec-WebSocket-Key:[ ]*([^\r^\n]*)" to parse the key out of the line
            boolean matches = matcher.matches();
            String  key     = matcher.group(1);
            key = key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; // adding the "magic string"
            key = encodeString(key);
    
            String header =
                    "HTTP/1.1 101 Switching Protocols\r\n" + "Upgrade: websocket\r\n" +
                    "Connection: Upgrade\r\n" + "Sec-WebSocket-Accept:" + key + "\r\n\r\n";
            output.print(header);
        }
    
        static String encodeString(String input) {
            MessageDigest digest = null;
            try {
                digest = MessageDigest.getInstance("SHA-1");
                byte[] inputBytes = input.getBytes();
                byte[] hashBytes  = digest.digest(inputBytes);
                return Base64.encodeToString(hashBytes, Base64.NO_WRAP);
            } catch(NoSuchAlgorithmException e) {
                Log.e(G.TAG, e.getMessage(), e);
            }
            return "";
        }
    
  • سلام، ضمن تشکر از آموزش خوبتون یک سوالی داشتم


    من این وب سوکت رو روی vps راه اندازی کردم از طریق putty و SSH هم فایل server.php رو اجرا کردم تا وب سوکت run بشه، اما وقتی که محیط ترمینال putty رو میبندم وب سوکت غیرفعال میشه. چطور میشه کاری کرد که وب سوکت همیشه فعال بمونه حتی بعد از بستن محیط ترمینال؟ برای کاری که دارم لازمه تا وب سوکت دائما run باشه


    ممنون


  • در انتهای دستور تون & اضافه کنید تا به عنوان background process اجرا بشه


  • سلام تو این برنامه وقتی چندتا client باز میکنی و پیامی میفرستی اون پیام broadcast میشه و به همه client ها میره باید چکار کنم که client دو به دو بتونن با هم چت کنن.اگه میشه توضیح بدید.ممنون.


  • برای اینکه بتونید چت دو نفره یا pv رو راه اندازی بکنید باید بجای هنگام ارسال پیغام از کلاینت به سرور آیدی کلاینت مورد نظر رو هم بفرستین تا بجای foreach پیغام رو مستقیما به کلاینت مورد نظر بفرسته


  • سلام خسته نباشین


    نظراتو خوندم چنتا سوال برام پیش اومده اول اینکه گفتین باید تو سرور مجازی راه اندازی کنیم ینی چی ؟ اینکه فایل server.php رو تو وی پی اس اجرا کنیم ؟ خب سمت کاربرو چطور به کاربر نشون بدم ؟ بلاخره ی دامینی چیزی باید باشه


    دوم اینکه میشه من سمت کاربر رو رو هاست اشتراکی ذخیره کنم و فایل سروررو تو وی پی اس ؟


    الان سمت کاربرو تو هاستم ذخیره کردم و سرورو رو کامپیوتر خودم ... و ای پی خودمو بهش دادم الان فقط کسایی میتونن تو سیستم چت کنن که به مودمم وصلن چیکار باید کنم که همه بتونن وصل بشن



  • سلام ممنون میشم اگر خروج کاربر از چت رو هم بگید. مثلا یک دکمه خروج یا ترک اتاق چت روم وجود داره و کاربر بعد از اینکه روی اون کلیک کنه از چت خارج بشه و برای کاربرهای دیگه پیام خروج اون شخص فرستاده بشه (صرفا با زدن همون دکمه نه اینکه حتما مرورگر رو بسته باشه ) و مهمتر از همه سمت سرور هم در قسمت $Server->wsClients از لیست سرور هم حذف بشه تا تعداد افراد آنلاین و حاضر بدرستی نمایش داده بشه


    لطفا نحوه کدنویسی این بخش رو هم اضافه کنید.


    تشکر از آموزش خوبتون


برای ارسال نظر ابتدا به سایت وارد شوید

arrow