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 相关文章推荐
php中的数组操作函数整理
Aug 18 PHP
PHP 向右侧拉菜单实现代码,测试使用中
Nov 03 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
Oct 25 PHP
php截取中文字符串不乱码的方法
Dec 25 PHP
php读取3389的脚本
May 06 PHP
Laravel 5框架学习之子视图和表单复用
Apr 09 PHP
PHP文件及文件夹操作之创建、删除、移动、复制
Jul 13 PHP
PHP 表单提交及处理表单数据详解及实例
Dec 27 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
php源码的安装方法和实例
Sep 26 PHP
laravel框架语言包拓展实现方法分析
Nov 22 PHP
Laravel 验证码认证学习记录小结
Dec 20 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
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
PHP convert_uudecode()函数讲解
2019/02/14 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
用javascript实现改变TEXTAREA滚动条和按钮的颜色,以及怎样让滚动条变得扁平
2007/04/20 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
Vue.js系列之vue-router(上)(3)
2017/01/03 Javascript
js实现鼠标左右移动,图片也跟着移动效果
2017/01/25 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
全新打包工具parcel零配置vue开发脚手架
2018/01/11 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
[02:14]完美“圣”典2016风云人物:xiao8专访
2016/12/01 DOTA
Python切片用法实例教程
2014/09/08 Python
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
python中如何使用朴素贝叶斯算法
2017/04/06 Python
Python实现通讯录功能
2018/02/22 Python
python中cPickle类使用方法详解
2018/08/27 Python
python提取照片坐标信息的实例代码
2019/08/14 Python
pytorch多进程加速及代码优化方法
2019/08/19 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
CSS3——齿轮转动关键代码
2013/05/02 HTML / CSS
应届毕业生求职信范文
2013/12/18 职场文书
教师党性分析材料
2014/02/04 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
python实现简单反弹球游戏
2021/04/12 Python
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS