解析:通过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 header()函数使用说明
Jul 10 PHP
PHP一些常用的正则表达式字符的一些转换
Jul 29 PHP
php中的观察者模式
Mar 24 PHP
解析获取优酷视频真实下载地址的PHP源代码
Jun 26 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
Sep 16 PHP
php实现的用户查询类实例
Jun 18 PHP
PHP模拟QQ登录的方法
Jul 29 PHP
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
Apr 01 PHP
PHP strip_tags保留多个HTML标签的方法
May 22 PHP
Yii2框架使用计划任务的方法
May 25 PHP
laravel通过创建自定义artisan make命令来新建类文件详解
Aug 17 PHP
PDO::prepare讲解
Jan 29 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
IStream与TStream之间的相互转换
2008/08/01 PHP
php实现算术验证码功能
2018/12/05 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
JQuery 实现的页面滚动时浮动窗口控件
2009/07/10 Javascript
jQuery开发者都需要知道的5个小技巧
2010/01/08 Javascript
javascript查找字符串中出现最多的字符和次数的小例子
2013/10/29 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
2015/03/16 Javascript
Jquery中基本选择器用法实例详解
2015/05/18 Javascript
jQuery与getJson结合的用法实例
2015/08/07 Javascript
纯javascript模仿微信打飞机小游戏
2015/08/20 Javascript
轮播的简单实现方法
2016/07/28 Javascript
如何使用jquery实现文字上下滚动效果
2016/10/12 Javascript
js图片切换具体实现代码
2016/10/13 Javascript
微信小程序 input输入框详解及简单实例
2017/01/10 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
小程序实现简单语音聊天的示例代码
2020/07/24 Javascript
Vue使用鼠标在Canvas上绘制矩形
2020/12/24 Vue.js
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
使用Django Form解决表单数据无法动态刷新的两种方法
2017/07/14 Python
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
2018/05/07 Python
win10系统下python3安装及pip换源和使用教程
2020/01/06 Python
如何定义TensorFlow输入节点
2020/01/23 Python
培训心得体会
2013/12/29 职场文书
中医专业职业生涯规划书范文
2014/01/04 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
办公室主任职责范本
2014/03/07 职场文书
电气工程自动化求职信
2014/03/14 职场文书
房展策划方案
2014/06/07 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android