解析:通过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发送邮件类代码附详细说明
Jul 10 PHP
PHP的可变变量名的使用方法分享
Feb 05 PHP
php判断ip黑名单程序代码实例
Feb 24 PHP
PHP实现采集抓取淘宝网单个商品信息
Jan 08 PHP
PHP图像处理类库及演示分享
May 17 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
php代码检查代理ip的有效性
Aug 19 PHP
PHP查看SSL证书信息的方法
Sep 22 PHP
PHP实现的简单适配器模式示例
Jun 22 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
PHP框架实现WebSocket在线聊天通讯系统
Nov 21 PHP
phpstorm激活码2020附使用详细教程
Sep 25 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 和 MYSQL
2006/10/09 PHP
php操作excel文件 基于phpexcel
2010/07/02 PHP
调试一段PHP程序时遇到的三个问题
2012/01/17 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
PHP实现的迷你漂流瓶
2015/07/29 PHP
Yii2实现同时搜索多个字段的方法
2016/08/10 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
js控住DOM实现发布微博效果
2016/08/30 Javascript
vue.js学习笔记之绑定style样式和class列表
2016/10/31 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
vue 之 css module的使用方法
2018/12/04 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
[04:21]狐狸妈带你到现场 DOTA2 TI中国区预选赛线下赛路线指引
2014/05/22 DOTA
Python简单实现enum功能的方法
2016/04/25 Python
Python教程之全局变量用法
2016/06/27 Python
分析Python中解析构建数据知识
2018/01/20 Python
Python学生信息管理系统修改版
2018/03/13 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
2018/06/13 Python
在python中实现对list求和及求积
2018/11/14 Python
python实现AES加密和解密
2019/03/27 Python
python上下文管理的使用场景实例讲解
2021/03/03 Python
基于Canvas+Vue的弹幕组件的实现
2019/07/23 HTML / CSS
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
幼儿园安全责任书范本
2014/07/24 职场文书
工伤事故赔偿协议书
2014/10/27 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
2015年维修工作总结
2015/04/25 职场文书
南极大冒险观后感
2015/06/05 职场文书
学历证明样本
2015/06/16 职场文书