解析:通过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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
一个oracle+PHP的查询的例子
Oct 09 PHP
用PHP查询域名状态whois的类
Nov 25 PHP
php遍历文件夹和文件列表示例分享
Mar 11 PHP
php中curl、fsocket、file_get_content三个函数的使用比较
May 09 PHP
一组PHP加密解密函数分享
Jun 05 PHP
通过php删除xml文档内容的方法
Jan 23 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
Feb 03 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
PHP基于新浪IP库获取IP详细地址的方法
May 04 PHP
PHP中strval()函数实例用法
Jun 07 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页面编码的两种方法示例介绍
2014/03/03 PHP
ThinkPHP实现事务回滚示例代码
2014/06/23 PHP
PHP实现git部署的方法教程
2017/12/19 PHP
js 编码转换 gb2312 和 utf8 互转的2种方法
2013/08/07 Javascript
讨论html与javascript在浏览器中的加载顺序问题
2013/11/27 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
Node.js DES加密的简单实现
2016/07/07 Javascript
详解vue与后端数据交互(ajax):vue-resource
2017/03/16 Javascript
Bootstrap Table实现定时刷新数据的方法
2018/08/13 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
[01:01:43]EG vs VP 2018国际邀请赛淘汰赛BO3 第二场 8.24
2018/08/25 DOTA
[51:17]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.22
2019/09/05 DOTA
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
python使用PyGame绘制图像并保存为图片文件的方法
2015/04/24 Python
浅谈MySQL中的触发器
2015/05/05 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
Python列表list操作符实例分析【标准类型操作符、切片、连接字符、列表解析、重复操作等】
2017/07/24 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python实现动态创建类的方法分析
2019/06/25 Python
Python安装OpenCV的示例代码
2020/03/05 Python
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
小程序canvas中文字设置居中锚点
2019/04/16 HTML / CSS
欧洲领先的技术商店:eibmarkt.com
2019/05/10 全球购物
商务主管岗位职责
2013/12/08 职场文书
学生喝酒检讨书
2014/02/06 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
《鲸》教学反思
2016/02/23 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
有趣的二维码:使用MyQR和qrcode来制作二维码
2021/05/10 Python
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
Redis如何实现分布式锁
2021/08/23 Redis
ICOM R71E和R72E图文对比解说
2022/04/07 无线电
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python