English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تفسير استخدام websocket في PHP

تعليقات مفصلة حول استخدام websocket في PHP، للاستعانة بها.

خادم: 

<?php
//send user join
//send1 send message
//send2 logout
error_reporting(E_ALL ^ E_NOTICE);
ob_implicit_flush();
//file_put_contents('lz.text','123', FILE_APPEND);
$sk = new Sock('127.0.0.1', 8000);
$sk->run();
class Sock{
 public $sockets;
 public $users;
 public $master;
 private $sda = array(); // البيانات المُستقبلة
 private $slen = array(); // طول البيانات الإجمالية
 private $sjen = array(); // طول البيانات المُستقبلة
 private $ar = array(); // مفتاح التشفير
 private $n = array();
 public function __construct($address, $port){ 
 $this->master = $this->WebSocket($address, $port); // resource(2, Socket) // الاستماع إلى الخادم
 var_dump("master:");
 var_dump($this->master);
 $this->sockets = array($this->master); // array (size=1) 0 => resource(2, Socket) . تشغيل اثنين من php بهذه الطريقة
 //var_dump($this->sockets);}
 //file_put_contents('lz.text',var_dump($this->sockets), FILE_APPEND);
 }
 function run(){
 while(true){
  $changes=$this->sockets;//$changes由多变1,但$this->sockets却只是稳定的+1;
  $write=NULL;
  $except=NULL;
  //1.运行select()系统调用在给定阵列插座与指定的超时
  //2.没有接收到数据就会一直处于阻塞状态,
  //3.若没有client过来,直阻塞进程,直到有client访问,返回1。
  
   /*select的特殊作用:!!!!!!!
  初始为array(0=>resource(2, Socket))
  1,初始状态返回为array(0=>resource(2, Socket))。但socket_accept可以得到resource(3, Socket)
  2,初始状态返回为array(0=>resource(2, Socket),1=>resource(3,Socket))。
   客户来的客户为resource(3,Socket)。则返回的数据为resource(3,Socket).!!!
  */
  var_dump($changes);
  $rr=socket_select($changes,$write,$except,NULL);
  var_dump($changes);
  var_dump("---*---");
  //exit;
  /*
  file_put_contents('lz.text',json_encode($changes), FILE_APPEND);
  file_put_contents('lz.text','-----', FILE_APPEND);*/
  foreach($changes as $sock){
  //连接主机的client
  //$this->master始终是 resource(2, Socket)。相当于一个缓存。两种情况,1:为空,使进程阻塞。2:存刚接收的client。
  if($sock==$this->master){ //---يستخدم هنا فقط لتخزين البيانات
//بعد إنشاء مصدر socket باستخدام socket_create()، يجب استخدام socket_bind() لتحديد الاسم، والتنبيه إلى socket_listen()، والذي سيقبل الاتصالات الداخلية، مصدر.
//بمجرد الاتصال الناجح، سيتم إرجاع مصدر socket جديد!! يمكن استخدامه للتواصل. إذا كان هناك عدة اتصالات على المصدر، سيتم استخدام الأولى.
//إذا لم يكن هناك اتصال معطوف، سيبقى socket_accept() ينتظر حتى يصبح الاتصال الآن. إذا تم استخدام مصدر غير منتهك بالحظر بالفعل باستخدام socket_set_blocking() أو socket_set_nonblock()، سيتم إرجاع خطأ.
//لا يمكن استخدام مصدر resource socket_accept() لقبول الاتصالات الجديدة. يبقى المصلد المستمع مفتوحًا، يمكن تكراره. 
   $client=socket_accept($this->master); //resource(3, Socket) تم استقبال الطلب وإنشاء رابط فرعي جديد!!
    //var_dump($client);
   //exit;
   $key=uniqid();
   $this->sockets[]=$client;
   $this->users[$key]=array(  
   'socket'=>$client,
   'shou'=>false
   );
   /*
   array (size=1)
    '57d607085f92a' =>  //$key
   array (size=2)
    'socket' => resource(3, Socket) //$socket تبدو جميعها متشابهة،لكن يتم التمييز بينها فقط من خلال $key
    'shou' => boolean false
    */
  // file_put_contents('lz.text',json_encode($this->users), FILE_APPEND);
  }else{ //---هنا يتم إرسال واستقبال المعلومات من قبل الخادم والعميل
   $len=0; 
   $buffer='';
   do{
   /*    
   int socket_recv ( resource socket, string &buf, int len, int flags )
   resource socket هو الجهاز المولد للتواصل
   string &buf 是接收缓冲区
   int len 是你打算接收的长度
   int flags 是一个标志
   0x1 数据应该带外发送,所谓带外数据就是TCP紧急数据
   0x2 使有用的数据复制到缓冲区内,但并不从系统缓冲区内删除。
   0x4 不要将包路由出去。
   以上三项与sock.h文件中定义完全相同
   0x8 数据完整记录
   0x100 数据完整处理
   */
   $l=socket_recv($sock,$buf,1000,0);//原来取数据是一个缓慢的过程,要一次一次取数据,并计算每次buf的长度,让总长度不超过设定值
   //var_dump($l);
   // exit;
  // file_put_contents('lz.text','socket_recv', FILE_APPEND);
   $len+=$l;
   $buffer.=$buf;
   }
   $k=$this->search($sock);//跟据sock返回key值
   if($len<7){ //发过来的消息太短了,系统就判断 断了,断掉链接。
   $this->send2($k);//用户退出。1关闭这个$key值对应的socket、删除这条key记录。将sockets数组对象重新排列。
                 //2
   continue;
   }
   if(!$this->users[$k]['shou']){//判断用户的握手字段是true?否则重新握手。
   $this->woshou($k,$buffer);
   //file_put_contents('lz.text','woshou', FILE_APPEND);
   }else{ //如果用户已经握手,则与用户之间进行通信。终于可以发消息了!
   $buffer = $this->uncode($buffer,$k); //返编译
   if($buffer==false){
    continue;
   }
   //var_dump($bufffer);
   //exit;
   $this->send($k,$buffer);
   }
  }
  }
 }
 }
 function close($k){
 socket_close($this->users[$k]['socket']);
 unset($this->users[$k]);
 $this->sockets=array($this->master);
 foreach($this->users as $v){
  $this->sockets[]=$v['socket'];
 }
 $this->e("key:$k close");
 }
 function search($sock){
 foreach ($this->users as $k=>$v){
  if($sock==$v['socket'])
  return $k;
 }
 عدم التحقق;
 }
 function WebSocket($address,$port){ // server listens
 // creates and returns a socket resource, also known as a communication node. A typical network connection consists of 2 sockets, one running on the client side and the other on the server side. 
 // protocol, type, specific protocol
 $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); //resource(2, Socket)
 // file_put_contents('lz.text', $server, FILE_APPEND);//supplied resource is not a valid stream resource
    // returns bool. socket resource, protocol level, available socket option, value.
 $r=socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);//boolean true
 // binds address to socket. This operation must be done before using socket_connect() أو socket_listen() to establish a connection. 
 $r2=socket_bind($server, $address, $port);//boolean true
 // في socket套جية تم إنشاؤها باستخدام socket_create() و bind()اسم، يمكنه إخبار socket الاستماع بوجود اتصال.
 $r3=socket_listen($server);//boolean true
 $this->e('Server Started : '.date('Y-m-d H:i:s'));
 $this->e('Listening on : '.$address.' port '.$port);
 return $server;
 }
 function woshou($k,$buffer){
 //对接收到的buffer处理,并回馈握手!!
 $buf = substr($buffer,strpos($buffer,'Sec-WebSocket-Key:')+18);
 $key = trim(substr($buf,0,strpos($buf,"\r\n")));
 $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));
 $new_message = "HTTP/1.1 101 Switching Protocols\r\n";
 $new_message .= "Upgrade: websocket\r\n";
 $new_message .= "Sec-WebSocket-Version: 13\r\n";
 $new_message .= "Connection: Upgrade\r\n";
 $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";
 socket_write($this->users[$k]['socket'],$new_message,strlen($new_message)); //sokcet,buffer(缓冲区),长度
 $this->users[$k]['shou']=true;
 return true;
 } 
 function uncode($str,$key){ //返编译
 $mask = array(); 
 $data = ''; 
 $msg = unpack('H*',$str); //unpack() 函数从二进制字符串对数据进行解包。
 $head = substr($msg[1],0,2); 
 if ($head == '81' && !isset($this->slen[$key])) { 
  $len=substr($msg[1],2,2);
  $len=hexdec($len);
  if(substr($msg[1],2,2)=='fe'){
  $len=substr($msg[1],4,4);
  $len=hexdec($len); //hexdec() 函数把十六进制转换为十进制。
  $msg[1]=substr($msg[1],4);
  }else if(substr($msg[1],2,2)=='ff'){
  $len=substr($msg[1],4,16);
  $len=hexdec($len);
  $msg[1]=substr($msg[1],16);
  }
  $mask[] = hexdec(substr($msg[1],4,2)); 
  $mask[] = hexdec(substr($msg[1],6,2)); 
  $mask[] = hexdec(substr($msg[1],8,2)); 
  $mask[] = hexdec(substr($msg[1],10,2));
  $s = 12;
  $n=0;
 }else if($this->slen[$key] > 0){
  $len=$this->slen[$key];
  $mask=$this->ar[$key];
  $n=$this->n[$key];
  $s = 0;
 }
 $e = strlen($msg[1])-2;
 for ($i=$s; $i<= $e; $i+= 2) { 
  $data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2))); 
  $n++; 
 } 
 $dlen=strlen($data);
 if($len > 255 && $len > $dlen+intval($this->sjen[$key])){
  $this->ar[$key]=$mask;
  $this->slen[$key]=$len;
  $this->sjen[$key]=$dlen+intval($this->sjen[$key]);
  $this->sda[$key]=$this->sda[$key].$data;
  $this->n[$key]=$n;
  عدم التحقق;
 }
  unset($this->ar[$key],$this->slen[$key],$this->sjen[$key],$this->n[$key]);
  $data=$this->sda[$key].$data;
  unset($this->sda[$key]);
  return $data;
 }
 }
 function code($msg){ //ترجمة
 $frame = array(); 
 $frame[0] = '81'; 
 $len = strlen($msg);
 if($len < 126){
  $frame[1] = $len<16?'0'.dechex($len):dechex($len);
 }else if($len < 65025){
  $s=dechex($len);
  $frame[1]='7e'.str_repeat('0',4-strlen($s)).$s;
 }
  $s=dechex($len);
  $frame[1]='7f'.str_repeat('0',16-strlen($s)).$s;
 }
 $frame[2] = $this->ord_hex($msg); 
 $data = implode('',$frame); 
 return pack("H*", $data); 
 }
 function ord_hex($data) { 
 $msg = ''; 
 $l = strlen($data); 
 for ($i= 0; $i<$l; $i++) { 
  $msg .= dechex(ord($data{$i})); 
 } 
 return $msg; 
 }
 //إضافة مستخدم
 function send($k,$msg){
 parse_str($msg,$g);//تحويل النص البحثي إلى متغيرات
 $ar=array();
 if($g['type']=='add'){
  $this->users[$k]['name']=$g['ming'];
  $ar['type']='add';
  $ar['name']=$g['ming'];
  $key='all';
 }
  $ar['nrong']=$g['nr'];
  $key=$g['key'];
 }
 $this->send1($k,$ar,$key);
 }
 function getusers(){
 $ar=array();
 foreach($this->users as $k=>$v){
  $ar[]=array('code'=>$k,'name'=>$v['name']);
 }
 return $ar;
 }
 //$k كود الشخص الذي يرسل $key كود الشخص الذي يستقبل
 function send1($k,$ar,$key='all'){
 $ar['code1']=$key;
 $ar['code']=$k;
 $ar['time']=تاريخ('m-d H:i:s');
 $str = $this->code(json_encode($ar));
 if($key=='all'){
  $users=$this->users;
  if($ar['type']=='add'){
  $ar['type']='madd';
  $ar['users']=$this->getusers();
  $str1 = $this->code(json_encode($ar));
  socket_write($users[$k]['socket'],$str1,strlen($str1));//sender
  unset($users[$k]);
  }
  foreach($users as $v){
  socket_write($v['socket'],$str,strlen($str));//recipient
  }
 }
  socket_write($this->users[$k]['socket'],$str,strlen($str));//sender
  socket_write($this->users[$key]['socket'],$str,strlen($str));//recipient
 }
 }
 //user logout
 function send2($k){
 $this->close($k);
 $ar['type']='rmove';
 $ar['nrong']=$k;
 $this->send1(false,$ar,'all');
 }
 function e($str){
 //$path=dirname(__FILE__).'/log.txt';
 $str=$str."\n";
 //error_log($str,3,$path);
 echo iconv('utf-8','gbk//IGNORE',$str);
 }
}
?>

 العميل:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
