php语言实现tcpip协议

来源:互联网 发布:凯云水利软件 编辑:程序博客网 时间:2024/06/06 04:17

PHP主要是实现http协议的,最近我和我同学在做一个网络的项目需要用到底层的tcp协议和http协议两种协议,php自然是实现http协议的良好语言,但是它也可以不怎么完美的实现tcp协议,所以最终使用php作为我们的工具。

首先我找到了两个描写使用php语言来实现tcp协议的代码:

代码地址:

http://www.hdj.me/php-listen-as-socket-server     

这段代码很有启发意味,

1)如果你运行的话会发现,他使用了php的stdin,这个很难用,即使会使用了,也会发现server和client的界面都是死在那里的,因为php是解释性语言,代码里有个while(true)自然无法跳出,所以代码有点错误。

2) 由于网口的port只能被绑定一次,所以页面刷新的话会出现warning。

我更改的代码如下:(代码基本上没有变)

server部分:

[php] view plain copy
  1. <?php  
  2.    
  3. // Server  
  4. // 设置错误处理  
  5. error_reporting(E_ALL);  
  6. // 设置运行时间  
  7. set_time_limit(0);  
  8. // 起用缓冲  
  9. ob_implicit_flush();  
  10. $ip = "127.0.0.1"// IP地址  
  11. $port = 4443; // 端口号  
  12.    
  13. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET  
  14. if ($socket)  
  15.     echo "socket_create() successed!\n";  
  16. else  
  17.     echo "socket_create() failed:".socket_strerror($socket)."\n";  
  18.    
  19. $bind = socket_bind($socket$ip$port); // 绑定一个SOCKET  
  20. if ($bind)  
  21.     echo "socket_bind() successed!\n";  
  22. else  
  23.     echo "socket_bind() failed:".socket_strerror($bind)."\n";  
  24.    
  25. $listen = socket_listen($socket); // 间听SOCKET  
  26. if ($listen)  
  27.     echo "socket_listen() successed!\n";  
  28. else  
  29.     echo "socket_listen() failed:".socket_strerror($listen)."\n";  
  30. exit();   
  31. while (true) {  
  32.     $msg = socket_accept($socket); // 接受一个SOCKET  
  33.     if (!$msg) {  
  34.         echo "socket_accept() failed:".socket_strerror($msg)."\n";  
  35.         break;  
  36.     }  
  37.     $welcome = "Welcome to PHP Server!\n";  
  38.     socket_write($msg$welcomestrlen($welcome));  
  39.     while (true) {  
  40.         $command = strtoupper(trim(socket_read($msg, 1024)));  
  41.         if (!$command)  
  42.             break;  
  43.         switch ($command) {  
  44.             case "HELLO":  
  45.                 $writer = "Hello Everybody!";  
  46.                 break;  
  47.             case "QUIT":  
  48.                 $writer = "Bye-Bye";  
  49.                 break;  
  50.             case "HELP":  
  51.                 $writer = "HELLO\tQUIT\tHELP";  
  52.                 break;  
  53.             default:  
  54.                 $writer = "Error Command!";  
  55.         }  
  56.         socket_write($msg$writerstrlen($writer));  
  57.         if ($command == "QUIT")  
  58.             break;  
  59.     }  
  60.     socket_close($msg);  
  61. }  
  62. socket_close($socket); // 关闭SOCKET  
  63. ?>  

client部分:

