JS聊天室

<?php

error_reporting(E_ALL);

ob_implicit_flush();

$sk=new Sock(‘127.0.0.1‘,8000);

$sk->run();

class Sock{

    public $sockets;

    public $users;

    public $master;

    

    public function __construct($address, $port){

        $this->master=$this->WebSocket($address, $port);

        $this->sockets=array(‘s‘=>$this->master);

    }

    

    

    function run(){

        while(true){

            $changes=$this->sockets;

            socket_select($changes,$write=NULL,$except=NULL,NULL);

            foreach($changes as $sock){

                if($sock==$this->master){

                    $client=socket_accept($this->master);

                    //$key=uniqid();

                    $this->sockets[]=$client;

                    $this->users[]=array(

                        ‘socket‘=>$client,

                        ‘shou‘=>false

                    );

                }else{

                    $len=socket_recv($sock,$buffer,2048,0);

                    $k=$this->search($sock);

                    if($len<7){

                        $name=$this->users[$k][‘ming‘];

                        $this->close($sock);

                        $this->send2($name,$k);

                        continue;

                    }

                    if(!$this->users[$k][‘shou‘]){

                        $this->woshou($k,$buffer);

                    }else{

                        $buffer = $this->uncode($buffer);

                        $this->send($k,$buffer);

                    }

                }

            }

            

        }

        

    }

    

    function close($sock){

        $k=array_search($sock, $this->sockets);

        socket_close($sock);

        unset($this->sockets[$k]);

        unset($this->users[$k]);

        $this->e("key:$k close");

    }

    

    function search($sock){

        foreach ($this->users as $k=>$v){

            if($sock==$v[‘socket‘])

            return $k;

        }

        return false;

    }

    

    function WebSocket($address,$port){

        $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

        socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);

        socket_bind($server, $address, $port);

        socket_listen($server);

        $this->e(‘Server Started : ‘.date(‘Y-m-d H:i:s‘));

        $this->e(‘Listening on   : ‘.$address.‘ port ‘.$port);