<title>HTML5 websocket webpage chat room javascript php</title>
<style type="text/css">
body,p{مسافة:0px; مسافة_داخلية:0px; حجم_الخط:14px; لون:#333; عائلة_الخط:Arial, Helvetica, sans-serif;}
#ltian,.rin{حجم:98%; مسافة:5px مركزية_بالعلم;}
#ltian{حواف:1px #ccc مستقيمة; تمرير_العمودي:جاري_بالمستند; تمرير_الافقي:لا_يوجد; Pozي望远ي:مطلقية;}
#ct{حجم_الجنب_اليمنى:111px; ارتفاع:100%; تمرير_العمودي:جاري_بالمستند; تمرير_الافقي:لا_يوجد;}
#us{حجم:110px; تمرير_العمودي:جاري_بالمستند; تمرير_الافقي:لا_يوجد; ايتجاه_يمين; حواف_اليسار:1px #ccc مستقيمة; ارتفاع:100%; خلفية_لون:#F1F1F1;}
#us p{مسافة_داخلية:3px 5px; لون:#08C; خط_ارتفاع:20px; ارتفاع:20px; سهم_النقر:مؤشر_النقر; تمرير_النص:لا_يوجد; حجم_النص:لا_يوجد; نص_تلوين:مقتصر_على_النص;}
#us p:hover,#us p:active,#us p.ck{خلفية_لون:#069; لون:#FFF;}
#us p.my:hover,#us p.my:active,#us p.my{لون:#333; خلفية_لون:شفافية;}
button{ايتجاه_يمين; حجم:80px; ارتفاع:35px; حجم_الخط:18px;}
input{حجم:100%; ارتفاع:30px; مسافة_داخلية:2px; خط_ارتفاع:20px; خط_تلوين:لا_يوجد; حواف:مستقيمة 1px #CCC;}
.rin p{حجم_الجنب_اليمنى:160px;}
.rin span{ايتجاه_يمين; مسافة_داخلية:6px 5px 0px 5px; Pozي션:مطلقية;}
.rin span img{مسافة:0px 3px; سؤال_النقر:مؤشر_النقر;}
.rin span form{الوضع:مطلق; عرض:25px; طول:25px; تمرير_الاطوال:غير_محدود; شفافية:0; اعلى:5px; يمين:5px;}
.rin span input{عرض:180px; طول:25px; مسافة_اليسار:-160px; سؤال_النقر:مؤشر_النقر;}
#ct p{مسافة_الاطوال:5px; طول_الخط:20px;}
#ct a{لون:#069; سؤال_النقر:مؤشر_النقر;}
#ct span{لون:#999; مسافة_اليمين:10px;}
.c2{لون:#999;}
.c3{لون_الخلفية:#DBE9EC; مسافة_الاطوال:5px;}
.qp{الوضع:مطلق; حجم_النص:12px; لون:#666; اعلى:5px; يمين:130px; تعديل_النص:لا; لون:#069;}
#ems{الوضع:مطلق; فهرس_الزمن:5; عرض_في_خط:لا; اعلى:0px; يسار:0px; اكبر_عرض:230px; لون_الخلفية:#F1F1F1; حدود:خط_مستقيم 1px #CCC; مسافة_الاطوال:5px;}
#ems img{عرض:44px; طول:44px; حدود:خط_مستقيم 1px #FFF; سؤال_النقر:مؤشر_النقر;}
#ems img:hover,#ems img:active{لون_الحدود:#A4B7E3;}
#ems a{لون:#069; دايره_الانحناء:2px; عرض_في_خط:مدمج; مسافة_الجوانب:2px 5px; مسافة_الاطوال:1px 8px; تعديل_النص:لا_يوجد; لون_الخلفية:#D5DFFD;}
#ems a:hover,#ems a:active,#ems a.ck{color:#FFF; background-color:#069;}
.tc{text-align:center; margin-top:5px;}
</style>
</head>
<body>
<div id="ltian">
 <div id="us" class="jb"></div>
 <div id="ct"></div>
  <a href="javascript:;" class="qp" onClick="this.parentNode.children[1].innerHTML=''">حذف الشاشة</a>
</div>
<div class="rin">
  <button id="sd">إرسال</button>
  <span><img src="http://www.yxsss.com/ui/sk/t.png" title="[#1#]" id="imgbq"><img src="http://www.yxsss.com/ui/sk/e.png" title="[#2#]"><form><input type="file" title="[#2#]" id="upimg"></form></span>
  <p><input id="nrong"></p>
</div>
<div id="ems"><p></p><p class="tc"></p></div>
<script>
if(typeof(WebSocket)=='undefined') {
 alert('متصفحك لا يدعم WebSocket، يُنصح باستخدام Google Chrome أو Mozilla Firefox'); 
}
</script>
<script src="http://www.yxsss.com/ui/p/a.js" type="text/javascript"></script>
<script>
(function() {
 var key='all',mkey;
 var users={};
 var url='ws://127.0.0.1:8000';
 var so=false,n=false;
 إذا (var lus=A.$('us'),lct=A.$('ct')) {
 function st(){
 n=prompt('رجاءً أختر اسمًا صاخبًا لنفسك:');
 n=n.substr(0,16);
 إذا (!n) {
  return ; 
 }
 so=new WebSocket(url);
 so.onopen=function(){
  إذا (so.readyState==1) {
    alert('888');
  so.send('type=add&ming='+n);
  }
 }
 so.onclose=function(){
  so=false;
  lct.appendChild(A.$$('<p class="c2">إخراج من غرفة الدردشة</p>'));
 }
 so.onmessage=function(msg){
  eval('var da='+msg.data);
  إذا (var obj=false,c=false);
  إذا (da.type=='add') {
  إذا (obj=A.$$('<p>'+da.name+'</p>'));
  lus.appendChild(obj);
  cuser(obj,da.code);
  obj=A.$$('<p><span>['+da.time+']</span>مرحبًا <a>'+da.name+'</a> بالإنضمام</p>');
  c=da.code;
  } آخره إذا (da.type=='madd') {
  mkey=da.code;
  da.users.unshift({'code':'all','name':'الجميع'});
  لـ (var i=0; i<da.users.length; i++) {
   إذا (obj=A.$$('<p>'+da.users[i].name+'</p>'));
   lus.appendChild(obj);
   إذا (mkey!=da.users[i].code) {
   cuser(obj,da.users[i].code);
   }
   obj.className='my';
   document.title=da.users[i].name;
   }
  }
  obj=A.$$('<p><span>['+da.time+']</span>مرحبًا '+da.name+' بالإنضمام</p>');
  users.all.className='ck';
  }
  إذا (obj==false) {
  إذا (da.type=='rmove') {
   var obj=A.$$('<p class="c2"><span>['+da.time+']</span>'+users[da.nrong].innerHTML+'退出聊天室</p>');
   lct.appendChild(obj);
   users[da.nrong].del();
   delete users[da.nrong];
  }
   da.nrong=da.nrong.replace(/{\(\d+)}/g,function(a,b){
   return '<img src="sk/'+b+'.gif">';
   }).replace(/^data:image/png;base64,.{50,}$/i,function(a){
   return '<img src="'+a+'">';
   });
   //da.code 发信息人的code
   if(da.code1==mkey){
   obj=A.$$('<p class="c3"><span>['+da.time+']</span><a>'+users[da.code].innerHTML+'</a>对我说:'+da.nrong+'</p>');
   c=da.code;
   else if(da.code==mkey){
   if(da.code1!='all')
   obj=A.$$('<p class="c3"><span>['+da.time+']</span>我对<a>'+users[da.code1].innerHTML+'</a>说:'+da.nrong+'</p>');
   else
   obj=A.$$('<p><span>['+da.time+']</span>我对<a>'+users[da.code1].innerHTML+'</a>说:'+da.nrong+'</p>');
   c=da.code1;
   else if(da.code==false){
   obj=A.$$('<p><span>['+da.time+']</span>'+da.nrong+'</p>');
   else if(da.code1){
   obj=A.$$('<p><span>['+da.time+']</span><a>'+users[da.code].innerHTML+'</a>对我说'+users[da.code1].innerHTML+':'+da.nrong+'</p>');
   c=da.code;
   }
  }
  }
  if(c){
   obj.children[1].onclick=function(){
   users[c].onclick();
   }
  }
  lct.appendChild(obj);
  lct.scrollTop=Math.max(0,lct.scrollHeight-lct.offsetHeight);
 }
 }
 A.$('sd').onclick=function(){
 إذا (!so) {
  return st();
 }
 var da=A.$('nrong').value.trim();
 if(da==''){
  alert('المحتوى لا يمكن أن يكون فارغًا');
  عدم التحقق; 
 }
 A.$('nrong').value='';
 so.send('nr='+esc(da)+'&key='+key);
 }
 A.$('nrong').onkeydown=function(e){
 ف.الحدث = f.الحدث || event;
 if(e.keyCode==13){
  A.$('sd').onclick();
 }
 }
 function esc(da){
 da=da.replace(/</g,'<').replace(/>/g,'>').replace(/\"/g,'"');
 return encodeURIComponent(da);
 }
 function cuser(t,code){
 users[code]=t;
 t.onclick=function(){
  t.parentNode.children.rcss('ck','');
  t.rcss('','ck');
  key=code;
 }
 }
 A.$('ltian').style.height = (document.documentElement.clientHeight - 70) + 'px';
 st();
 var bq=A.$('imgbq'),ems=A.$('ems');
 var l=80,r=4,c=5,s=0,p=Math.ceil(l/(r*c));
 var pt='sk/';
 bq.onclick=function(e){
 ف.الحدث = f.الحدث || event;
 إذا (!so) {
  return st();
 }
 ems.style.display='block';
 document.onclick=function(){
  gb(); 
 }
 ct();
 try { e.stopPropagation(); } catch (o) { }
 }
 for(var i=0;i<p;i++){
 var a=A.$$('<a href="javascript:;">'+(i+1)+'</a>');
 ems.children[1].appendChild(a);
 ef(a,i);
 }
 ems.children[1].children[0].className='ck';
 فونction ct() {
 ف.الوضع = bq.weiz();
 مع (ems.style) {
  الجزء العلوي = wz.y - 242 + 'px';
  اليسار = wz.x + bq.offsetWidth - 235 + 'px';
 }
 }
 فونction ef(t, i) {
 t.onclick = function(e) {
  ف.الحدث = f.الحدث || event;
  s = i * r * c;
  ems.children[0].innerHTML = '';
  hh();
  هذا.parentNode.children.rcss('ck', '');
  هذا.rcss('', 'ck');
  try { e.stopPropagation(); } catch (o) { }
 }
 }
 فونction hh() {
 ف.العدد = Math.min(l, s + r * c);
 ل.ل (i = s؛ i < z؛ i++) {
  ف.الصورة = A.$$('<img src="' + pt + i + '.gif">');
  hh1(a, i);
  ems.children[0].appendChild(a);
 }
 ct();
 }
 فونction hh1(t, i) {
 t.onclick = function(e) {
  ف.الحدث = f.الحدث || event;
  A.$('nrong').value += '{\\' + i + '}';
  إذا (!e.ctrlKey) {
  gb();
  }
  try { e.stopPropagation(); } catch (o) { }
 }
 }
 فونction gb() {
 ems.style.display = '';
 A.$('nrong').focus();
 document.onclick = '';
 }
 hh();
 A.on(window, 'resize', function() {
 A.$('ltian').style.height = (document.documentElement.clientHeight - 70) + 'px';
 ct();
 }); 
 ف.الصورة_الرفع = A.$('upimg');
 ف.الصورة = new Image();
 ف.العرض = 400، ف.الارتفاع = 300;
 A.on(fimg, 'change', function(ev) {
 إذا (!so) {
  st();
  عدم التحقق;
 }
 إذا (مفتاح == 'كل') {
  إشعار ('بسبب القيود في الموارد يمكن نشر الصور فقط في الرسائل الخاصة');
  عدم التحقق; 
 }
 ف.النوع = ev.target.files[0];
 إذا (ف.النوع.ismatch('صورة.*')) {
  var r = new FileReader();
  r.onload = function(e){
  img.setAttribute('src',e.target.result);
   };
  r.readAsDataURL(f);
 }
 });
 img.onload=function(){
 ih=img.height,iw=img.width;
 if(iw/ih > dw/dh && iw > dw){
  ih=ih/iw*dw;
  iw=dw;
 }else if(ih > dh){
  iw=iw/ih*dh;
  ih=dh;
 }
 var rc = A.$$('canvas');
 var ct = rc.getContext('2d');
 rc.width=iw;
 rc.height=ih;
 ct.drawImage(img,0,0,iw,ih);
 var da=rc.toDataURL();
 so.send('nr='+esc(da)+'&key='+key);
 }
})();
</script>
</body>
</html>

هذا هو نهاية محتويات هذا المقال، نأمل أن تكون قد ساعدتكم في التعلم، ونأمل أن تشجعوا دليل النقاهة على الاستمرار.

بيان: محتويات هذا المقال مستمدة من الإنترنت، حقوق الطبع محفوظة للمالك الأصلي، المحتوى تم تقديمه من قبل مستخدمي الإنترنت، هذا الموقع لا يمتلك حقوق الملكية، لم يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية. إذا كنت قد وجدت محتوى يشتبه في حقوق الطبع، فالرجاء إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (الرجاء استبدال # بـ @ عند إرسال البريد الإلكتروني) للإبلاغ، وقدم الدليل على الأدلة، إذا تم التحقق من ذلك، فإن هذا الموقع سيزيل المحتوى المشتبه في حقوق الطبع على الفور.

أعجبك ذلك