• PHP 中使用socket


    一、开启socket

    phpinfo();查看是否开启了socket扩展,否则在php.ini中开启。

    二、服务器端代码的写法

    <?php
    error_reporting(E_ALL);
    set_time_limit(0);
    //ob_implicit_flush();
    
    $address = '127.0.0.1';
    $port = 10005;
    //创建端口
    if( ($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
    	echo "socket_create() failed :reason:" . socket_strerror(socket_last_error()) . "
    ";
    }
    
    //绑定
    if (socket_bind($sock, $address, $port) === false) {
    	echo "socket_bind() failed :reason:" . socket_strerror(socket_last_error($sock)) . "
    ";
    }
    
    //监听
    if (socket_listen($sock, 5) === false) {
    	echo "socket_bind() failed :reason:" . socket_strerror(socket_last_error($sock)) . "
    ";
    }
    
    do {
    	//得到一个链接
    	if (($msgsock = socket_accept($sock)) === false) {
    		echo "socket_accepty() failed :reason:".socket_strerror(socket_last_error($sock)) . "
    ";
    		break;
    	}
    	//welcome  发送到客户端
    	$msg = "<font color='red'>server send:welcome</font><br/>";
    	socket_write($msgsock, $msg, strlen($msg));
    	echo 'read client message
    ';
    	$buf = socket_read($msgsock, 8192);
    	$talkback = "received message:$buf
    ";
    	echo $talkback;
    	if (false === socket_write($msgsock, $talkback, strlen($talkback))) {
    		echo "socket_write() failed reason:" . socket_strerror(socket_last_error($sock)) ."
    ";
    	} else {
    		echo 'send success';
    	}
    	socket_close($msgsock);
    } while(true);
    //关闭socket
    socket_close($sock);
    
    
    ?>

    服务器端需要在cli模式是执行,有可能cli模式下php.ini文件载入的不一样

    可以像如下输出

    image

    这时候在zhoxh目录下就有个tem.text文件。查看 Configuration File (php.ini) Path => C:WINDOWS 。不是我的php.ini 文件,这说明调用的php.ini文件时错误的。这时候我们要指定php.ini文件命令如下

    image

    注意的是我的php可以直接执行时配置了环境变量。

    三、客户端

    <?php
    //error_reporting(E_ALL);
    echo "<h2>tcp/ip connection </h2>
    ";
    $service_port = 10005;
    $address = '127.0.0.1';
    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
    	echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "
    ";
    } else {
    	echo "OK. 
    ";
    }
    
    echo "Attempting to connect to '$address' on port '$service_port'...";
    $result = socket_connect($socket, $address, $service_port);
    if($result === false) {
    	echo "socket_connect() failed.
    Reason: ($result) " . socket_strerror(socket_last_error($socket)) . "
    ";
    } else {
    	echo "OK 
    ";
    }
    $in = "HEAD / http/1.1
    ";
    $in .= "HOST: localhost 
    ";
    $in .= "Connection: close
    
    ";
    $out = "";
    echo "sending http head request ...";
    socket_write($socket, $in, strlen($in));
    echo  "OK
    ";
    
    echo "Reading response:
    
    ";
    while ($out = socket_read($socket, 8192)) {
    	echo $out;
    }
    echo "closeing socket..";
    socket_close($socket);
    echo "ok .
    
    ";
     
    执行结果: 
    server:

    image


    client:

    image

  • 相关阅读:
    前沿技术解密——VirtualDOM
    Ques核心思想——CSS Namespace
    Unix Pipes to Javascript Pipes
    Road to the future——伪MVVM库Q.js
    聊聊CSS postproccessors
    【译】十款性能最佳的压缩算法
    Kafka Streams开发入门(9)
    Kafka Streams开发入门(8)
    【译】Kafka Producer Sticky Partitioner
    【译】99th Percentile Latency at Scale with Apache Kafka
  • 原文地址:https://www.cnblogs.com/mr-amazing/p/3991114.html
Copyright © 2020-2023  润新知