大家好,请问在php下如何实现socket通信呢.
我现在写了一个服务器端和客户端代码,就是如果客户端连接上了,服务器端则返回一条信息.
这个代码,我在cmd模式下用php.exe client.php去运行可以收到信息,但为啥用浏览器运行client.php
就不行了呢,这两种模式下面运行php程序有啥区别吗?我就想实现能通用浏览器得到服务器返回的消息
哈,谢谢了,代码如下.顶者有重分.<?php
error_reporting(E_ALL);/* Allow the script to hang around waiting for connections. */
set_time_limit(0);/* Turn on implicit output flushing so we see what we're getting
* as it comes in. */
ob_implicit_flush();$address = '127.0.0.1';
$port = 10000;if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
    echo "socket_create() failed: reason: " . socket_strerror($sock) . "\n";
}if (($ret = socket_bind($sock, $address, $port)) < 0) {
    echo "socket_bind() failed: reason: " . socket_strerror($ret) . "\n";
}if (($ret = socket_listen($sock, 5)) < 0) {
    echo "socket_listen() failed: reason: " . socket_strerror($ret) . "\n";
} while (true) {
    if (($msgsock = socket_accept($sock)) < 0) {
        echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";
        break;
    }
    /* Send instructions. */
    $msg = "\nWelcome to the PHP Test Server. \n" .
        "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
    socket_write($msgsock, $msg, strlen($msg));    while (true) {
        if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
            echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";
            break 2;
        }
        if (!$buf = trim($buf)) {
            continue;
        }
        if ($buf == 'quit') {
            break;
        }
        if ($buf == 'shutdown') {
            socket_close($msgsock);
            break 2;
        }
        $talkback = "PHP: You said '$buf'.\n";
        socket_write($msgsock, $talkback, strlen($talkback));
        echo "$buf\n";
    } 
    socket_close($msgsock);
}
socket_close($sock);
?> client.php<?php
error_reporting(E_ALL);//echo "<h2>TCP/IP Connection</h2>\n";/* Create a TCP/IP socket. */
$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";
}$result = socket_connect($socket, "127.0.0.1", 10000);
if ($result < 0) {
    echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
} else {
    echo "OK.\n";
}while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
    echo $out;
}
echo "Closing socket...";
socket_close($socket);
echo "OK.\n\n";
?>  

解决方案 »

  1.   

    区别在于浏览器运行的话页面不能关掉,不然程序会中断。
    解决办法:
    在程序前加上ignore_user_abort(true);
    确保你的程序里没有任何内容输出到页面。所有函数禁止报错。例如socket_strerror($ret);改为@socket_strerror($ret);
      

  2.   


    if (!$buf = trim($buf)) {
                continue;
            }这个判断有点看不明白
      

  3.   

    server.php我用的cmd运行的.再用cmd运行client.php是能收到welcome....这些服务器返回的信息的,
    可是一把client.php换到浏览器运行,就不行了,浏览器下面运行不走,就是滚动条一点一点的,像打不开网页
    似的.最后也出来不了.也没有提示信息. 大哥有没有php的环境,能否就上面的代码帮小弟测试一下,不胜感激.因为最后的应用可能是C++做的服务器端,我这边用php去服务器端取数据.谢谢了.
      

  4.   

    你说的情况是socket函数被拥塞了。如果一点输出都没有,那很可能是在socket_create就拥塞了。你确定你iis的用户有权限创建socket吗?直接用cmd运行时,程序的权限是管理员。在网页时,权限用的是iis的运行用户。
    检查一下权限吧。
      

  5.   

    我用的是xampp运行php的,没有用IIS啊.还咋个检查呢?
      

  6.   

    你这程序我测试过了。可以运行的,不会没显示。
    客户端访问时,server 37行报错,然后中断了。
    客户端显示的结果:
    OK. OK. 
    Warning: socket_read() [function.socket-read]: unable to read from socket [0]: 操作成功完成。 in D:\newmod\test\t2.php on line 21
    Closing socket...OK.也就是连上了服务端,然后连接被服务端中断了。
      

  7.   

    apache权限设成什么呢?我看了,都是
    ServerAdmin admin@localhost呀.
    很感谢你这样回复哈,最关键一条,麻烦你帮我copy以上代码在你机子上看能运行不?就最关键了哈.实在搞不清咋回事
    查也查不到,都搞2天了.没想明白.
      

  8.   

    其中,你的socket_strerror用法错误。socket_strerror的参数是错误号,而不是socket。正确写法:
    socket_strerror(socket_last_error());
      

  9.   

    <?php
    error_reporting(E_ALL);ob_start();
    //echo "<h2>TCP/IP Connection</h2>\n";
    echo "<pre>";
    /* Create a TCP/IP socket. */
    $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";
    }
    ob_flush();
    flush();$result = socket_connect($socket, "127.0.0.1", 10000);
    if ($result < 0) {
        echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";
    } else {
        echo "OK.\n";
    }
    ob_flush();
    flush();while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
        echo $out;
        ob_flush();
        flush();
    }
    echo "Closing socket...";
    socket_close($socket);
    echo "OK.\n\n";
    ?>试试你就知道什么事了
      

  10.   

    大哥,还是不行呢.郁闷了,不知道为啥,单独用一个客户端代码去请求163.com 80,并请求一些服务器信息,都能很快正确返回,
    可是为啥请求本机的就得不到回复呢.楼上大哥,代码你测试了的嘛?麻烦大家了.解决问题了分再加100哈.
      

  11.   

    $msg = "\nWelcome to the PHP Test Server. \n" .
            "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";把服务端最前面的\n去掉即可。$msg = "Welcome to the PHP Test Server. \n" .
            "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
      

  12.   

    无限循环不会返回:
    while ($out = socket_read($socket, 2048, PHP_NORMAL_READ)) {
        echo $out;
    }
      

  13.   

    soket_read 要求无论是服务器还是客户端发过来的一句 要以 \r\n 结尾,,否则会认为服务器端发送未结束,因此进入死循环,所以再每条soket_write 都要加上\r\n