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 相关文章推荐
对javascript和select部件的结合运用
Oct 09 PHP
用PHP实现的随机广告显示代码
Jun 14 PHP
PHPnow安装服务[apache_pn]失败的问题的解决方法
Sep 10 PHP
php 文件上传实例代码
Apr 19 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
给WordPress中的留言加上楼层号的PHP代码实例
Dec 14 PHP
php 解决substr()截取中文字符乱码问题
Jul 18 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
Mar 31 PHP
详解PHP中的 input属性(隐藏 只读 限制)
Aug 14 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
PHP代码加密的方法总结
Mar 13 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
解析php中array_merge与array+array的区别
2013/06/21 PHP
教你如何使用php session
2013/10/28 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
2013/12/20 PHP
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
2015/03/18 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
2015/04/27 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
利用PHP生成CSV文件简单示例
2016/12/21 PHP
PHP实现的操作数组类库定义与用法示例
2019/05/24 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
js控制淡入淡出示例代码
2013/11/12 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
Vue指令指令大全
2019/02/09 Javascript
[02:30]辉夜杯主赛事第二日胜者组半决赛 CDEC.Y赛后采访
2015/12/26 DOTA
Python 装饰器深入理解
2017/03/16 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
在PYQT5中QscrollArea(滚动条)的使用方法
2019/06/14 Python
python实现五子棋小程序
2019/06/18 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
如何在mac下配置python虚拟环境
2020/07/06 Python
Sublime Text3最新激活注册码分享适用2020最新版 亲测可用
2020/11/12 Python
DERMAdoctor官网:美国著名皮肤护理品牌
2019/07/06 全球购物
中秋寄语大全
2014/04/11 职场文书
企业标语大全
2014/07/01 职场文书
2014年青年教师工作总结
2014/12/17 职场文书
2015年国庆节演讲稿范文
2015/07/30 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书