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 相关文章推荐
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
destoon文章模块调用企业会员资料的方法
Aug 22 PHP
php实现兼容2038年后Unix时间戳转换函数
Mar 18 PHP
使用新浪微博API的OAuth认证发布微博实例
Mar 27 PHP
php修改文件上传限制方法汇总
Apr 07 PHP
php使用cookie实现记住登录状态
Apr 27 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
php+mysql+jquery实现简易的检索自动补全提示功能
Apr 15 PHP
PHP设计模式之装饰器模式实例详解
Feb 07 PHP
PHP 使用位运算实现四则运算的代码
Mar 09 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预定义变量使用帮助(带实例)
2013/10/30 PHP
Windows下的PHP安装pear教程
2014/10/24 PHP
详解PHP实现异步调用的4种方法
2016/03/14 PHP
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
jQuery实现图片渐入渐出切换展示效果
2015/08/15 Javascript
JS Array.slice 截取数组的实现方法
2016/01/02 Javascript
JS上传图片预览插件制作(兼容到IE6)
2016/08/07 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
原生js实现旋转木马轮播图效果
2017/02/27 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
Javascript数组方法reduce的妙用之处分享
2019/06/10 Javascript
JS前后端实现身份证号验证代码解析
2020/07/23 Javascript
google广告之另类js调用实现代码
2020/08/22 Javascript
解决vant title-active-color与title-inactive-color不生效问题
2020/11/03 Javascript
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
5款非常棒的Python工具
2018/01/05 Python
python中pylint使用方法(pylint代码检查)
2018/04/06 Python
python 删除非空文件夹的实例
2018/04/26 Python
解决Python一行输出不显示的问题
2018/12/03 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
Spring Cloud Feign高级应用实例详解
2019/12/10 Python
利用python中集合的唯一性实现去重
2020/02/11 Python
Python bisect模块原理及常见实例
2020/06/17 Python
关于Java String的一道面试题
2013/09/29 面试题
培训主管岗位职责
2014/02/01 职场文书
2014植树节活动总结
2014/03/11 职场文书
俞敏洪一分钟演讲稿
2014/08/26 职场文书
试用期员工工作自我评价
2014/09/10 职场文书
单位工作证明
2014/10/07 职场文书
推荐信范文大全
2015/03/27 职场文书
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
Mysql中常用的join连接方式
2022/05/11 MySQL