老雷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擴展實現聊天服務相关推荐

  1. 老雷socket编程之PHP利用socket扩展实现聊天服务

    老雷socket编程之PHP利用socket扩展实现聊天服务 socket聊天服务原理 PHP有两个socket的扩展 sockets和streams sockets socket_create(AF ...

  2. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day01.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day01.txt 1.sql.DB.DBMS分别是什么,他们之间的关系? 2.什么是表? 3.学习MySQL主要还是学习通用的SQL语句,那么SQ ...

  3. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day03.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day03.txt 1.约束 1.1.唯一性约束(unique) 1.2.主键约束 1.3.外键约束 2.存储引擎?(整个内容属于了解内容) 2.1 ...

  4. (B站动力节点老杜MySQL教程)MySQL课堂笔记-day02.txt

    文章目录 文件来源/资料下载: MySQL课堂笔记-day02.txt 1.关于查询结果集的去重? 2.连接查询 2.1.什么是连接查询? 2.2.连接查询的分类? 2.3.在表的连接查询方面有一种现 ...

  5. 云雷服务器崩溃,“云雷崩”再现,张云雷登杂志封面,服务器被粉丝挤爆

    原标题:"云雷崩"再现,张云雷登杂志封面,服务器被粉丝挤爆 一首<探清水河>被广泛传唱,让更多人知道了张云雷."辫儿哥哥"成为他的代名词,很快凭借出 ...

  6. 狗蛋(驱动小白)和老王(硬件老司机)关于硬件那点事儿的一次密谈

    引子 "老王,有个bug啊,很紧急啊?" QA急忙反馈到. "什么问题? 老王心里咯噔了下,心想,NND,被QA缠住,看来今晚又得和我的躺椅相依为伴了." &q ...

  7. 数组里面都是人的名字,分割成:例如:老杨|老苏|老邹…”(老杨,老苏,老邹,老虎,老牛,老蒋,老王,老马)

    //数组里面都是人的名字,分割成:例如:老杨|老苏|老邹-"(老杨,老苏,老邹,老虎,老牛,老蒋,老王,老马) string[] names = {"老杨"," ...

  8. 原来PID是在老王头和老斯基的斗争中诞生的

    获取更多好文章: 原来PID是在老王头和老司机的斗争中诞生的 30年前,老王头在国内某十八线小县城的水泥厂做锅炉工.由于水泥厂的环境比较差,工人们工作完都是满身的水泥灰尘,回家前都要在厂子里洗个澡.老 ...

  9. Scala開發教程(1): 開始神奇的Scala編程之旅

    前面寫了四篇Scala Play Framework開發教程,起了個頭,個人覺得Scala應用會越來越廣泛,因此開通了Scala中文社區論壇以達到推廣Scala開發的目的.該論壇設立了Scala編程( ...

最新文章

  1. linux内核 cpu_die,解密“内核”,和“cpu”又有啥关系?
  2. ios与html数据交互,iOS iOS与html进行交互
  3. 在家也能做化学实验!VR教育机构MEL Science获250万美元融资
  4. windows下配置odbc时userid填什么_BurpSuite + Xray 被动扫描配置
  5. python requests_小白学 Python 爬虫(18):Requests 进阶操作
  6. 【转】 不适用Sqrt函数开方,精度小于指定精度
  7. 原理_JS引擎对未声明变量的处理
  8. 单独获取ShopEx商品类型中的扩展参数,如配货时间
  9. django报错500排查方法
  10. mysql连库串_数据库连接串整理 - osc_ac5z111b的个人空间 - OSCHINA - 中文开源技术交流社区...
  11. 金属磁记忆传感器封装
  12. 关于HotSpot VM以及Java语言的动态编译 你可能想知道这些
  13. 用随机梯度下降来优化人生
  14. Jmeter吞吐量控制器详解
  15. C++ ofstream/ifstream读写文件demo
  16. DMSP/OLS夜间灯光数据
  17. 【Matlab系列】Matlab语言基础知识汇总
  18. 撬动百亿台设备,让物联网“造”起来!
  19. 基于C++编译的车牌识别系统
  20. win10系统蓝牙服务器,如何打开win10系统的蓝牙并进行设备添加

热门文章

  1. AC自动机 从入门到模板
  2. Sylvia Massy使用Warm Audio电子管话筒录制大乐队
  3. 超值干货 | 建议收藏:精美详尽的 HTTPS 原理图注意查收!
  4. 软考(3)-知识产权与标准化
  5. 数据规模超大,分布密集,数据存储难
  6. 第一节:服务注册与服务发现
  7. [日常] SinaMail项目和技术能力总结
  8. C++多线程同时读同一文件
  9. 二维特征分类的基础_纹理特征1:灰度共生矩阵(GLCM)
  10. 哪款蓝牙耳机音质好?2020国产高性价比高音质蓝牙耳机分享