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  
相关文章
|
7月前
|
PHP
php的foreach神操作
php的foreach神操作
44 0
|
关系型数据库 MySQL PHP
PHP 原生操作 Mysql
PHP 原生操作 Mysql
122 0
|
6月前
|
PHP
php对memcached简单的操作
php对memcached简单的操作
39 0
|
6月前
|
SQL 关系型数据库 MySQL
php mysqli操作数据库
php mysqli操作数据库
36 0
|
7月前
|
安全 关系型数据库 MySQL
【PHP开发专栏】PHP PDO与MySQLi操作数据库
【4月更文挑战第30天】PHP数据库交互的核心是PDO和MySQLi。PDO提供数据访问抽象层,支持多种数据库,强调安全和灵活性;MySQLi则专为MySQL设计,有面向对象和过程化接口。两者都支持预处理语句,防止SQL注入。选择取决于项目需求,如可移植性、特定功能和API偏好。了解其使用有助于编写安全高效的代码。
123 2
|
7月前
|
PHP 数据安全/隐私保护
【PHP开发专栏】PHP魔术方法与对象操作
【4月更文挑战第30天】PHP 魔术方法是特殊方法,如`__construct`、`__get`等,在特定时刻自动调用,用于重写默认行为。本文分三部分介绍PHP魔术方法和对象操作:1) 魔术方法包括构造、析构、属性访问等,常用于控制访问权限、自动加载等;2) 对象操作涉及创建、访问属性和方法、克隆及序列化/反序列化;3) 案例展示如何在创建对象时设置默认值。
57 1
|
关系型数据库 MySQL 数据库连接
PHP 原生操作 Mysql 增删改查案例
PHP 原生操作 Mysql 增删改查案例
138 0
|
7月前
|
SQL PHP 数据库
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
PHP案例:每一个账号登陆后的操作是隔离的(使用token进行登录)
|
7月前
|
监控 Unix Linux
socket监控进程,并对程序执行有关操作。
socket监控进程,并对程序执行有关操作。
|
7月前
|
NoSQL PHP Redis
PHP 操作Redis
PHP 操作Redis
56 0