        return $server;

    }

    

    

    function woshou($k,$buffer){

        $buf  = substr($buffer,strpos($buffer,‘Sec-WebSocket-Key:‘)+18);

        $key  = trim(substr($buf,0,strpos($buf,"\r\n")));

    

        $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true));

        

        $new_message = "HTTP/1.1 101 Switching Protocols\r\n";

        $new_message .= "Upgrade: websocket\r\n";

        $new_message .= "Sec-WebSocket-Version: 13\r\n";

        $new_message .= "Connection: Upgrade\r\n";

        $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n";

        

        socket_write($this->users[$k][‘socket‘],$new_message,strlen($new_message));

        $this->users[$k][‘shou‘]=true;

        return true;

        

    }

    

    function uncode($str){

        $mask = array(); 

        $data = ‘‘

        $msg = unpack(‘H*‘,$str); 

        $head = substr($msg[1],0,2); 

        if (hexdec($head{1}) === 8) { 

            $data = false; 

        }else if (hexdec($head{1}) === 1){ 

            $mask[] = hexdec(substr($msg[1],4,2)); 

            $mask[] = hexdec(substr($msg[1],6,2)); 

            $mask[] = hexdec(substr($msg[1],8,2)); 

            $mask[] = hexdec(substr($msg[1],10,2)); 

          

            $s = 12; 

            $e = strlen($msg[1])-2; 

            $n = 0; 

            for ($i=$s; $i<= $e; $i+= 2) { 

                $data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2))); 

                $n++; 

            

        

        return $data;

    }

    

    

    function code($msg){

        $msg = preg_replace(array(‘/\r$/‘,‘/\n$/‘,‘/\r\n$/‘,), ‘‘, $msg);

        $frame = array(); 

        $frame[0] = ‘81‘

        $len = strlen($msg); 

        $frame[1] = $len<16?‘0‘.dechex($len):dechex($len); 

        $frame[2] = $this->ord_hex($msg); 

        $data = implode(‘‘,$frame); 

        return pack("H*", $data); 

    }

    

    function ord_hex($data)  { 

        $msg = ‘‘

        $l = strlen($data); 

        for ($i= 0; $i<$l; $i++) { 

            $msg .= dechex(ord($data{$i})); 

        

        return $msg

    }

    

    function send($k,$msg){

        /*$this->send1($k,$this->code($msg),‘all‘);*/

        parse_str($msg,$g);

        $this->e($msg);

        $ar=array();

        if($g[‘type‘]==‘add‘){

            $this->users[$k][‘ming‘]=$g[‘ming‘];

            $ar[‘add‘]=true;

            $ar[‘nrong‘]=‘欢迎‘.$g[‘ming‘].‘加入!‘;

            $ar[‘users‘]=$this->getusers();

            $key=‘all‘;

        }else if($g[‘type‘]==‘ltiao‘){

            $ar[‘nrong‘]=$g[‘nr‘];

            $key=$g[‘key‘];

        }

        $msg=json_encode($ar);

        $this->e($msg);

        $msg = $this->code($msg);

        $this->send1($k,$msg,$key);

        //socket_write($this->users[$k][‘socket‘],$msg,strlen($msg));

    }

    

    function getusers(){

        $ar=array();

        foreach($this->users as $k=>$v){

            $ar[$k]=$v[‘ming‘];

        }

        return $ar;

    }

    

    function send1($k,$str,$key=‘all‘){

        if($key==‘all‘){

            foreach($this->users as $v){

                socket_write($v[‘socket‘],$str,strlen($str));

            }

        }else{

            if($k!=$key)

            socket_write($this->users[$k][‘socket‘],$str,strlen($str));

            socket_write($this->users[$key][‘socket‘],$str,strlen($str));

        }

    }

    

    function send2($ming,$k){

        $ar[‘remove‘]=true;

        $ar[‘removekey‘]=$k;

        $ar[‘nrong‘]=$ming.‘退出聊天室‘;

        $str = $this->code(json_encode($ar));

        $this->send1(false,$str,‘all‘);

    }

    

    function e($str){

        $path=dirname(__FILE__).‘/log.txt‘;

        $str=$str."\n";

        error_log($str,3,$path);

        echo iconv(‘utf-8‘,‘gbk//IGNORE‘,$str);

    }

}

?>

时间: 2024-11-14 18:43:19

JS聊天室的相关文章

使用Angular和Nodejs搭建聊天室

一,利用Node搭建静态服务器 这个是这个项目的底层支撑部分.用来支持静态资源文件像html, css, gif, jpg, png, javascript, json, plain text等等静态资源的访问.这里面是有一个mime类型的文件映射. mime.js /** * mime类型的 map * @ author Cheng Liufeng * @ date 2014/8/30 * 当请求静态服务器文件的类型 html, css, gif, jpg, png, javascript,

玩转Node.js(四)-搭建简单的聊天室

玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一些个教程使用它来搭建一个超级简单的聊天室. 初始化项目 在电脑里新建一个文件夹,叫做“chatroom”,然后使用npm进行初始化: $ npm init 然后根据提示以及相关信息一步一步输入,当然也可以一路回车下去,之后会在项目里生成一个package.json文件,里面的信息如下: 1 $ ca

《基于Node.js实现简易聊天室系列之总结》

前前后后完成这个聊天室的Demo花了大概一个星期,当然一个星期是仅仅指编码的工作.前期的知识储备是从0到1从无到有,花费了一定的时间熟悉Node.js的基本语法以及Node.js和mongoDB之间的交互的过程.Demo中的重难点是socket.io的运行机制,从将socket.io绑定到服务器server上,到服务器和客户端双方都利用emit和on方法进行自定事件的处理.下面分别着重就上述几点进行讲解. Node.js Node.js创建服务器以及执行类似后台语言的操作.最近,也在接触C#,在

《基于Node.js实现简易聊天室系列之详细设计》

一个完整的项目基本分为三个部分:前端.后台和数据库.依照软件工程的理论知识,应该依次按照以下几个步骤:需求分析.概要设计.详细设计.编码.测试等.由于缺乏相关知识的储备,导致这个Demo系列的文章层次不是很清楚,索性这一章将所有的过程(前后端以及数据库)做一个介绍,下一章写完总结就OK了吧. (1)前端部分 涉及到的技术:html.css.bootstrap.jquery.jquery UI 登录/注册界面使用的是bootstrap响应式布局,即支持不同尺寸的客户端,以此提高用户的体验.在这之前

使用node.js + socket.io + redis实现基本的聊天室场景

在这篇文章Redis数据库及其基本操作中介绍了Redis及redis-cli的基本操作. 其中的publish-subscribe机制应用比较广泛, 那么接下来使用nodejs来实现该机制. 本文是对之前的一篇文章使用socket.io+redis来实现基本的聊天室应用场景的详细补充. 关于redis的详细情况, 请参考Redis数据库及其基本操作. 对于redis的前提是redis-server一直在运行, 这里就使用默认的localhost:6379. node.js连接redis-serv

html5 websocket + node.js 实现网页聊天室

1 client:    socket.io server:   node.js +  express  + socket.io 一个简单的聊天室  demo,没有注册,内置了一些测试用户 2 client 关键代码 var socket = io.connect('http://localhost:8080'); socket.on('connect',function(){ console.log('connected to server'); socket.on('login succes

Node.js websocket 使用 socket.io库实现实时聊天室

认识websocket WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duple).一开始的握手需要借助HTTP请求完成. 其实websocket 并不是很依赖Http协议,它也拥有自己的一套协议机制,但在这里我们需要利用的socket.io 需要依赖到http . 之前用java jsp写过一个聊天,其实实现逻辑并不难,只是大部分时间都用在UI的设计上,其实现原理就是一个基于websocket的通信,要想做一个好的聊天室,我觉得大部

基于Node.js + Web Socket 简易聊天室

本文案例环境为mac系统,你需要先安装nodejs,方法比较简单,直接去nodejs官网下载即可. 环境: mime 首先通过npm进行安装 在我们的项目文件夹下打开命令行(tip: 按住Shift同时右击,可以在右键菜单中找到'从此处打开命令行'选项) 在命令行中输入 npm install mime --save 回车进行安装 然后在chat.js中通过require('mime')将其引入到项目中进行使用 mime是node.js中管理路由响应请求的模块,根据请求的URL返回相应的HTML

node.js学习笔记之简洁聊天室

近来刚开始学node.js,基础,深入,express,koa,react,keystone,mongress,等等各种各样的关于Node.js的东西,每个都学的迷迷糊糊的,原因在于没有练习,感觉学的每一个知识点就像一块拼图,最终却没有拼到一起,于是就想多写几个小项目练练手,于是,就有了本文... ----------------------------------我是分割线----------------------------------------------- 恩,就按我写代码的顺序来记

Node.js+socket.io在线聊天室

Node.js+socket.io实现在线聊天室,照着这个教程做的,稍加改动即可实现. Node.js:0.10.31 Express:3.* 创建工程chat: 添加几个文件,工程结构如下 代码: package.json: { "name": "application-name", "version": "0.0.1", "private": true, "scripts": { &