老雷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测试工具

<?phpclass 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){ //判断是不是新接入的socketif(($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();

  

转载于:https://www.cnblogs.com/lrjxgl/p/11123923.html

老雷socket编程之PHP利用socket扩展实现聊天服务相关推荐

  1. 老雷PHP教程,老雷socket編程之PHP利用socket擴展實現聊天服務

    老雷socket編程之PHP利用socket擴展實現聊天服務 socket聊天服務原理 PHP有兩個socket的擴展 sockets和streams sockets socket_create(AF ...

  2. [深入浅出WP8.1(Runtime)]Socket编程之UDP协议

    13.3 Socket编程之UDP协议 UDP协议和TCP协议都是Socket编程的协议,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议.UDP适用于一次只 ...

  3. 基于Linux的Socket编程之TCP全双工Server-Client聊天程序

    转载:http://blog.csdn.net/apollon_krj/article/details/53437764#0-tsina-1-58570-397232819ff9a47a7b7e80a ...

  4. Linux下socket编程之UDP简单实现

    本文实现一个简单的UDP小例子,来说明Linux下socket编程之UDP的简单实现.本文主要包括三个部分:服务器端的实现,客服端的实现和通信测试.实现的功能:客服端发送一条消息给服务器端,服务器端把 ...

  5. Linux下Socket编程之TCP应用

    现在,我们用前面所构建的socket类,重新设计<Linux下Socket编程之TCP Server端>中echo的服务器,然后设计客户端程序. echo服务器的工作原理很简单: 1.接收 ...

  6. socket编程之 accept函数的理解

    在进入我们的正题之前,再来复习一波编写服务器的函数流程吧 服务器端:socket()-->bind( )-->listen()-->accept()-->read()/writ ...

  7. socket编程之二:两种链接类型tcp和udp

    前面一篇文章说到了一些计算机网络的基础知识.引入了socket.从这节開始,就进入正题了. 一 概述 TCP:Transimission Control Protocol传输控制协议. UPD:Use ...

  8. Linux下Socket编程之TCP Server端

    一.建模 绝大部分关于socket编程的教程总是从socket的概念开始讲起的.要知道,socket的初衷是个庞大的体系,TCP/IP只是这个庞大体系下一个很小的子集,而我们真正能用上的更是这个子集中 ...

  9. Linux下Socket编程之TCP原理

    一.Socket异常信息 之所以把对异常信息的介绍放到原理之前讲,是因为由于socket本身的复杂性,导致了产生各种异常的复杂性.我们应该时刻铭记的是,sokcet本身属于系统(OS),是系统对TCP ...

最新文章

  1. Java关键字系列(public,protected,private)
  2. 2021-04-28 Python可视化图表生成-Matplotlib绘图
  3. 原来Python函数只是个对象
  4. 2021-11-18哈希值
  5. python sanic openapi_2020年了,python的web framework sanic 可以考虑生产环境部署了么?...
  6. 使用python简单连接并操作数据库
  7. P4630-[APIO2018]Duathlon铁人两项【圆方树】
  8. 解决QT5中文显示出现乱码
  9. diy配置程序php,poscmsDiy字段之文件类型设计指南
  10. shell读取mysql_shell读取mysql数据库
  11. 解决Spring Boot 拦截器注入service为空的问题
  12. nginx 新上线、机房白名单
  13. istio使用教程和示例(导流,请求路由,访问拒绝,黑白名单,限速)
  14. Eclipse如何打出war包
  15. 黑群晖的网络录像机启用并直通互联网的几个关键点
  16. mapgis 6.7视频教程
  17. 汉字常用字unicode码表
  18. 使用PHP控制MODBUS-RTU设备
  19. copyproperties爆红_一屋模玩怎样不能价值300万?分分钟用超.......
  20. 山东大学软件学院众智科学与网络化产业(网络、群体与市场)复习笔记

热门文章

  1. 初识费用流 模板(spfa+slf优化) 餐巾计划问题
  2. js学习-DOM之动态创建元素的三种方式、插入元素、onkeydown与onkeyup两个事件整理...
  3. 【BZOJ】1070: [SCOI2007]修车
  4. Socket通信总结(附C++实现)
  5. 暗通道优先的图像去雾算法(下)
  6. 被七牛云OSS对象存储测试域名回收后正确数据迁移姿势!
  7. Confluence 6 如何保持我空间的整洁
  8. Django介绍工程搭建
  9. spring boot分环境导出自定义xml配置
  10. Linux之samba服务器的搭建及详解