zoukankan      html  css  js  c++  java
  • 通过php socket并借助telnet实现简单的聊天程序

    以下是通过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($socket,$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

  • 相关阅读:
    利用window.onerror收集js代码异常
    js 基础题复习
    正则12和\1的理解
    CodeReview 方法 规范
    前端的登陆 几种类型
    http协议相关知识
    javascript中apply、call和bind的区别 详细易懂
    http常见的状态码,400,401,403 前端看
    vue中使用file-saver 下载各类文件
    js下载文件到本地各种方法总结
  • 原文地址:https://www.cnblogs.com/xiazh/p/2745185.html
Copyright © 2011-2022 走看看