最简单的PHP socket echo server。
常有人困惑php的socket服务,现在有libevent和多线程了,但是我还是整一个select的
- <?php
- $addr = '0.0.0.0';
- $port = 1234;
- $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
- if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
- echo 'Unable to set option on socket: '. socket_strerror(socket_last_error()) . PHP_EOL;
- }
- if($socket < 0) {
- echo "Socket create:".$socket_strerror($socket)."\n";
- exit;
- }
- if (! ($ret = socket_bind($socket, $addr, $port)) ) {
- $cmd =isset($_SERVER['WINDIR'])? "netstat -an -o | find \"".$port."\"":"netstat -anp | grep \"".$port."\"";
- $output = NULL;
- exec( $cmd, $output , $return_var);
- echo "
- -----------------------------------------------
- $cmd
- <pre>";
- var_dump($output, $return_var);
- echo "/<pre>";
- //echo "//AS!\n";
- exit;
- }
- if ( ($ret = socket_listen($socket, 5)) < 0 ) {
- echo "socket listen:".socket_strerror()."\n";
- exit;
- }
- socket_set_nonblock($socket);
- $clients = array($socket);
- while(true) {
- $read = $clients;
- $writes=NULL;$execs=NULL;
- if(socket_select($read, $writes, $execs, 2) < 1){
- echo ".";
- continue;
- }
- if(in_array($socket,$read)) {
- $newsock = socket_accept($socket);
- socket_set_nonblock($newsock);
- socket_getpeername($newsock,$remoteIP,$remotePort);
- $userSN = $remoteIP.'_'.$remotePort;
- echo $userSN.' connetect in'.chr(10);
- $clients[$userSN] = $newsock;
- socket_write($newsock,'welcome '.$userSN.chr(10));
- continue;
- }
- foreach($read as $read_sock) {
- $data = @socket_read($read_sock, 2048, PHP_BINARY_READ);
- $data = trim($data);
- if(strlen($data) == 2048){
- socket_close($read_sock);
- continue;
- }
- @socket_getpeername($read_sock, $remoteIP, $remotePort);
- $userSN = $remoteIP.'_'.$remotePort;
- echo $userSN.' say:'.$data.chr(10);
- socket_write($read_sock,'you say:'.$data);
- }
- }
php s1.php
telnet 127.0.0.1 1234
telnet 127.0.0.1 1234
最简单的PHP socket echo server。的更多相关文章
- 一个高在线(可以超过1024)多线程的socket echo server(pthreads 和 libevent扩展)
研究了3周吧,本来打算用pthreads+event扩展的,结果event扩展太原始了,太多函数了,实在不知道怎么在外部随时发送数据给客户端,所以改用libevent, 改用libevent之后花了2 ...
- winsock2之最简单的win socket编程
原文:winsock2之最简单的win socket编程 server.cpp #include <WINSOCK2.H> #include <stdio.h> #pragma ...
- [转载]socket下server端支持多客户端并发访问简单实现
/*Author: wainiwann *Source: 博客园 http://www.cnblogs.com/wainiwann *Remarks: 转载请说明出处!!! */ 感觉很不错,可以学 ...
- [z]libevent入门教程:Echo Server based on libevent 不指定
[z]https://www.felix021.com/blog/read.php?2068 花了两天的时间在libevent上,想总结下,就以写简单tutorial的方式吧,貌似没有一篇简单的说明, ...
- libevent 入门教程:Echo Server based on libevent(转)
下面假定已经学习过基本的socket编程(socket, bind, listen, accept, connect, recv, send, close),并且对异步/callback有基本的认识. ...
- 简单的php socket 实例
server: <?php set_time_limit(0); $ip = '127.0.0.1'; $port = 8888; // 1. 创建 if( ($sock = socket_cr ...
- UEditor编辑器和php简单的实现socket通信
一.UEditor编辑器 使用这个编辑器是需要先下载编辑器文件,记得下载的时候放入自己的网站中,既然是php中使用,自然我下载的就是php的UEditor编辑器了,然后是utf-8的 其实使用很简单, ...
- 网络编程-UDP echo server
1. UDP简介 UDP 和TCP 的区别包括 1. 面向字节流和面向报文 2. TCP必须要建立连接后才能进行数据交换,但是UDP则并没有连接的建立和释放过程.面向字节流说明,tcp报文段(segm ...
- netty写Echo Server & Client完整步骤教程(图文)
1.创建Maven工程 1.1 父节点的pom.xml代码(root pom文件) 1 <?xml version="1.0" encoding="UTF-8&qu ...
随机推荐
- 选择列表控件的使用(PickList)
需要下载picklist.dll类库配合使用 <%@ Register TagPrefix="cc1" Namespace="PickListControl&quo ...
- Java中List、Collections实现梭哈游戏
package ch8; import java.util.*; /** * Created by Jiqing on 2016/11/27. */ public class ShowHand { / ...
- CentOS用yum快速安装nginx
增加nginx源 vim /etc/yum.repos.d/nginx.repo [nginx] name=nginx repo baseurl=http://nginx.org/packages/ ...
- JavaSE复习_12 Socket网络编程
△客户端使用Scanner与BufferedReader的异同,Scanner在客户端调用s.shutdownoutput的时候,将会因为读不到行而报异常,但是BufferedReader的readl ...
- android源码解析(十七)-->Activity布局加载流程
版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...
- php 新特性
PHP 5.6 1.可以使用表达式定义常量 https://php.net/manual/zh/migration56.new-features.php 在之前的 PHP 版本中,必须使用静态值来定义 ...
- js树目录结构
jstree https://www.jstree.com/demo/ treejs http://www.treejs.cn/v3/demo.php#_206
- 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 ...
- @ResponseStatus
返回一个指定的http response状态码. @ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "IOException oc ...
- 浅谈Java中的深拷贝和浅拷贝
转载: 浅谈Java中的深拷贝和浅拷贝 假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(bool ...