解析:通过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 动态多文件上传
Jan 18 PHP
PHP循环语句笔记(foreach,list)
Nov 29 PHP
PHP常用技巧总结(附函数代码)
Feb 04 PHP
PHP用strstr()函数阻止垃圾评论(通过判断a标记)
Sep 28 PHP
使用淘宝IP库获取用户ip地理位置
Oct 27 PHP
PHP连接SQLServer2005方法及代码
Dec 26 PHP
php计算两个文件相对路径的方法
Mar 14 PHP
Zend Framework教程之MVC框架的Controller用法分析
Mar 07 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
PHP使用Curl实现模拟登录及抓取数据功能示例
Apr 27 PHP
因str_replace导致的注入问题总结
Aug 08 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 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简单复制文件的方法
2016/05/09 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
jQuery中inArray方法注意事项分析
2016/01/25 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
详解vuejs几种不同组件(页面)间传值的方式
2017/06/01 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
微信小程序调用摄像头隐藏式拍照功能
2018/08/22 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
用Python代码来解图片迷宫的方法整理
2015/04/02 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
Django如何防止定时任务并发浅析
2019/05/14 Python
Python 词典(Dict) 加载与保存示例
2019/12/06 Python
Python socket聊天脚本代码实例
2020/01/02 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
2020/04/29 Python
详解python UDP 编程
2020/08/24 Python
python zip()函数的使用示例
2020/09/23 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
基于 HTML5 Canvas实现 的交互式地铁线路图
2018/03/05 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
银行财务部实习生的自我鉴定
2013/11/27 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
中学生旷课检讨书2篇
2014/10/09 职场文书
行风评议整改报告
2014/11/06 职场文书
2014年计生协会工作总结
2014/11/21 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
Python 数据科学 Matplotlib图库详解
2021/07/07 Python