博主信息
博文 81
粉丝 1
评论 0
访问量 146982
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
socket php中的socket的函数讲解和使用。
有什么是忘不了的的博客
原创
1130人浏览过

socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。  详情>>

要想客户端能通过websocket来访问,就必须先开启一个服务端的socket进程,来接收数据。

服务器端:

<?php 
   //创建一个套接字   echo:resource(4) of type (Socket)
   $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
   //套接字端口被释放后可以立即被使用,无须等待。
   socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, true);
   //给套接字绑定名字,将套接字与特定的IP地址和端口绑定起来
   socket_bind($socket,'0.0.0.0',8888); 
   //让套接字进入被动监听状态
   socket_listen($socket);

   $sockets[] = $socket;
   $write = NUll;
   $except = NUll;

   while(true){
      //$tmp_socket 里存放着所有链接着的客户端和服务器的 套接字。
      $tmp_socket = $sockets;
      var_dump($tmp_socket);
      var_dump($sockets);
      //socket_select()是用来堵塞的,判断有没有客户端连接,或者客户端发送数据。  
      //或者数组里存在 不存在的 套接字 。比如说我又 2个链接,加上我自己应该是3个套接字,但是有一个断开了链接,
      //那就应该是还剩2个套接字,但我们并没有删除数组中这个套接字,就会出现这种情况,导致socket_select()无限次被触发。
      //情况一:新客户端连接,$tmp_socket就会被只剩余$socket,也就是服务器创建的套接字,
      //情况二:客户端发送数据:$tmp_socket就会只剩余 客户端的套接字,谁发送了就变为谁。 
      //切记:$tmp_socket最终返回的是一个有下标的数组,这个下标是未修改前的下标,这也是为什么要是用sort()来排序一下。
      //注意:$tmp_socket 和 $write 和 $except 都是引用传值。你可以去查看一下手册。
      socket_select($tmp_socket, $write, $except, NUll);
      var_dump($tmp_socket);
      //这里的sort并不是为了排序,而是为了干掉他的默认下标。
      sort($tmp_socket);
      if ($tmp_socket[0] == $socket) {
     //接收客户端请求,返回一个新的套接字来和客户端通信,
     //后面和客户端通信时,要使用这个新生成的套接字,而不是原来服务器端的套接字。
     // socket_accept()会在服务器中产生一个 0.0.0.0:8888的进程等待客户端连接,并堵塞代码的执行。这里的ip:port是上面指定的。
     //一但有客户端连接成功就会继续执行。
          $client = socket_accept($socket);
          $sockets[] = $client;
          var_dump($sockets);

      }else{
          //从客户端的套接字中读取数据
          $reMsg = socket_read($tmp_socket[0],1024);
           //向客户端的套接字中写入数据
          socket_write($tmp_socket[0],$reMsg,strlen($reMsg));
          echo $reMsg;
      }

   };

客户端

<?php 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
//连接一个socket
socket_connect($socket, '127.0.0.1',8888);
$str =  'this is client'.PHP_EOL;
while (true) {
        //在命令行下可以输出内容
	fwrite(STDOUT, '请输入内容:');
	//在命令行下可以输入内容
	$str = fgets(STDIN);
	//向套接字中写入数据
	socket_write($socket, $str, strlen($str));
	//从套接字中读取数据
	echo socket_read($socket , 1024);
}


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学