php怎么写socket服务器?利用PHP如何实现Socket服务器
socket服务器的工作方式是这样的,不间断地运行以等待客户端的连接。一旦客户端连接上了,服务器就会将它添加到客户名单中,然后开始等待来自客户端的消息。
不要走开,下面是完整的源代码:
代码如下 | 复制代码 |
// Set time limit to indefinite execution set_time_limit (0);
// Set the ip and port we will listen on $address='localhost' $port= 10000; $max_clients= 10;
// Array that will hold client information $client= Array();
// Create a TCP Stream socket $sock= socket_create(AF_INET, SOCK_STREAM, 0); // Bind the socket to an address/port socket_bind($sock,$address,$port)ordie('Could not bind to address'); // Start listening for connections socket_listen($sock);
echo"Waiting for connections...\r\n";
// Loop continuously while(true) { // Setup clients listen socket for reading $read[0] =$sock; for($i= 0;$i<$max_clients;$i++) { if(isset($client[$i]['sock'])) $read[$i+ 1] =$client[$i]['sock']; } // Set up a blocking call to socket_select() if(socket_select($read,$write= NULL,$except= NULL,$tv_sec= 5) < 1) continue; /* if a new connection is being made add it to the client array */ if(in_array($sock,$read)) { for($i= 0;$i<$max_clients;$i++) { if(empty($client[$i]['sock'])) { $client[$i]['sock'] = socket_accept($sock); echo"New client connected $i\r\n"; break; } elseif($i==$max_clients- 1) echo"Too many clients...\r\n"; } }// end if in_array
// If a client is trying to write - handle it now for($i= 0;$i<$max_clients;$i++) {// for each client if(isset($client[$i]['sock'])) { if(in_array($client[$i]['sock'],$read)) { $input= socket_read($client[$i]['sock'], 1024); if($input== null) { echo"Client disconnecting $i\r\n"; // Zero length string meaning disconnected unset($client[$i]); }else{ echo"New input received $i\r\n"; // send it to the other clients for($j= 0;$j<$max_clients;$j++) { if(isset($client[$j]['sock']) &&$j!=$i) { echo"Writing '$input' to client $j\r\n"; socket_write($client[$j]['sock'],$input,strlen($input)); } } if($input=='exit') { // requested disconnect socket_close($client[$i]['sock']); } } }else{ echo"Client disconnected $i\r\n"; // Close the socket socket_close($client[$i]['sock']); unset($client[$i]); } } } }// end while // Close the master sockets socket_close($sock); |
哎呀,乍一看这似乎是一个大工程,但是我们可以先将它分解为几个较小的部分。
第一部分是创建服务器。Lines:2至20。
这部分代码设置了变量、地址、端口、最大客户端和客户端数组。接下来创建socket并将其绑定到我们指定的地址和端口上。
下面我们要做的事情就是执行一个死循环(实际上我们是故意的!)。Lines:22至32。
在这部分代码中我们做的第一步是设置 $read 数组。此数 组包含所有客户端的套接字和我们主服务器的套接字。这个变量稍后会用于select语句:告诉PHP监听来自这些客户端的每一条消息。
socket_select()的最后一个参数告诉我们的服务器在返回值之前最多等待5秒钟。如果它的返回值小于1,那么就表示没有收到任何数据,所以只需要返回循环顶部,继续等待。
脚本的下一个部分,是增加新的客户端到数组中。Lines:33至44。
将新的客户端放置在列表的末尾。检查以确保客户端的数量没有超过我们想要服务器处理的数量。
下面要介绍的代码块相当大,也是服务器的主要部分。当客户端将消息发送到服务器时,就需要这块代码挺身而出来处理。消息可以是各种各样的,断开消息、实际断开——只要是服务器需要处理的消息。Lines:46至末尾。
代码循环通过每个客户端并检查是否收到来自于它们的消息。如果是,获取输入的内容。根据输入来检查这是否是一个断开消息,如果是那就从数组中删除它们,反之,那它就是一个正常的消息,那我们的服务器再次通过所有客户端,并一个一个写信息给他们,跳过发送者。
好了,下面试试创造你自己的聊天服务器吧!
小编分享的这篇文章介绍了php实现的漂亮分页方法,有兴趣的同学可以参考一下所给实例代码分页页码显示算法
代码如下 | 复制代码 |
/** * 获取分页的HTML内容 * @param integer $page 当前页 * @param integer $pages 总页数 * @param string $url 跳转url地址 最后的页数以 '&page=x' 追加在url后面 * * @return string HTML内容; */ public static function getPageHtml($page, $pages, $url){ //最多显示多少个页码 $_pageNum = 5; //当前页面小于1 则为1 $page = $page<1?1:$page; //当前页大于总页数 则为总页数 $page = $page > $pages ? $pages : $page; //页数小当前页 则为当前页 $pages = $pages < $page ? $page : $pages; //计算开始页 $_start = $page - floor($_pageNum/2); $_start = $_start<1 ? 1 : $_start; //计算结束页 $_end = $page + floor($_pageNum/2); $_end = $_end>$pages? $pages : $_end; //当前显示的页码个数不够最大页码数,在进行左右调整 $_curPageNum = $_end-$_start+1; //左调整 if($_curPageNum<$_pageNum && $_start>1){ $_start = $_start - ($_pageNum-$_curPageNum); $_start = $_start<1 ? 1 : $_start; $_curPageNum = $_end-$_start+1; } //右边调整 if($_curPageNum<$_pageNum && $_end<$pages){ $_end = $_end + ($_pageNum-$_curPageNum); $_end = $_end>$pages? $pages : $_end; } $_pageHtml = '<ul class="pagination">'; /*if($_start == 1){ $_pageHtml .= '<li><a title="第一页">«</a></li>'; }else{ $_pageHtml .= '<li><a title="第一页" href="'.$url.'&page=1">«</a></li>'; }*/ if($page>1){ $_pageHtml .= '<li><a title="上一页" href="'.$url.'&page='.($page-1).'">«</a></li>'; } for ($i = $_start; $i <= $_end; $i++) { if($i == $page){ $_pageHtml .= '<li class="active"><a>'.$i.'</a></li>'; }else{ $_pageHtml .= '<li><a href="'.$url.'&page='.$i.'">'.$i.'</a></li>'; } } /*if($_end == $pages){ $_pageHtml .= '<li><a title="最后一页">»</a></li>'; }else{ $_pageHtml .= '<li><a title="最后一页" href="'.$url.'&page='.$pages.'">»</a></li>'; }*/ if($page<$_end){ $_pageHtml .= '<li><a title="下一页" href="'.$url.'&page='.($page+1).'">»</a></li>'; } $_pageHtml .= '</ul>'; echo $_pageHtml; } |
json_endoce: http://cn.php.net/json_encode
json_dedoce: http://cn.php.net/json_decode
json_encode — 对变量进行 JSON 编码,并返回 value 值的 JSON 形式,例如:
代码如下 | 复制代码 |
<?php $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5); echo json_encode($arr); ?> |
以上代码执行后输出:
{"a":1,"b":2,"c":3,"d":4,"e":5}
假如要编码的数据源(一般是一个数组),value 中包含中文,经过 json_encode 处理后输出的是 unicode 编码。
代码如下 | 复制代码 |
<?php $arr = array ('a'=>'一聚教程网'); echo json_encode($arr); ?> |
以上代码执行后输出:
{"a":"\u811a\u672c\u4e4b\u5bb6"}
PHP 底层已经做了 unicode 处理,如果嫌它不够直观,可以利用 urlencode 和 urldecode 方法绕过这个转码为 unicode 的过程:
代码如下 | 复制代码 |
$arr = array ('a'=>urlencode('一聚教程网')); echo urldecode(json_encode($arr)); |
以上代码执行后输出:
{"a":"一聚教程网"}
有同学问《细说php》这本书怎么样,适不适合新手学习。小编分享了一篇关于《细说php》的心得体会,大家可以参考一下。《细说PHP(第2版)》共六个部分,分为30个章节,每一章都是PHP独立知识点的总结。内容涵盖了动态网站开发的前台技术(HTML+CSS)、PHP编程语言的语法、PHP的常用功能模块和实用技巧、MySQL数据库的设计与应用、PHP面向对象的程序设计思想、数据库抽象层PDO、Smarty模板技术、Web开发的设计模式、自定义框架BroPHP、Web项目开发整个流程等目前PHP开发中最主流的技术。每一章中都有大量的实用示例,以及详尽的注释,加速读者的理解和学习,也为每章的技术点设置了大量的自测试题。最后以一个比较完整的、采用面向对象思想,以及通过MVC模式设计,并结合Smarty模板,基于BroPHP框架的CMS系统为案例,详细介绍了Web系统开发从设计到部署的各个细节,便于更好地进行开发实践。
这书作者写了一年半,花了四天时间学完。几年前曾经读过别的php教材,后来没参与这类的项目就荒废了,这本算是复习。本书内容全面,很详细,虽然刚看过鸟哥的书,比较喜欢那种轻松近人的风格,不过这本书中规中矩读着也不错。
虽然各种错别字,字符错误比较多。但是对于完全新手来说入门算不错了。该涉及的基本都有。顺便学习下种种基本概念。代码可以拿来当改错题做。 看完有哪些章节不理解的可以看下视频教程或网上单独搜下。 如果有web开发经验的直接看php手册即可。
相关文章
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
- 简单的php获取linux服务器状态的代码,不多说-直接上函数:复制代码 代码如下:function get_used_status(){ $fp = popen('top -b -n 2 | grep -E "^(Cpu|Mem|Tasks)"',"r");//获取某一时刻系统cpu和内存使用情况 $rs =...2014-05-31
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25- 这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
- 这篇文章主要介绍了Springboot+TCP监听服务器搭建过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-28
- 复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
- 前一段时间使用NetStat命令查看服务器端口时,发现服务器udp端口开放了好多,最少在1000个以上,当时事情比较多,没有管它,今天终于有点时间,仔细检查了一下,排除了这个问题. ...2016-01-27
- 这篇文章主要介绍了JS WebSocket断开原因和心跳机制,对websocket感兴趣的同学,可以参考下...2021-05-08
- 这篇文章主要介绍了C#实现Socket通信的解决方法,需要的朋友可以参考下...2020-06-25
- 本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29
解决HttpPost+json请求---服务器中文乱码及其他问题
这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22- js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
- 本篇文章主要介绍了C# Socket的TCP通讯,socket通讯方式有两种:同步和异步,详细的介绍了这两种方法,有兴趣的可以了解一下。...2020-06-25
python使用socket高效传输视频数据帧(连续发送图片)
本文主要介绍了python使用socket高效传输视频数据帧(连续发送图片),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-23- 这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25