美文网首页
第一课时:socket

第一课时:socket

作者: liamu | 来源:发表于2018-06-22 11:05 被阅读17次
    socket定义,来自百度百科

    TCP/IP协议

    TCP/IP

    socket的位置

    socket

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

    socket的使用

    socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

    SOCKET通讯模型 socket的使用

    编码实现

    • 服务器
    <?php
    // set_time_limit(0);
    $ip = '0.0.0.0';
    $port = 9090;
    /*
     +-------------------------------
     *    @socket通信整个过程
     +-------------------------------
     *    @socket_create
     *    @socket_bind
     *    @socket_listen
     *    @socket_accept
     *    @socket_read
     *    @socket_write
     *    @socket_close
     +--------------------------------
     */
    
    /*----------------    以下操作都是手册上的    -------------------*/
    if(($sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP)) < 0) {
        echo "socket_create() 失败的原因是:".socket_strerror($sock)."\n";
    }
    
    if(($ret = socket_bind($sock,$ip,$port)) < 0) {
        echo "socket_bind() 失败的原因是:".socket_strerror($ret)."\n";
    }
    
    if(($ret = socket_listen($sock,4)) < 0) {
        echo "socket_listen() 失败的原因是:".socket_strerror($ret)."\n";
    }
    
    $count = 0;
    
    do {
        if (($msgsock = socket_accept($sock)) < 0) {
            echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
            break;
        } else {        
            //发到客户端
            $msg ="测试成功!\n";
            socket_write($msgsock, $msg, strlen($msg));
            
            echo "测试成功了啊\n";
            $buf = socket_read($msgsock,8192);
                   
            $talkback = "收到的信息:$buf\n";
            echo $talkback;
            
            if(++$count >= 5){
                break;
            };
        }
        //echo $buf;
        socket_close($msgsock);
    
    } while (true);
    
    socket_close($sock);
    
    • 客户端
    <?php
    $port = 9090;
    $ip = "127.0.0.1";
    /*
     +-------------------------------
     *    @socket连接整个过程
     +-------------------------------
     *    @socket_create
     *    @socket_connect
     *    @socket_write
     *    @socket_read
     *    @socket_close
     +--------------------------------
     */
    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket < 0) {
        echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";
    }else {
        echo "OK.\n";
    }
    
    echo "试图连接 '$ip' 端口 '$port'...\n";
    $result = socket_connect($socket, $ip, $port);
    if ($result < 0) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
    }else {
        echo "连接OK\n";
    }
    
    $in = "Ho\r\n";
    $in .= "first blood\r\n";
    $out = '';
    
    if(!socket_write($socket, $in, strlen($in))) {
        echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";
    }else {
        echo "发送到服务器信息成功!\n";
        echo "发送的内容为:<font color='red'>$in</font> <br>";
    }
    
    while($out = socket_read($socket, 8192)) {
        echo "接收服务器回传信息成功!\n";
        echo "接受的内容为:",$out;
    }
    
    
    echo "关闭SOCKET...\n";
    socket_close($socket);
    echo "关闭OK\n";
    
    • 测试命令
    [root@localhost ~]# telnet 172.16.130.74 9090
    Trying 172.16.130.74...
    Connected to 172.16.130.74.
    Escape character is '^]'.
    测试成功!
    sfdf
    Connection closed by foreign host.
    
    • 这个东东我们可以直接用浏览器来访问吗

    像我这样优秀的人,竟然都有了http,为什么还要socket

    http socket
    被动 主动
    半双工 全双工
    image.png

    https://developer.mozilla.org/en-US/docs/Web/API/WebSocket

    相关文章

      网友评论

          本文标题:第一课时:socket

          本文链接:https://www.haomeiwen.com/subject/azxkyftx.html