穆年小菜鸟的日常随记——socket+php聊天室

socket具体是什么东西,小弟就不在这里啰嗦了,socket的概念和TCP/IP的关系网上有很多的资料,现在主要的教大家如何使用socket来完成一个简单的聊天室。

首先要想做一个聊天室方法有很都,html+ajax也可以实现一个简单的聊天室,但是要做就要做高大上的东西,(●’◡’●)。

做一个功能我们首先要了解他是如何一步一步走下来的,也就是流程。

这里写图片描述

服务器端:

1.首先创建一个socket(socket_create);

2.绑定IP和端口(socket_bind);

3.监听这个端口(socket_listen);

4.接收客户端发送过来的请求(socket_accept);

5.读取请求中的字符串(socket_recv);向客户端做出反应

6.关闭连接;

客户端

1.创建一个socket;

2.连接到指定socket的端口;

3.向socket发送信息;

4.关闭连接;

客户端运用的技术是通过websocket连接到服务器端;
下面是主要的代码片段。
服务器端主要配置

    public function __construct($host, $port, $max) {
        $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//创建一个socket
        socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, TRUE);//设置socket选项
        socket_bind($this->socket, $host, $port);//绑定IP和端口号
        socket_listen($this->socket, $max);//监听制定socket得所有连接
    }
    public function start() {
        while(true) {
            $cycle = $this->accept;
            $cycle[] = $this->socket;
            socket_select($cycle, $write, $except, null);

            foreach($cycle as $sock) {
                if($sock === $this->socket) {
                    $client = socket_accept($this->socket);//接受一个socket连接
                    $this->accept[] = $client;
                    $key = array_keys($this->accept);
                    $key = end($key);
                    $this->isHand[$key] = false;
                } else {
                    $length = socket_recv($sock, $buffer, 204800, 0);//从socket里结束到缓存
                    $key = array_search($sock, $this->accept);

                    if($length < 7) {
                        $this->close($sock);
                        continue;
                    }

                    if(!$this->isHand[$key]) {
                        $this->dohandshake($sock, $buffer, $key);
                    } else {
                        // 先解码,再编码
                        $data = $this->decode($buffer);
                        $data = $this->encode($data);

                        // 判断断开连接(断开连接时数据长度小于10)
                        if(strlen($data) > 10) {
                            foreach($this->accept as $client) {
                                socket_write($client, $data, strlen($data));//写数据到socket缓存里面
                            }
                        }
                    }
                }

            }

        }

    }
    /**
     * 解码过程
     */
    public function decode($buffer) {
        $len = $masks = $data = $decoded = null;
        $len = ord($buffer[1]) & 127;
        if ($len === 126) {
            $masks = substr($buffer, 4, 4);
            $data = substr($buffer, 8);
        }
        else if ($len === 127) {
            $masks = substr($buffer, 10, 4);
            $data = substr($buffer, 14);
        }
        else {
            $masks = substr($buffer, 2, 4);
            $data = substr($buffer, 6);
        }
        for ($index = 0; $index < strlen($data); $index++) {
            $decoded .= $data[$index] ^ $masks[$index % 4];
        }
        return $decoded;
    }

客户端的代码就不往上贴了 ,网上有很都。核心代码就那么几行
有兴趣的同学可以自己研究研究,例子仅供大家参考,有什么不足的地方希望大家多多见谅(●’◡’●)
socket服务器端代码篇地址:https://code.csdn.net/snippets/2517056
客户端代码篇地址:https://code.csdn.net/snippets/2517064

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值