解析:通过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的varchar字段的长度范围
Jun 24 PHP
php实现快速排序法函数代码
Aug 27 PHP
PHP5.5和之前的版本empty函数的不同之处
Jun 13 PHP
Linux下PHP安装mcrypt扩展模块笔记
Sep 10 PHP
php图片的二进制转换实现方法
Dec 15 PHP
thinkPHP下ueditor的使用方法详解
Dec 26 PHP
php递归函数怎么用才有效
Feb 24 PHP
php 策略模式原理与应用深入理解
Sep 25 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
Dec 20 PHP
PHP pthreads v3下同步处理synchronized用法示例
Feb 21 PHP
PHP编程一定要改掉的5个不良习惯
Sep 18 PHP
PHP中的异常处理机制深入讲解
Nov 10 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
Zerg建筑一览
2020/03/14 星际争霸
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
JavaScript将数组转换成CSV格式的方法
2015/03/19 Javascript
js获取对象、数组的实际长度,元素实际个数的实现代码
2016/06/08 Javascript
JavaScript实现经典排序算法之选择排序
2016/12/28 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
JavaScript+CSS相册特效实例代码
2017/09/07 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
Jquery获取radio选中值实例总结
2019/01/17 jQuery
Python实现类继承实例
2014/07/04 Python
python实现批量监控网站
2016/09/09 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
实例讲解Python 迭代器与生成器
2020/07/08 Python
Python reques接口测试框架实现代码
2020/07/28 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
员工晚婚的请假条
2014/02/08 职场文书
食品安全承诺书范文
2014/08/29 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
思想工作总结范文
2015/08/12 职场文书
初中体育课教学反思
2016/02/16 职场文书
《中彩那天》教学反思
2016/02/24 职场文书
初中语文教学反思范文
2016/03/03 职场文书
创业计划书之蛋糕店
2019/08/29 职场文书
详解MySQL主从复制及读写分离
2021/05/07 MySQL