zoukankan      html  css  js  c++  java
  • php编写TCP服务端和客户端程序

    1、修改php.ini,打开extension=php_sockets.dll

    2、服务端程序SocketServer.php

    <?php    
    //确保在连接客户端时不会超时    
    set_time_limit(0);    
    //设置IP和端口号    
    $address = "127.0.0.1";    
    $port = 3046;   
    /**  
     * 创建一个SOCKET   
     * AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6  
     * SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM  
    */    
    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() fail:" . socket_strerror(socket_last_error()) . "/n");    
    //阻塞模式    
    socket_set_block($sock) or die("socket_set_block() fail:" . socket_strerror(socket_last_error()) . "/n");    
    //绑定到socket端口    
    $result = socket_bind($sock, $address, $port) or die("socket_bind() fail:" . socket_strerror(socket_last_error()) . "/n");    
    //开始监听    
    $result = socket_listen($sock, 4) or die("socket_listen() fail:" . socket_strerror(socket_last_error()) . "/n");    
    echo "OK
    Binding the socket on $address:$port ... ";    
    echo "OK
    Now ready to accept connections.
    Listening on the socket ... 
    ";    
    do { // never stop the daemon    
        //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息    
        $msgsock = socket_accept($sock) or  die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");    
        while(1){  
            //读取客户端数据    
            echo "Read client data 
    ";    
            //socket_read函数会一直读取客户端数据,直到遇见
    ,	或者字符.PHP脚本把这写字符看做是输入的结束符.    
            $buf = socket_read($msgsock, 8192);    
            echo "Received msg: $buf   
    ";  
      
            if($buf == "bye"){  
                //接收到结束消息,关闭连接,等待下一个连接  
                socket_close($msgsock);  
                continue;  
            }  
                
            //数据传送 向客户端写入返回结果    
            $msg = "welcome 
    ";    
            socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");            
        }    
            
    } while (true);    
    socket_close($sock);    
    ?>  
    

     3、客户端程序SocketClient.php

    <?php    
    set_time_limit(0);    
        
    $host = "127.0.0.1";    
    $port = 3046;    
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create  socket
    ");    
         
    $connection = socket_connect($socket, $host, $port) or die("Could not connet server
    ");   
    socket_write($socket, "hello socket") or die("Write failed
    ");  
    while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {    
        echo("Response was:" . $buff . "
    ");  
        echo("input what you want to say to the server:
    ");  
        $text = fgets(STDIN);  
        socket_write($socket, $text);  
    }    
    socket_close($socket);  
    ?>  
    

     4、测试

          运行服务端程序:C:wampinphpphp5.4.16php.exe C:wampwwwSocketServer.php

         运行客户端程序: C:wampinphpphp5.4.16php.exe C:wampwwwSocketClient.php

    如果遇到

    Fatal error: Call to undefined function socket_create()。 
    
    1. 找到php.ini,看 extension=php_gd2.dll   和  extension=php_sockets.dll 扩展是否打开;
    
    2. 看phpInfo()显示的内容里,socket模块是否为enable;
    
    我检查了一下,发现都是符合的。但错误仍然出现?怎么回事呢?
    
    后来我才发现,原来是我在phpInfo()里看到的和在cmd窗口里使用的php不是同一个东西。
    
    原因是我多次安装过php. 先前的php在系统的环境变量里面注册了path。所以在cmd窗口里使用的是以前的php. 而在phpInfo()里显示的是现在的php的设置。
    
    解决的办法很简单了,就把系统环境变量里的path里,指向老的Php的路径改为指向正在使用的Php的路径。这样在cmd里的php和在浏览器里的php就是同一个东西了。
    
    就是这样。
    

    5、其流程与C很相似,实际上就是封装了C的socket。

    摘自:http://blog.csdn.net/anda0109/article/details/46655301

  • 相关阅读:
    发现个atan2的正确使用方式
    Forward+ Shading架构
    fatal: unable to connect to gitee.com: gitee.com[0: 180.97.125.228]: errno=Unknown error 解决方案
    HDFS HA(高可用性)集群规划
    如何使用RTP引擎对语音编码进行转码
    关于 Angular 应用 tsconfig.json 中的 target 属性
    浅谈 Orbeon form builder 的权限控制
    关于 Angular 应用 tsconfig.json 中的 lib 属性
    orbeon form 通过 url 的方式同第三方应用集成的开发明细
    orbeon form 的配置介绍
  • 原文地址:https://www.cnblogs.com/cxscode/p/7398425.html
Copyright © 2011-2022 走看看