PHP在WIN下操作socket

简介:

TCP/UDP Socket调试工具

 

PHP在WIN下操作socket最好用命令行运行程序,一般可以用于大文件的上传

要建立一个简单的服务,如果不考虑性能方面的问题,比如并发100 左右的服务,可以简单的用 Socket + Pcntl(linux)。来实现

1.php加入环境变量,开启socket扩展

server端

Java代码   收藏代码
  1. <?php  
  2. //确保在连接客户端时不会超时  
  3. set_time_limit(0);  
  4.   
  5. $ip = '127.0.0.1';  
  6. $port = 1935;  
  7.   
  8. /* 
  9.  +------------------------------- 
  10.  *    @socket通信整个过程 
  11.  +------------------------------- 
  12.  *    @socket_create 
  13.  *    @socket_bind 
  14.  *    @socket_listen 
  15.  *    @socket_accept 
  16.  *    @socket_read 
  17.  *    @socket_write 
  18.  *    @socket_close 
  19.  +-------------------------------- 
  20.  */  
  21.   
  22. /*----------------    以下操作都是手册上的    -------------------*/  
  23. if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {  
  24.     echo "socket_create() 失败的原因是:" . socket_strerror($sock) . "\n";  
  25. }  
  26.   
  27. if (($ret = socket_bind($sock, $ip, $port)) < 0) {  
  28.     echo "socket_bind() 失败的原因是:" . socket_strerror($ret) . "\n";  
  29. }  
  30.   
  31. if (($ret = socket_listen($sock, 4)) < 0) {  
  32.     echo "socket_listen() 失败的原因是:" . socket_strerror($ret) . "\n";  
  33. }  
  34.   
  35. $count = 0;  
  36.   
  37. do {  
  38.     if (($msgsock = socket_accept($sock)) < 0) {  
  39.         echo "socket_accept() failed: reason: " . socket_strerror($msgsock) . "\n";  
  40.         break;  
  41.     } else {  
  42.         //发到客户端  
  43.         $msg = "测试成功!\n";  
  44.         socket_write($msgsock, $msg, strlen($msg));  
  45.   
  46.         echo "测试成功了啊\n";  
  47.         $buf = socket_read($msgsock, 8192);  
  48.   
  49.         $talkback = "收到的信息:$buf\n";  
  50.         echo $talkback;  
  51.   
  52.         if (++$count >= 5) {  
  53.             break;  
  54.         }  
  55.     }  
  56.     //echo $buf;  
  57.     socket_close($msgsock);  
  58.   
  59. while (true);  
  60.   
  61. socket_close($sock);  
  62. ?>  



 没有反映,对现在服务端的程序已经开始运行,端口已经开始监听了。

运行netstat -ano | find "1935"可以查看端口情况,我的是1935端口

端口已经处于LISTENING状态了。接下来我们只要运行客户端程序即可连接上。上代码

Java代码   收藏代码
  1. <?php  
  2. error_reporting(E_ALL);  
  3. set_time_limit(0);  
  4. echo "<h2>TCP/IP Connection</h2>\n";  
  5.   
  6. $port = 1935;  
  7. $ip = "127.0.0.1";  
  8.   
  9. /* 
  10.  +------------------------------- 
  11.  *    @socket连接整个过程 
  12.  +------------------------------- 
  13.  *    @socket_create 
  14.  *    @socket_connect 
  15.  *    @socket_write 
  16.  *    @socket_read 
  17.  *    @socket_close 
  18.  +-------------------------------- 
  19.  */  
  20.   
  21. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);  
  22. if ($socket < 0) {  
  23.     echo "socket_create() failed: reason: " . socket_strerror($socket) . "\n";  
  24. else {  
  25.     echo "OK.\n";  
  26. }  
  27.   
  28. echo "试图连接 '$ip' 端口 '$port'...\n";  
  29. $result = socket_connect($socket, $ip, $port);  
  30. if ($result < 0) {  
  31.     echo "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "\n";  
  32. else {  
  33.     echo "连接OK\n";  
  34. }  
  35.   
  36. $in = "Ho\r\n";  
  37. $in .= "first blood\r\n";  
  38. $out = '';  
  39.   
  40. if (!socket_write($socket, $in, strlen($in))) {  
  41.     echo "socket_write() failed: reason: " . socket_strerror($socket) . "\n";  
  42. else {  
  43.     echo "发送到服务器信息成功!\n";  
  44.     echo "发送的内容为:<font color='red'>$in</font> <br>";  
  45. }  
  46.   
  47. while ($out = socket_read($socket, 8192)) {  
  48.     echo "接收服务器回传信息成功!\n";  
  49.     echo "接受的内容为:", $out;  
  50. }  
  51.   
  52.   
  53. echo "关闭SOCKET...\n";  
  54. socket_close($socket);  
  55. echo "关闭OK\n";  
  56. ?>  


SERVER端常驻后台实现:
用了比较笨的方法,因为怕PHP常驻后台不靠谱,用crontab保证即使出了错断掉也可以重启(悲剧的是crontab最小颗粒是1分钟),然后用shell保证不会重复启动(重复启动会绑定不了端口报错)

check.sh文件 保证脚本不会重复启动

Java代码   收藏代码
  1. start()  
  2. {  
  3.     c=`ps w -C php|grep $1|wc -l`  
  4.     if [ $c -lt 1 ]  
  5.     then  
  6.       /usr/local/bin/php $1&  
  7.     fi  
  8. }  
  9. BASE_PATH=$(dirname `which $0`)  
  10. cd $BASE_PATH  
  11. start server.php  
相关文章
|
1月前
|
PHP
php的foreach神操作
php的foreach神操作
22 0
|
7月前
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql
PHP 原生操作 Mysql
81 0
|
2月前
|
监控 Unix Linux
socket监控进程,并对程序执行有关操作。
socket监控进程,并对程序执行有关操作。
|
7月前
|
关系型数据库 MySQL 数据库连接
PHP 原生操作 Mysql 增删改查案例
PHP 原生操作 Mysql 增删改查案例
87 0
|
3月前
|
SQL PHP 数据库
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
|
4月前
|
NoSQL PHP Redis
PHP 操作Redis
PHP 操作Redis
29 0
|
6月前
|
Unix PHP
PHP时间戳如何操作,以及如何拿到时间
PHP时间戳如何操作,以及如何拿到时间
|
7月前
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql 分页数据案例
PHP 原生操作 Mysql 分页数据案例
96 1
|
8月前
|
PHP
PHP 操作Redis
PHP 操作Redis
49 0
|
9月前
|
NoSQL 关系型数据库 MySQL
PHP快速入门13-MySQL数据库与Redis操作
PHP快速入门与实战,本篇文章介绍的内容,MySQL数据库与Redis操作,后续更多内容将收录在专栏PHP快速入门与实战。