php socket客户端及服务器端应用实例


Posted in PHP onJuly 04, 2014

经常有朋友会对php的socket应用充满疑惑,本文就以实例代码作一讲解,希望能对初学php的朋友起到一点帮助作用

具体代码如下:

1.服务器端代码:

<?php
class SocketServer{
  private $_port='9000';
  private $_address='127.0.0.1';
  private $_client_socket_list=array();
  public function __set($name,$val){
    $this--->$name=$val;
  }
  private function _showError($error){
    exit($error);
  }
  /**
   * 开始进行socket服务器端监听端口
   */
  public function start(){
    // 创建端口
    if (($sock = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP )) === false) {
      $this->_showError("socket_create() failed :reason:" . socket_strerror ( socket_last_error () ));
    }
    // 绑定
    if (socket_bind ( $sock, $this->_address, $this->_port ) === false) {
      $this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ));
    }
    // 监听
    if (socket_listen ( $sock, 5 ) === false) {
      $this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ) );
    }
    do {
      //当有一个客户端连接的时候
      if ($client_socket=socket_accept ( $sock )) {
        $count = count ( $this->_client_socket_list ) + 1;
        //把新来的用户加入 客户端数组里
        $this->_client_socket_list[]=$client_socket;
        echo "new connection:\r\n";//服务器端输出当前正在连接的客户端数量
        echo "current connection:{$count}\r\n";
        //接受客户端传过来的字符串
        $msg=$this->read($client_socket);
        echo "client:{$msg}\r\n";
        //服务器向客户端传值
        $my_msg="I am fine,think you\r\n";
        $this->send($client_socket,$my_msg);
      }
      /**
       * 这段代码给你参考,用来判断是否有客户端主动失去连接
      else{
        foreach ( $this->_client_socket_list as $socket ) {
          $len = socket_recv ($socket, $buffer, 2048, 0 ); // 接受一下客户端信息,如果为0代表断开连接
          if ($len < 7) {
            //这里写是去连接的客户端业务
          }
        }
      }
       */
    }while(true);  
  }
  /**
   * 发送数据给客户端
   */
  public function send($client_socket,$str){ 
    return socket_write ( $client_socket,$str, strlen ( $str ) );
  }
  /**
   * 从客户端接受数据
   */
  public function read($client_socket){
    return socket_read ( $client_socket, 8192 );//8192实际代表的接受长度,我用819292表示长一点,这样长一点的字符串也可以接受到,不到8192也没关系,会自动识别
  }
}
$socket_server =new SocketServer();
$socket_server->start();//开始监听

2.客户端代码:

<?php
class SocketServer{
  private $_port='9000';
  private $_address='127.0.0.1';
  private $_client_socket_list=array();
  public function __set($name,$val){
    $this--->$name=$val;
  }
  private function _showError($error){
    exit($error);
  }
  /**
   * 开始进行socket服务器端监听端口
   */
  public function start(){
    // 创建端口
    if (($sock = socket_create ( AF_INET, SOCK_STREAM, SOL_TCP )) === false) {
      $this->_showError("socket_create() failed :reason:" . socket_strerror ( socket_last_error () ));
    }
    // 绑定
    if (socket_bind ( $sock, $this->_address, $this->_port ) === false) {
      $this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ));
    }
    // 监听
    if (socket_listen ( $sock, 5 ) === false) {
      $this->_showError("socket_bind() failed :reason:" . socket_strerror ( socket_last_error ( $sock ) ) );
    }
    do {
      //当有一个客户端连接的时候
      if ($client_socket=socket_accept ( $sock )) {
        $count = count ( $this->_client_socket_list ) + 1;
        //把新来的用户加入 客户端数组里
        $this->_client_socket_list[]=$client_socket;
        echo "new connection:\r\n";//服务器端输出当前正在连接的客户端数量
        echo "current connection:{$count}\r\n";
        //接受客户端传过来的字符串
        $msg=$this->read($client_socket);
        echo "client:{$msg}\r\n";
        //服务器向客户端传值
        $my_msg="I am fine,think you\r\n";
        $this->send($client_socket,$my_msg);
      }
      /**
       * 这段代码给你参考,用来判断是否有客户端主动失去连接
      else{
        foreach ( $this->_client_socket_list as $socket ) {
          $len = socket_recv ($socket, $buffer, 2048, 0 ); // 接受一下客户端信息,如果为0代表断开连接
          if ($len < 7) {
            //这里写是去连接的客户端业务
          }
        }
      }
       */
    }while(true);  
  }
  /**
   * 发送数据给客户端
   */
  public function send($client_socket,$str){ 
    return socket_write ( $client_socket,$str, strlen ( $str ) );
  }
  /**
   * 从客户端接受数据
   */
  public function read($client_socket){
    return socket_read ( $client_socket, 8192 );//8192实际代表的接受长度,我用819292表示长一点,这样长一点的字符串也可以接受到,不到8192也没关系,会自动识别
  }
}
$socket_server =new SocketServer();
$socket_server->start();//开始监听

