解析:通过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 类相关函数的使用详解
May 10 PHP
php弹出对话框实现重定向代码
Jan 23 PHP
php实现加减法验证码代码
Feb 14 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
THINKPHP内容分页代码分享
Jan 14 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
php获取服务器操作系统相关信息的方法
Oct 08 PHP
PHP快速推送微信模板消息
Apr 14 PHP
PHP面向对象之工作单元(实例讲解)
Jun 26 PHP
Laravel中unique和exists验证规则的优化详解
Jan 28 PHP
Yii框架日志记录Logging操作示例
Jul 12 PHP
PHP使用Redis实现Session共享的实现示例
May 12 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
Win2003下APACHE+PHP5+MYSQL4+PHPMYADMIN 的简易安装配置
2006/11/18 PHP
PHP-redis中文文档介绍
2013/02/07 PHP
js ondocumentready onmouseover onclick onmouseout 样式
2010/07/22 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
javascript实现的左右无缝滚动效果
2016/09/19 Javascript
Bootstrap和Java分页实例第一篇
2016/12/23 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
js+SVG实现动态时钟效果
2018/07/14 Javascript
详解angular2.x创建项目入门指令
2018/10/11 Javascript
详解vue.js移动端配置flexible.js及注意事项
2019/04/10 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
JavaScript Array对象使用方法解析
2019/09/24 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
详解Python中的各种函数的使用
2015/05/24 Python
python实现手机通讯录搜索功能
2018/02/22 Python
Python实现获取本地及远程图片大小的方法示例
2018/07/21 Python
朴素贝叶斯Python实例及解析
2018/11/19 Python
Python从Excel中读取日期一列的方法
2018/11/28 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
英国家电直销:Appliances Direct
2016/09/22 全球购物
CPB肌肤之钥美国官网:Clé de Peau Beauté
2017/09/05 全球购物
澳大利亚最受欢迎的美发用品目的地:AMR
2019/08/28 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
用Python匹配HTML tag的时候,<.*>和<.*?>有什么区别
2012/11/04 面试题
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
新闻专业本科生的自我评价分享
2013/11/20 职场文书
大学军训感言1000字
2014/02/25 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
三十年同学聚会致辞
2015/07/28 职场文书
简短的36句中秋节祝福信息语句
2019/09/09 职场文书
python内置模块之上下文管理contextlib
2022/06/14 Python