解析:通过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设计聊天室步步通
Oct 09 PHP
PHP新手上路(十)
Oct 09 PHP
php网站被挂木马后的修复方法总结
Nov 06 PHP
thinkPHP实现瀑布流的方法
Nov 29 PHP
PHP使用in_array函数检查数组中是否存在某个值
Mar 25 PHP
php比较相似字符串的方法
Jun 05 PHP
PHP滚动日志的代码实现
Jun 10 PHP
Discuz!X中SESSION机制实例详解
Sep 23 PHP
php表单习惯用的正则表达式
Oct 11 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
PHP的静态方法与普通方法用法实例分析
Sep 26 PHP
PHP rsa加密解密算法原理解析
Dec 09 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
在数据量大(超过10万)的情况下
2007/01/15 PHP
mysql 字段类型说明
2007/04/27 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
php中chdir()函数用法实例
2014/11/13 PHP
DOM相关内容速查手册
2007/02/07 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
jQuery.parseJSON(json)将JSON字符串转换成js对象
2014/07/27 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
js实现鼠标滑过文字链接色彩变化的效果
2015/05/06 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
vue通信方式EventBus的实现代码详解
2019/06/10 Javascript
js中火星坐标、百度坐标、WGS84坐标转换实现方法示例
2020/03/02 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
用ReactJS和Python的Flask框架编写留言板的代码示例
2015/12/19 Python
Matplotlib 生成不同大小的subplots实例
2018/05/25 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python从入门到精通 windows安装python图文教程
2019/05/18 Python
Python3实现二叉树的最大深度
2019/09/30 Python
Django ORM判断查询结果是否为空,判断django中的orm为空实例
2020/07/09 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
函授本科自我鉴定
2013/11/03 职场文书
公司领导推荐信
2013/11/12 职场文书
一年级家长会邀请函
2014/01/25 职场文书
简历自我评价模版
2014/01/31 职场文书
班级活动策划书
2014/02/06 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
科学发展观活动总结
2014/08/28 职场文书
给老师的一封感谢信
2015/01/20 职场文书
SpringBoot整合Redis入门之缓存数据的方法
2021/11/17 Redis
漫画《催眠麦克风-Dawn Of Divisions》第二卷PV公开
2022/04/05 日漫