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中for循环语句的几种变型
Nov 26 PHP
mysql 的 like 问题,超强毕杀记!!!
Jan 18 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
Notice: Undefined index: page in E:\PHP\test.php on line 14
Nov 02 PHP
php下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
Nov 11 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
PHP的Yii框架中Model模型的学习教程
Mar 29 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
Feb 08 PHP
详解php框架Yaf路由重写
Jun 20 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
Nov 06 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 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
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
PHP检测移动设备类mobile detection使用实例
2014/04/14 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
学习PHP session的传递方式
2016/06/15 PHP
从零开始学习jQuery (二) 万能的选择器
2010/10/01 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
jquery 读取页面load get post ajax 四种方式代码写法
2011/04/02 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
JS清除IE浏览器缓存的方法
2013/07/26 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
简单易用的倒计时js代码
2014/08/04 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
深入解析JavaScript中的立即执行函数
2016/05/21 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
简单实现jQuery轮播效果
2017/08/18 jQuery
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
vue引入静态js文件的方法
2020/06/20 Javascript
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
Python中super关键字用法实例分析
2015/05/28 Python
Django 1.10以上版本 url 配置注意事项详解
2019/08/05 Python
FFT快速傅里叶变换的python实现过程解析
2019/10/21 Python
Tkinter中复选菜单是否被选中的判断与设置方式
2020/03/04 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
Canvas与图片压缩的示例代码
2017/11/28 HTML / CSS
找到您丢失的钥匙、钱包和手机:Tile
2017/05/19 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
EJB的几种类型
2012/08/15 面试题
青年文明号事迹材料
2014/01/18 职场文书
表决心的诗句大全
2014/03/11 职场文书
关于python类SortedList详解
2021/09/04 Python