老雷PHP教程,老雷socket編程之PHP利用socket擴展實現聊天服務
老雷socket編程之PHP利用socket擴展實現聊天服務
socket聊天服務原理
PHP有兩個socket的擴展 sockets和streams
sockets
socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
socket_write
socket_read
socket_close
客戶端
socket_connect($socket, $address, $service_port);
服務端
socket_bind($sock, $address, $port)
socket_listen($sock)
socket_accept
Streams
客戶端
stream_socket_client
fwrite
fread
fclose($fp);
服務端
stream_socket_server
stream_set_blocking
stream_select
stream_socket_accept conn
stream_socket_recvfrom
stream_socket_sendto
stream_socket_shutdown
課后練習
使用sockets和streams擴展實現客戶端跟服務端的功能。
服務端代碼 客服端可使用udp&tcp測試工具
class SocketService
{
public $host="tcp://0.0.0.0:8000";
private $address;
private $port;
private $_sockets;
public $clients;
public $maxid=1000;
public function __construct($address = '', $port='')
{
if(!empty($address)){
$this->address = $address;
}
if(!empty($port)) {
$this->port = $port;
}
}
public function onConnect($client_id){
echo "Client client_id:{$client_id} \n";
}
public function onMessage($client_id,$msg){
//發給所有的
foreach($this->clients as $kk=>$cc){
if($kk>0){
$this->send($cc, $msg);
}
}
}
public function onClose($client_id){
echo "$client_id close \n";
}
public function service(){
//獲取tcp協議號碼。
$tcp = getprotobyname("tcp");
$sock = stream_socket_server($this->host, $errno, $errstr);;
if(!$sock)
{
throw new Exception("failed to create socket: ".socket_strerror($sock)."\n");
}
stream_set_blocking($sock,0);
$this->_sockets = $sock;
echo "listen on $this->address $this->host ... \n";
}
public function run(){
$this->service();
$this->clients[] = $this->_sockets;
while (true){
$changes = $this->clients;
//$write = NULL;
//$except = NULL;
stream_select($changes, $write, $except, NULL);
foreach ($changes as $key => $_sock){
if($this->_sockets == $_sock){ //判斷是不是新接入的socket
if(($newClient = stream_socket_accept($_sock)) === false){
unset($this->clients[$key]);
continue;
}
$line = trim(stream_socket_recvfrom($newClient, 1024));
$this->maxid++;
$this->clients[$this->maxid] = $newClient;
$this->onConnect($this->maxid);
} else {
$msg=@stream_socket_recvfrom($_sock, 2048);
if(!$msg){
stream_socket_shutdown($this->clients[$key],STREAM_SHUT_RDWR);
unset($this->clients[$key]);
$this->onClose($key);
}else{
$msg=$this->decode($msg);
$this->onMessage($key,$msg);
}
}
}
}
}
/**
* 發送數據
* @param $newClinet 新接入的socket
* @param $msg 要發送的數據
* @return int|string
*/
public function send($newClinet, $msg){
$msg=$this->encode($msg);
if($msg){
stream_socket_sendto($newClinet, $msg);
}
}
public function encode($msg){
return $msg . "\n";
}
public function decode($msg){
return rtrim($msg, "\r\n");
}
/**
* 關閉socket
*/
public function close(){
return socket_close($this->_sockets);
}
}
$sock = new SocketService('127.0.0.1','9000');
$sock->run();
老雷PHP教程,老雷socket編程之PHP利用socket擴展實現聊天服務相关推荐
- 老雷socket编程之PHP利用socket扩展实现聊天服务
老雷socket编程之PHP利用socket扩展实现聊天服务 socket聊天服务原理 PHP有两个socket的扩展 sockets和streams sockets socket_create(AF ...
- (B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt
文章目录 文件来源/资料下载: MySQL课堂笔记-day01.txt 1.sql.DB.DBMS分别是什么,他们之间的关系? 2.什么是表? 3.学习MySQL主要还是学习通用的SQL语句,那么SQ ...
- (B站动力节点老杜MySQL教程)MySQL课堂笔记-day03.txt
文章目录 文件来源/资料下载: MySQL课堂笔记-day03.txt 1.约束 1.1.唯一性约束(unique) 1.2.主键约束 1.3.外键约束 2.存储引擎?(整个内容属于了解内容) 2.1 ...
- (B站动力节点老杜MySQL教程)MySQL课堂笔记-day02.txt
文章目录 文件来源/资料下载: MySQL课堂笔记-day02.txt 1.关于查询结果集的去重? 2.连接查询 2.1.什么是连接查询? 2.2.连接查询的分类? 2.3.在表的连接查询方面有一种现 ...
- 云雷服务器崩溃,“云雷崩”再现,张云雷登杂志封面,服务器被粉丝挤爆
原标题:"云雷崩"再现,张云雷登杂志封面,服务器被粉丝挤爆 一首<探清水河>被广泛传唱,让更多人知道了张云雷."辫儿哥哥"成为他的代名词,很快凭借出 ...
- 狗蛋(驱动小白)和老王(硬件老司机)关于硬件那点事儿的一次密谈
引子 "老王,有个bug啊,很紧急啊?" QA急忙反馈到. "什么问题? 老王心里咯噔了下,心想,NND,被QA缠住,看来今晚又得和我的躺椅相依为伴了." &q ...
- 数组里面都是人的名字,分割成:例如:老杨|老苏|老邹…”(老杨,老苏,老邹,老虎,老牛,老蒋,老王,老马)
//数组里面都是人的名字,分割成:例如:老杨|老苏|老邹-"(老杨,老苏,老邹,老虎,老牛,老蒋,老王,老马) string[] names = {"老杨"," ...
- 原来PID是在老王头和老斯基的斗争中诞生的
获取更多好文章: 原来PID是在老王头和老司机的斗争中诞生的 30年前,老王头在国内某十八线小县城的水泥厂做锅炉工.由于水泥厂的环境比较差,工人们工作完都是满身的水泥灰尘,回家前都要在厂子里洗个澡.老 ...
- Scala開發教程(1): 開始神奇的Scala編程之旅
前面寫了四篇Scala Play Framework開發教程,起了個頭,個人覺得Scala應用會越來越廣泛,因此開通了Scala中文社區論壇以達到推廣Scala開發的目的.該論壇設立了Scala編程( ...
最新文章
- linux内核 cpu_die,解密“内核”,和“cpu”又有啥关系?
- ios与html数据交互,iOS iOS与html进行交互
- 在家也能做化学实验!VR教育机构MEL Science获250万美元融资
- windows下配置odbc时userid填什么_BurpSuite + Xray 被动扫描配置
- python requests_小白学 Python 爬虫(18):Requests 进阶操作
- 【转】 不适用Sqrt函数开方,精度小于指定精度
- 原理_JS引擎对未声明变量的处理
- 单独获取ShopEx商品类型中的扩展参数,如配货时间
- django报错500排查方法
- mysql连库串_数据库连接串整理 - osc_ac5z111b的个人空间 - OSCHINA - 中文开源技术交流社区...
- 金属磁记忆传感器封装
- 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些
- 用随机梯度下降来优化人生
- Jmeter吞吐量控制器详解
- C++ ofstream/ifstream读写文件demo
- DMSP/OLS夜间灯光数据
- 【Matlab系列】Matlab语言基础知识汇总
- 撬动百亿台设备,让物联网“造”起来!
- 基于C++编译的车牌识别系统
- win10系统蓝牙服务器,如何打开win10系统的蓝牙并进行设备添加