注意事项:服务器端请用CLI模式运行,cgi模式会超时,这是新手常喜欢犯的错误。那么什么是CLI模式呢?简单的说就是用命令行去执行,而不要用游览器打开,否则会超时的!

PHP 相关文章推荐
关于文本留言本的分页代码
Oct 09 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
检查php文件中是否含有bom的函数
May 31 PHP
PHP中is_file不能替代file_exists的理由
Mar 04 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
php 基础函数
Feb 10 PHP
PHP批量删除jQuery操作
Jul 23 PHP
PHP开发中解决并发问题的几种实现方法分析
Nov 13 PHP
浅谈PHP中pack、unpack的详细用法
Mar 12 PHP
php-7.3.6 编译安装过程
Feb 11 PHP
TP5框架实现签到功能的方法分析
Apr 05 PHP
PHP使用range协议实现输出文件断点续传代码实例
Jul 04 #PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 #PHP
成为好程序员必须避免的5个坏习惯
Jul 04 #PHP
windows7下安装php的php-ssh2扩展教程
Jul 04 #PHP
windows7下安装php的imagick和imagemagick扩展教程
Jul 04 #PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
Jul 04 #PHP
php实现批量压缩图片文件大小的脚本
Jul 04 #PHP
You might like
fgetcvs在linux的问题
2012/01/15 PHP
PHP setTime 设置当前时间的代码
2012/08/27 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
PHP 中 DOMDocument保存xml时中文出现乱码问题的解决方案
2016/09/19 PHP
PHP后台备份MySQL数据库的源码实例
2019/03/18 PHP
javascript window.opener的用法分析
2010/04/07 Javascript
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
关于 文本框默认值 的操作js代码
2012/01/12 Javascript
js调用AJAX时Get和post的乱码解决方法
2013/06/04 Javascript
js鼠标及对象坐标控制属性详细解析
2013/12/14 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
javascript操作数组详解
2014/12/17 Javascript
js显示当前日期时间和星期几
2015/10/22 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
2019/08/27 jQuery
element-ui中按需引入的实现
2019/12/25 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python获取任意xml节点值的方法
2015/05/05 Python
Python最小二乘法矩阵
2019/01/02 Python
python装饰器的特性原理详解
2019/12/25 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
详解CSS3中的box-sizing(content-box与border-box)
2019/04/19 HTML / CSS
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
什么是托管函数?托管函数有什么用?
2014/06/15 面试题
初级软件工程师面试题 Junior Software Engineer Interview
2015/02/15 面试题
园长自我鉴定
2013/10/06 职场文书
教师产假请假条
2014/04/10 职场文书
2014年党风廉政工作总结
2014/12/03 职场文书
神龙架导游词
2015/02/11 职场文书
院系推荐意见
2015/06/05 职场文书
公文写作指导之倡议书!
2019/07/03 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
Win10加载疑难解答时出错发生意外错误的解决方法
2022/07/07 数码科技