解析:通过php socket并借助telnet实现简单的聊天程序


Posted in PHP onJune 18, 2013

以下是通过php的socket扩展模块实现的一个简单的消息处理服务器端:绑定在一个本机的端口,监听客户端的连接,接收数据并转发给发送者之外的所有客户端
socket_server.php

#!/usr/bin/env php
<?php
//author:zhxia
if(!extension_loaded('sockets')){
    die('the sockets extension is not loaded!');
}
const PORT=9981;
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die('socket create error!');
#通过设置这个选项,进行端口的重用
socket_set_option($socket,SOL_SOCKET,SO_REUSEADDR,1);
socket_bind($socket,0,PORT);
socket_listen($socket);
#使用非阻塞模式
socket_set_nonblock($socket);
echo 'listen on port '.PORT.'...'.PHP_EOL;
$clients=array($socket);
while(TRUE){
    $read=$clients;
    $write=$except=array();
    //通过select系统调用,检测socket的状态是否改变
    if(socket_select($read,$write,$except,0)<1){
        continue;
    }
    //检测是否有客户端来进行连接
    if(in_array($socket,$read)){
        $clients[]=$newsocket=socket_accept($socket);
        socket_write($newsocket,"welcome!\nthere are ".(count($clients)-1)." client here\n");
        socket_getpeername($newsocket,$ip);
        echo "new client connected:$ip\n";
        $key=array_search($newsocket,$read);
        unset($read[$key]);
    }
    foreach($read as $read_socket){
        $data=@socket_read($read_socket,1024,PHP_NORMAL_READ);
        if($data===false){
            //如果没有取到数据,说明该客户端已经断开
            $key=array_search($read_socket,$clients);
            unset($clients[$key]);
            echo "client disconnectd.\n";
            continue;
        }
        $data=trim($data);
        if(!empty($data)){
            foreach($clients as $write_socket){
                //排除服务器端和自身,然后将数据发送给所有的其他客户端
                if($write_socket==$socket||$write_socket==$read_socket){
                    continue;
                }
                socket_write($write_socket,"$data\n");
            }
        }
    }
}
socket_close($socket);

启动服务端:
zhxia@zhxia-pc:~/sh/php$ ./socket_server.php
listen on port 9981...

通过telnet进行连接:
zhxia@haozudb:~$ telnet 192.168.187.16 9981
Trying 192.168.187.16...
Connected to 192.168.187.16.
Escape character is '^]'.
welcome!
there are 1 client here

PHP 相关文章推荐
全文搜索和替换
Oct 09 PHP
PHP中for与foreach的区别分析
Mar 09 PHP
使用php判断服务器是否支持Gzip压缩功能
Sep 24 PHP
在Yii框架中使用PHP模板引擎Twig的例子
Jun 13 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
php计算两个整数的最大公约数常用算法小结
Mar 05 PHP
浅析Yii2集成富文本编辑器redactor实例教程
Apr 25 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
Dec 07 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP异常处理定义与使用方法分析
Jul 25 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 PHP
php将字符串转换为数组实例讲解
May 05 PHP
浅析is_writable的php实现
Jun 18 #PHP
解析mysql left( right ) join使用on与where筛选的差异
Jun 18 #PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 #PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
Jun 18 #PHP
解析PHP实现多进程并行执行脚本
Jun 18 #PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 #PHP
解析php中static,const与define的使用区别
Jun 18 #PHP
You might like
PHP5.2中date()函数显示时间与北京时间相差8小时的解决办法
2009/05/28 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
php字符串函数学习之strstr()
2015/03/27 PHP
php生成图片验证码的实例讲解
2015/08/03 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
将光标定位于输入框最右侧实现代码
2012/12/04 Javascript
Function.prototype.bind用法示例
2013/09/16 Javascript
Jquery的Tabs内容轮换效果实现代码,几行搞定
2014/02/12 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
Eclipse配置Javascript开发环境图文教程
2015/01/29 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
如何阻止移动端浏览器点击图片浏览
2020/08/29 Javascript
详解JavaScript 的执行机制
2020/09/18 Javascript
python缩进区别分析
2014/02/15 Python
Python内置数据结构与操作符的练习题集锦
2016/07/01 Python
对python抓取需要登录网站数据的方法详解
2018/05/21 Python
Python3基于sax解析xml操作示例
2018/05/22 Python
对python中的argv和argc使用详解
2018/12/15 Python
Python操作redis和mongoDB的方法
2019/12/19 Python
Python 中如何写注释
2020/08/28 Python
Visual Studio Code搭建django项目的方法步骤
2020/09/17 Python
益模软件Java笔试题
2012/03/27 面试题
什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?
2013/07/26 面试题
介绍一下RMI的基本概念
2016/12/17 面试题
低碳环保标语
2014/06/12 职场文书
婚前保证书范文
2015/02/28 职场文书
会计简历自我评价
2015/03/10 职场文书
2019学校请假条格式及范文
2019/06/25 职场文书