常有人困惑php的socket服务,现在有libevent和多线程了,但是我还是整一个select的

  1. <?php
  2. $addr = '0.0.0.0';
  3. $port = 1234;
  4. $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
  5.  
  6. if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
  7. echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
  8. }
  9.  
  10. if($socket < 0) {
  11. echo "Socket create:".$socket_strerror($socket)."\n";
  12. exit;
  13. }
  14.  
  15. if (! ($ret = socket_bind($socket, $addr, $port)) ) {
  16. $cmd =isset($_SERVER['WINDIR'])? "netstat -an -o | find \"".$port."\"":"netstat -anp | grep \"".$port."\"";
  17. $output = NULL;
  18. exec( $cmd, $output , $return_var);
  19. echo "
  20. -----------------------------------------------
  21. $cmd
  22. <pre>";
  23. var_dump($output, $return_var);
  24. echo "/<pre>";
  25. //echo "//AS!\n";
  26. exit;
  27. }
  28.  
  29. if ( ($ret = socket_listen($socket, 5)) < 0 ) {
  30. echo "socket listen:".socket_strerror()."\n";
  31. exit;
  32. }
  33.  
  34. socket_set_nonblock($socket);
  35.  
  36. $clients = array($socket);
  37. while(true) {
  38. $read = $clients;
  39. $writes=NULL;$execs=NULL;
  40. if(socket_select($read, $writes, $execs, 2) < 1){
  41. echo ".";
  42. continue;
  43. }
  44.  
  45. if(in_array($socket,$read)) {
  46. $newsock = socket_accept($socket);
  47. socket_set_nonblock($newsock);
  48. socket_getpeername($newsock,$remoteIP,$remotePort);
  49. $userSN = $remoteIP.'_'.$remotePort;
  50. echo $userSN.' connetect in'.chr(10);
  51. $clients[$userSN] = $newsock;
  52. socket_write($newsock,'welcome '.$userSN.chr(10));
  53. continue;
  54. }
  55.  
  56. foreach($read as $read_sock) {
  57. $data = @socket_read($read_sock, 2048, PHP_BINARY_READ);
  58. $data = trim($data);
  59. if(strlen($data) == 2048){
  60. socket_close($read_sock);
  61. continue;
  62. }
  63. @socket_getpeername($read_sock, $remoteIP, $remotePort);
  64. $userSN = $remoteIP.'_'.$remotePort;
  65. echo $userSN.' say:'.$data.chr(10);
  66. socket_write($read_sock,'you say:'.$data);
  67. }
  68. }

php s1.php

telnet 127.0.0.1 1234

telnet 127.0.0.1 1234

最简单的PHP socket echo server。的更多相关文章

  1. 一个高在线(可以超过1024)多线程的socket echo server(pthreads 和 libevent扩展)

    研究了3周吧,本来打算用pthreads+event扩展的,结果event扩展太原始了,太多函数了,实在不知道怎么在外部随时发送数据给客户端,所以改用libevent, 改用libevent之后花了2 ...

  2. winsock2之最简单的win socket编程

    原文:winsock2之最简单的win socket编程 server.cpp #include <WINSOCK2.H> #include <stdio.h> #pragma ...

  3. [转载]socket下server端支持多客户端并发访问简单实现

    /*Author: wainiwann *Source: 博客园 http://www.cnblogs.com/wainiwann *Remarks:  转载请说明出处!!! */ 感觉很不错,可以学 ...

  4. [z]libevent入门教程:Echo Server based on libevent 不指定

    [z]https://www.felix021.com/blog/read.php?2068 花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明, ...

  5. libevent 入门教程:Echo Server based on libevent(转)

    下面假定已经学习过基本的socket编程(socket, bind, listen, accept, connect, recv, send, close),并且对异步/callback有基本的认识. ...

  6. 简单的php socket 实例

    server: <?php set_time_limit(0); $ip = '127.0.0.1'; $port = 8888; // 1. 创建 if( ($sock = socket_cr ...

  7. UEditor编辑器和php简单的实现socket通信

    一.UEditor编辑器 使用这个编辑器是需要先下载编辑器文件,记得下载的时候放入自己的网站中,既然是php中使用,自然我下载的就是php的UEditor编辑器了,然后是utf-8的 其实使用很简单, ...

  8. 网络编程-UDP echo server

    1. UDP简介 UDP 和TCP 的区别包括 1. 面向字节流和面向报文 2. TCP必须要建立连接后才能进行数据交换,但是UDP则并没有连接的建立和释放过程.面向字节流说明,tcp报文段(segm ...

  9. netty写Echo Server & Client完整步骤教程(图文)

    1.创建Maven工程 1.1 父节点的pom.xml代码(root pom文件) 1 <?xml version="1.0" encoding="UTF-8&qu ...

随机推荐

  1. 选择列表控件的使用(PickList)

    需要下载picklist.dll类库配合使用 <%@ Register TagPrefix="cc1" Namespace="PickListControl&quo ...

  2. Java中List、Collections实现梭哈游戏

    package ch8; import java.util.*; /** * Created by Jiqing on 2016/11/27. */ public class ShowHand { / ...

  3. CentOS用yum快速安装nginx

    增加nginx源 vim  /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/ ...

  4. JavaSE复习_12 Socket网络编程

    △客户端使用Scanner与BufferedReader的异同,Scanner在客户端调用s.shutdownoutput的时候,将会因为读不到行而报异常,但是BufferedReader的readl ...

  5. android源码解析(十七)-->Activity布局加载流程

    版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...

  6. php 新特性

    PHP 5.6 1.可以使用表达式定义常量 https://php.net/manual/zh/migration56.new-features.php 在之前的 PHP 版本中,必须使用静态值来定义 ...

  7. js树目录结构

    jstree https://www.jstree.com/demo/ treejs http://www.treejs.cn/v3/demo.php#_206

  8. Libsvm:脚本(subset.py、grid.py、checkdata.py) | MATLAB/OCTAVE interface | Python interface

    1.脚本 This directory includes some useful codes: 1. subset selection tools. (子集抽取工具) subset.py 2. par ...

  9. @ResponseStatus

    返回一个指定的http response状态码. @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "IOException oc ...

  10. 浅谈Java中的深拷贝和浅拷贝

    转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...