nkliming的专栏

We always have too much fears and worries,it's time to say no to all of these!

php使用socket感悟--tcp和udp

下面几段代码测试了很长时间才整理出来,一方面是我对tcp和udp的认识还不够,另一方面不得不吐槽一下,

网上的参考资料为什么就没有一个把tcp和udp在php下使用的代码段和重要区别总结一下的呢?

1、对于udp,使用socket_recvfrom和socket_sendto,

因为无状态,不需要socket_connect和socket_listen,创建时使用SOCK_DGRAM和SOL_UDP两个参数

<?php
error_reporting(E_ALL | E_STRICT);

$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '127.0.0.1', 10010);

$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 2048, 0, $from, $port);

echo "Received $buf from remote address $from and remote port $port" . PHP_EOL;
?>


<?php
    $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);

    $msg = "Ping !";
    $len = strlen($msg);

    socket_sendto($sock, $msg, $len, 0, '127.0.0.1', 10010);
    socket_close($sock);
?>
2、对于tcp,使用socket_read和socket_write,因为有状态,
需要socket_connect和socket_listen,创建时使用SOCK_STREAM和SOL_TCP两个参数,
还可以设置阻塞模式socket_set_block
<?php  
/** 
 * File name:client.php 
 * 客户端代码 
 *  
 * @author guisu.huang 
 * @since 2012-04-11 
 */  
set_time_limit(0);  
  
$host = "127.0.0.1";  
$port = 10010;  
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create  socket\n"); // 创建一个Socket  
   
$connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");    //  连接  
socket_write($socket, "hello socket") or die("Write failed\n"); // 数据传送 向服务器发送消息  
while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {  
    echo("Response was:" . $buff . "\n");  
}  
socket_close($socket);  
?>


<?php  
/** 
 * File name server.php 
 * 服务器端代码 
 *  
 * @author guisu.huang 
 * @since 2012-04-11 
 *  
 */  
  
//确保在连接客户端时不会超时  
set_time_limit(0);  
//设置IP和端口号  
$address = "127.0.0.1";  
$port = 10010; //调试的时候,可以多换端口来测试程序!  
/** 
 * 创建一个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() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
//阻塞模式  
socket_set_block($sock) or die("socket_set_block() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
//绑定到socket端口  
$result = socket_bind($sock, $address, $port) or die("socket_bind() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
//开始监听  
$result = socket_listen($sock, 4) or die("socket_listen() 失败的原因是:" . socket_strerror(socket_last_error()) . "/n");  
echo "OK\nBinding the socket on $address:$port ... ";  
echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";  
do { // never stop the daemon  
    //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息  
    $msgsock = socket_accept($sock) or  die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");  
      
    //读取客户端数据  
    echo "Read client data \n";  
    //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.  
    $buf = socket_read($msgsock, 8192);  
    echo "Received msg: $buf   \n";  
      
    //数据传送 向客户端写入返回结果  
    $msg = "welcome \n";  
    socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");  
    //一旦输出被返回到客户端,父/子socket都应通过socket_close($msgsock)函数来终止  
    socket_close($msgsock);  
} while (true);  
socket_close($sock);  
?>

3、运行这样的脚本时,需要特别注意最好不要在浏览器上,因为有30s限制,
直接在命令行下用php指令运行脚本,参数为php文件名,提前是已经配置php环境变量,
否则找到php目录下的php.exe,然后在命令行下调用php.exe,执行php脚本文件。


ps:最后给一张截图:

阅读更多
文章标签: php socket udp tcp
想对作者说点什么? 我来说一句

linux c语言和php通信代码UDP

2010年11月15日 2KB 下载

没有更多推荐了,返回首页

不良信息举报

php使用socket感悟--tcp和udp

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