解析:通过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 相关文章推荐
Extended CHM PHP 语法手册之 DIY
Oct 09 PHP
加强版phplib的DB类
Mar 31 PHP
php foreach、while性能比较
Oct 15 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
Jul 08 PHP
php从完整文件路径中分离文件目录和文件名的方法
Mar 13 PHP
将PHP从5.3.28升级到5.3.29时Nginx出现502错误
May 09 PHP
php简单实现sql防注入的方法
Apr 22 PHP
PHP实现上传图片到 zimg 服务器
Oct 19 PHP
Thinkphp5.0自动生成模块及目录的方法详解
Apr 17 PHP
PHP机器学习库php-ml的简单测试和使用方法
Jul 14 PHP
phpQuery采集网页实现代码实例
Apr 02 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的cms
2010/12/19 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
使用户点击后退按钮使效三行代码
2007/07/07 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
js弹窗代码 可以指定弹出间隔
2010/07/03 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
jcrop基本参数一览
2013/07/16 Javascript
纯css+js写的一个简单的tab标签页带样式
2014/01/28 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
2014/06/09 Javascript
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
使用AngularJS创建单页应用的编程指引
2015/06/19 Javascript
JS实现选择TextArea内文本的方法
2015/08/03 Javascript
基于Jquery实现表单验证
2020/07/20 Javascript
angularjs创建弹出框实现拖动效果
2020/08/25 Javascript
使用jQuery Mobile框架开发移动端Web App的入门教程
2016/05/17 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
JS克隆,属性,数组,对象,函数实例分析
2016/11/26 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
vue axios用法教程详解
2017/07/23 Javascript
利用vue+elementUI实现部分引入组件的方法详解
2017/11/22 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
Python3 webservice接口测试代码详解
2020/06/23 Python
python中子类与父类的关系基础知识点
2021/02/02 Python
大学军训感言600字
2014/02/25 职场文书
幼儿园小班家长寄语
2014/04/02 职场文书
学校火灾防控方案
2014/06/09 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis
解决ubuntu安装软件时,status-code=409报错的问题
2022/12/24 Servers