[php] view plain copy
  1. <?php  
  2.    
  3. // Client  
  4. // 设置错误处理  
  5. error_reporting(E_ALL);  
  6. // 设置处理时间  
  7. set_time_limit(0);  
  8.    
  9. $ip = "127.0.0.1"// IP 地址  
  10. $port = 4443; // 端口号  
  11. echo "hello";  
  12. //exit();  
  13. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKET  
  14. if ($socket)  
  15.     echo "socket_create() successed!\n";  
  16. else  
  17.     echo "socket_create() failed:".socket_strerror($socket)."\n";  
  18.   
  19. $conn = socket_connect($socket$ip$port); // 建立SOCKET的连接  
  20. if ($conn)  
  21.     echo "Success to connection![".$ip.":".$port."]\n";  
  22. else  
  23.     echo "socket_connect() failed:".socket_strerror($conn)."\n";  
  24. //exit();    
  25. echo socket_read($socket, 1024);  
  26. //exit();   
  27. //$stdin = fopen('php://stdin', 'r');  
  28. echo "tt";  
  29. //exit();  
  30. //while (true) {  
  31.     $command = 'HELLO';  
  32.     socket_write($socket$commandstrlen($command));  
  33.     $msg = trim(socket_read($socket, 1024));  
  34.     echo $msg."\n";  
  35.     if ($msg == "Bye-Bye"){  
  36.         echo "byebye\n";  
  37.         break;  
  38.     }  
  39. //}  
  40. //fclose($stdin);  
  41. socket_close($socket);  
  42. ?>  

代码运行的时候,server端依然是没有任何反映,但是client端运行会出反映。(你总不能把server的while(true)去掉吧?)

转自:php语言实现tcpip协议


------------------------华丽分割线,为避免上文提到参考文章失效,特备份如下-------------------

PHP做端口监听

服务器

<?php // Server// 设置错误处理error_reporting(E_ALL);// 设置运行时间set_time_limit(0);// 起用缓冲ob_implicit_flush();$ip = "127.0.0.1"; // IP地址$port = 1000; // 端口号 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKETif ($socket)    echo "socket_create() successed!\n";else    echo "socket_create() failed:".socket_strerror($socket)."\n"; $bind = socket_bind($socket, $ip, $port); // 绑定一个SOCKETif ($bind)    echo "socket_bind() successed!\n";else    echo "socket_bind() failed:".socket_strerror($bind)."\n"; $listen = socket_listen($socket); // 间听SOCKETif ($listen)    echo "socket_listen() successed!\n";else    echo "socket_listen() failed:".socket_strerror($listen)."\n"; while (true) {    $msg = socket_accept($socket); // 接受一个SOCKET    if (!$msg) {        echo "socket_accept() failed:".socket_strerror($msg)."\n";        break;    }    $welcome = "Welcome to PHP Server!\n";    socket_write($msg, $welcome, strlen($welcome));    while (true) {        $command = strtoupper(trim(socket_read($msg, 1024)));        if (!$command)            break;        switch ($command) {            case "HELLO":                $writer = "Hello Everybody!";                break;            case "QUIT":                $writer = "Bye-Bye";                break;            case "HELP":                $writer = "HELLO\tQUIT\tHELP";                break;            default:                $writer = "Error Command!";        }        socket_write($msg, $writer, strlen($writer));        if ($command == "QUIT")            break;    }    socket_close($msg);}socket_close($socket); // 关闭SOCKET?>

客户端

<?php // Client// 设置错误处理error_reporting(E_ALL);// 设置处理时间set_time_limit(0); $ip = "127.0.0.1"; // IP 地址$port = 1000; // 端口号 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); // 创建一个SOCKETif ($socket)    echo "socket_create() successed!\n";else    echo "socket_create() failed:".socket_strerror($socket)."\n"; $conn = socket_connect($socket, $ip, $port); // 建立SOCKET的连接if ($conn)    echo "Success to connection![".$ip.":".$port."]\n";else    echo "socket_connect() failed:".socket_strerror($conn)."\n"; echo socket_read($socket, 1024); $stdin = fopen('php://stdin', 'r');while (true) {    $command = trim(fgets($stdin, 1024));    socket_write($socket, $command, strlen($command));    $msg = trim(socket_read($socket, 1024));    echo $msg."\n";    if ($msg == "Bye-Bye")        break;}fclose($stdin);socket_close($socket);?>













原创粉丝点击