解析:通过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 相关文章推荐
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 PHP
PHP的历史和优缺点
Oct 09 PHP
php 执行系统命令的方法
Jul 07 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
如何使用PHP对网站验证码进行破解
Sep 17 PHP
FleaPHP框架数据库查询条件($conditions)写法总结
Mar 19 PHP
PHP编写daemon process详解及实例代码
Sep 30 PHP
PHP中功能强大却很少使用的函数实例小结
Nov 10 PHP
yii2项目实战之restful api授权验证详解
May 20 PHP
php实现大文件断点续传下载实例代码
Oct 01 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
Dec 25 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 操作MySQL数据库基础代码
2009/09/29 PHP
php一个找二层目录的小东东
2012/08/02 PHP
php IP转换整形(ip2long)的详解
2013/06/06 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
thinkphp修改配置进入默认首页的方法
2017/02/07 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
Javascript 遮罩层和加载效果代码
2013/08/01 Javascript
jQuery/CSS3图片特效插件整理推荐
2014/12/07 Javascript
jQuery图片轮播滚动切换代码分享
2020/04/20 Javascript
总结十个Angular.js由浅入深的面试问题
2016/08/26 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
微信、QQ、微博、Safari中使用js唤起App
2018/01/24 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
[01:08:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS LGD-CDEC
2014/05/22 DOTA
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
python时间与Unix时间戳相互转换方法详解
2020/02/13 Python
基于python模拟bfs和dfs代码实例
2020/11/19 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
Stutterheim瑞典:瑞典高级外套时装品牌
2019/06/24 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
2014年教师培训的自我评价
2014/01/03 职场文书
实习生自我评价
2014/01/18 职场文书
鲜果饮品店创业计划书
2014/01/21 职场文书
企业总经理助理岗位职责
2014/09/12 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2019年入党思想汇报格式与要求
2019/06/25 职场文书
sql中mod()函数取余数的用法
2021/05/29 SQL Server
javascript的setTimeout()使用方法总结
2021/11/20 Javascript
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技