首页 / PHP / phpWEBSOCKET问题
phpWEBSOCKET问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了phpWEBSOCKET问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含9593字,纯文字阅读大概需要14分钟。
内容图文
![phpWEBSOCKET问题](/upload/InfoBanner/zyjiaocheng/200/6291fc0950f040928a59ef216823a6c1.jpg)
master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed"); socket_set_option($this->master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed"); socket_bind($this->master, $address, $port) or die("socket_bind() failed"); socket_listen($this->master,20) or die("socket_listen() failed"); $this->sockets[] = $this->master; $this->say("Server Started : ".date('Y-m-d H:i:s')); $this->say("Listening on : ".$address." port ".$port); $this->say("Master socket : ".$this->master."/n"); while(true){ $changed = $this->sockets; socket_select($changed,$write=NULL,$except=NULL,NULL); foreach($changed as $socket){ if($socket==$this->master){ $client=socket_accept($this->master); if($client<0){ $this->log("socket_accept() failed"); continue; } else{ $this->connect($client); } } else{ $bytes = @socket_recv($socket,$buffer,2048,0); if($bytes==0){ $this->disconnect($socket); } else{ $user = $this->getuserbysocket($socket); if(!$user->handshake){ $this->dohandshake($user,$buffer); } else{ $this->process($user,$this->unwrap($buffer)); } } } } } } function process($user,$msg){ /* Extend and modify this method to suit your needs */ /* Basic usage is to echo incoming messages back to client */ $this->send($user->socket,$msg); } function send($client,$msg){ $this->say("> ".$msg); $msg = $this->wrap($msg); socket_write($client,$msg,strlen($msg)); $this->say("! ".strlen($msg)); } function connect($socket){ $user = new User(); $user->id = uniqid(); $user->socket = $socket; array_push($this->users,$user); array_push($this->sockets,$socket); $this->log($socket." CONNECTED!"); $this->log(date("d/n/Y ")."at ".date("H:i:s T")); } function disconnect($socket){ $found=null; $n=count($this->users); for($i=0;$i<$n;$i++){ if($this->users[$i]->socket==$socket){ $found=$i; break; } } if(!is_null($found)){ array_splice($this->users,$found,1); } $index=array_search($socket,$this->sockets); socket_close($socket); $this->log($socket." DISCONNECTED!"); if($index>=0){ array_splice($this->sockets,$index,1); } } function dohandshake($user,$buffer){ $this->log("/nRequesting handshake..."); $this->log($buffer); list($resource,$host,$origin,$key1,$key2,$l8b) = $this->getheaders($buffer); $this->log("Handshaking..."); //$port = explode(":",$host); //$port = $port[1]; //$this->log($origin."/r/n".$host); $upgrade = "HTTP/1.1 101 WebSocket Protocol Handshake/r/n" . "Upgrade: WebSocket/r/n" . "Connection: Upgrade/r/n" . //"WebSocket-Origin: " . $origin . "/r/n" . //"WebSocket-Location: ws://" . $host . $resource . "/r/n" . "Sec-WebSocket-Origin: " . $origin . "/r/n" . "Sec-WebSocket-Location: ws://" . $host . $resource . "/r/n" . //"Sec-WebSocket-Protocol: icbmgame/r/n" . //Client doesn't send this "/r/n" . $this->calcKey($key1,$key2,$l8b) . "/r/n";// . //"/r/n"; socket_write($user->socket,$upgrade.chr(0),strlen($upgrade.chr(0))); $user->handshake=true; $this->log($upgrade); $this->log("Done handshaking..."); return true; } function calcKey($key1,$key2,$l8b){ //Get the numbers preg_match_all('/([/d]+)/', $key1, $key1_num); preg_match_all('/([/d]+)/', $key2, $key2_num); //Number crunching [/bad pun] $this->log("Key1: " . $key1_num = implode($key1_num[0]) ); $this->log("Key2: " . $key2_num = implode($key2_num[0]) ); //Count spaces preg_match_all('/([ ]+)/', $key1, $key1_spc); preg_match_all('/([ ]+)/', $key2, $key2_spc); //How many spaces did it find? $this->log("Key1 Spaces: " . $key1_spc = strlen(implode($key1_spc[0])) ); $this->log("Key2 Spaces: " . $key2_spc = strlen(implode($key2_spc[0])) ); if($key1_spc==0|$key2_spc==0){ $this->log("Invalid key");return; } //Some math $key1_sec = pack("N",$key1_num / $key1_spc); //Get the 32bit secret key, minus the other thing $key2_sec = pack("N",$key2_num / $key2_spc); //This needs checking, I'm not completely sure it should be a binary string return md5($key1_sec.$key2_sec.$l8b,1); //The result, I think } function getheaders($req){ $r=$h=$o=null; if(preg_match("/GET (.*) HTTP/" ,$req,$match)){ $r=$match[1]; } if(preg_match("/Host: (.*)/r/n/" ,$req,$match)){ $h=$match[1]; } if(preg_match("/Origin: (.*)/r/n/" ,$req,$match)){ $o=$match[1]; } if(preg_match("/Sec-WebSocket-Key1: (.*)/r/n/",$req,$match)){ $this->log("Sec Key1: ".$sk1=$match[1]); } if(preg_match("/Sec-WebSocket-Key2: (.*)/r/n/",$req,$match)){ $this->log("Sec Key2: ".$sk2=$match[1]); } if($match=substr($req,-8)) { $this->log("Last 8 bytes: ".$l8b=$match); } return array($r,$h,$o,$sk1,$sk2,$l8b); } function getuserbysocket($socket){ $found=null; foreach($this->users as $user){ if($user->socket==$socket){ $found=$user; break; } } return $found; } function say($msg=""){ echo $msg."/n"; } function log($msg=""){ if($this->debug){ echo $msg."/n"; } } function wrap($msg=""){ return chr(0).$msg.chr(255); } function unwrap($msg=""){ return substr($msg,1,strlen($msg)-2); } } class User{ var $id; var $socket; var $handshake; } ?>
php -q chatbot.demo.php include "ewq.php"; // Extended basic WebSocket as ChatBot class ChatBot extends WebSocket{ function process($user,$msg){ if (isset($user->first)) { $this->send($user->socket,''); $user->first = true; } $this->say("< ".$msg); switch($msg){ case "hello" : $this->send($user->socket,"hello human"); break; case "hi" : $this->send($user->socket,"zup human"); break; case "name" : $this->send($user->socket,"my name is Multivac, silly I know"); break; case "age" : $this->send($user->socket,"I am older than time itself"); break; case "date" : $this->send($user->socket,"today is ".date("Y.m.d")); break; case "time" : $this->send($user->socket,"server time is ".date("H:i:s")); break; case "thanks": $this->send($user->socket,"you're welcome"); break; case "bye" : $this->send($user->socket,"bye"); break; //default : $this->send($user->socket,$msg." not understood"); break; default : $this->sendAll($user, $msg); break; } } function sendAll($currentUser, $msg){ $usersList = $this->users; foreach ($usersList as $user){ if ($user !== $currentUser) // 自己发送的消息就不再接收一次了 $this->send($user->socket, $msg); } } } $master = new ChatBot("127.0.0.1",10035); ?>
为什么我 终端PHP ss.php 会报错
Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /Applications/XAMPP/xamppfiles/htdocs/socket/ewq.php on line 18
Server Started : 2014-07-17 05:18:18/nListening on : 127.0.0.1 port 10035/nMaster socket : Resource id #5/n/n
回复讨论(解决方案)
这是由于调用date时,若timezone设置不正确所产生的E_NOTICE|E_WARNING错误
有以下几种方案可解决该问题:
使用date_default_timezone_set()设置 date_default_timezone_set('PRC');
ini_set('date.timezone','Asia/Shanghai');
修改错误级别配置(不推荐)
修改php.ini,显式设置date.timezone=PRC
没有设置时区,设一下就好了
在代码的开始部分加上时区设置:
date_default_timezone_set('PRC'); //设置中国时区
date_default_timezone_set("Asia/Hong_Kong");
Strict Standards: Only variables should be passed by reference in /Applications/XAMPP/xamppfiles/htdocs/socket/websocket.class.php on line 22
Strict Standards: Only variables should be passed by reference in /Applications/XAMPP/xamppfiles/htdocs/socket/websocket.class.php on line 22
现在又报这个错
内容总结
以上是互联网集市为您收集整理的phpWEBSOCKET问题全部内容,希望文章能够帮你解决phpWEBSOCKET问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。