解析:通过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 相关文章推荐
PHP-MySQL教程归纳总结
Jun 07 PHP
Zend Studio 无法启动的问题解决方法
Dec 04 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
php url路由入门实例
Apr 23 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
Aug 20 PHP
浅析php原型模式
Nov 25 PHP
php去除头尾空格的2种方法
Mar 16 PHP
PHP进行批量任务处理不超时的解决方法
Jul 11 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
php+Memcached实现简单留言板功能示例
Feb 15 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
php通过各种函数判断0和空
Jul 04 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
PHP STRING 陷阱原理说明
2010/07/24 PHP
PHP下常用正则表达式整理
2010/10/26 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
PHP5多态性与动态绑定介绍
2015/04/03 PHP
微信推送功能实现方式图文详解
2019/07/12 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
myFocus slide3D v1.1.0 使用方法与下载
2011/01/12 Javascript
ASP.NET jQuery 实例7 通过jQuery来获取DropDownList的Text/Value属性值
2012/02/03 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
jQuery使用ajaxSubmit()提交表单示例
2014/04/04 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
jQuery实现图片轮播特效代码分享
2015/09/15 Javascript
Augularjs-起步详解
2016/07/08 Javascript
js选项卡的制作方法
2017/01/23 Javascript
在vue项目中,使用axios跨域处理
2018/03/07 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
[03:42]2014DOTA2国际邀请赛 第三日比赛排位扑朔迷离
2014/07/12 DOTA
jenkins配置python脚本定时任务过程图解
2019/10/29 Python
django列表筛选功能的实现代码
2020/03/27 Python
django 数据库返回queryset实现封装为字典
2020/05/19 Python
python 中关于pycharm选择运行环境的问题
2020/10/31 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
python3中celery异步框架简单使用+守护进程方式启动
2021/01/20 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
C语言50道问题
2014/10/23 面试题
社区党员群众路线教育实践活动心得体会
2014/11/03 职场文书
停课通知书
2015/04/24 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
老乡会致辞
2015/07/28 职场文书
2016年公司新年寄语
2015/08/17 职场文书
幼儿园大班开学寄语(2016秋季)
2015/12/03 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL