您的位置:首页 > 编程学习 > > 正文

php获取socket连接的详细信息(php使用socket调用http和smtp协议实例小结)

更多 时间:2021-11-08 16:56:42 类别:编程学习 浏览量:1687

php获取socket连接的详细信息

php使用socket调用http和smtp协议实例小结

本文实例讲述了php使用socket调用http和smtp协议。分享给大家供大家参考,具体如下:

socket发送HTTP请求

http协议请求报文格式

get

  • ?
  • 1
  • 2
  • 3
  • ## 请求方法 请求文件路径?查询字符串 HTTP/协议版本号
  • ## Host: 主机名:端口号
  • ## Connection:close
  • post

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • ## 请求方法 请求文件路径 HTTP/协议版本号
  • ## Host: 主机名:端口号
  • ## Content-type: application/x-www-form-urlencoded
  • ## Content-length: 查询字符串长度
  • ## Connection: close
  • ## 查询字符串
  • api.php

  • ?
  • 1
  • 2
  • 3
  • <?php
  • echo $_SERVER["REQUEST_METHOD"]."<br/>";
  • print_r($_REQUEST);
  • fsocketopen发送get请求

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • <?php
  • $url = "api.php";
  • $host = "127.0.0.1";
  • $port = 8080;
  • $param = ["name"=>"zhezhao","age"=>23];
  • $url .= "?".http_build_query($param);
  • $socket = fsockopen($host,$port,$errno,$errstr,10);
  • $request = "GET /${url} HTTP/1.1\r\n";
  • $request .= "Host:${host}:{$port}\r\n";
  • $request .= "Connection:close\r\n\r\n";
  • fwrite($socket,$request);
  • echo "<b>Request:</b><br/>".str_replace("\r\n","<br/>",$request);
  • echo "<hr/><b>Response:</b><br/>";
  • $response = "";
  • while ($out = fread($socket, 2048)) {
  •  $response .= $out;
  • }
  • echo str_replace("\r\n","<br/>",$response);
  • fclose($socket);
  • sockets扩展发送post请求

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • <?php
  • $url = "api.php";
  • $host = "127.0.0.1";
  • $port = 8080;
  • $param = ["name"=>"zhezhao","age"=>23];
  • $data = http_build_query($param);
  • $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  • socket_connect($socket, $host,$port);
  • $request = "POST /${url} HTTP/1.1\r\n";
  • $request .= "Host:${host}:{$port}\r\n";
  • $request .= "Content-type:application/x-www-form-urlencoded\r\n";
  • $request .= "Content-length:".strlen($data)."\r\n";
  • $request .= "Connection:close\r\n\r\n";
  • $request .= "${data}";
  • socket_write($socket,$request);
  • echo "<b>Request:</b><br/>".str_replace("\r\n","<br/>",$request);
  • echo "<hr/><b>Response:</b><br/>";
  • $response = "";
  • while ($out = socket_read($socket, 2048)) {
  •  $response .= $out;
  • }
  • echo str_replace("\r\n","<br/>",$response);
  • socket_close($socket);
  • socket发送smtp请求

    首先通过socket连接到smtp服务器,例如smtp.163.com 25,然后实现smtp发送邮件的必须参数即可。

    HELO 主机名
    AUTH LOGIN base64编码之后的发件人邮箱
    base64编码之后的密码
    ##填写信封
    MAIL FROM:<发件人邮箱>
    RCPT TO:<收件人邮箱>
    ##填写信件内容
    DATA
    MIME-Version:1.0
    To: 收件人邮箱
    From: 发件人邮箱
    Subject: 邮件主题

    邮件内容

    fsocketopen发送邮件

    fsocketopenpfsocketopen是php机制本身的函数,可以直接调用,不需要安装扩展。以上两个函数可以打开一个网络连接或者一个Unix套接字连接,然后我们可以使用fwrite,fread,fclose,feof等函数直接操作该网络连接。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • <?php
  • $user = "root@163.com";
  • $password = "root";
  • $mailto = "1234567@qq.com";
  • $subject = "fsocketopen发送邮件";
  • $body = "收到邮件了么,亲";
  • $sock = fsockopen("smtp.163.com",25);
  • fputs($sock,"HELO localhost\r\n");
  • echo fgets($sock, 512)."<br/>";
  • fputs($sock,"AUTH LOGIN ".base64_encode($user)."\r\n");
  • echo fgets($sock, 512)."<br/>";
  • fputs($sock,base64_encode($password)."\r\n");
  • echo fgets($sock, 512)."<br/>";
  • fputs($sock,"MAIL FROM:<${user}>\r\n");
  • echo fgets($sock, 512)."<br/>";
  • fputs($sock,"RCPT TO:<${mailto}>\r\n");
  • echo fgets($sock, 512)."<br/>";
  • fputs($sock,"DATA\r\n");
  • echo fgets($sock, 512)."<br/>";
  • $header = "MIME-Version:1.0\r\n";
  • $header .= "To: ${mailto}\r\n";
  • $header .= "From: ${user}\r\n";
  • $header .= "Subject: ${subject}\r\n";
  • fputs($sock, $header . "\r\n" . $body);
  • echo fgets($sock, 512)."<br/>";
  • fputs($sock, "\r\n.\r\n");
  • echo fgets($sock, 512)."<br/>";
  • fputs($sock,"QUIT\r\n");
  • fclose($sock);
  • sockets扩展发送邮件

    sockets扩展的功能更加强大,可以搭建tcp/ip服务器,不过我们使用smtp协议发送邮件的例子,只需要使用到socket客户端的功能。

  • ?
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • <?php
  • $user = "root@163.com";
  • $password = "root";
  • $mailto = "1234567@qq.com";
  • $subject = "sockets扩展发送邮件";
  • $body = "收到邮件了么,亲";
  • $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  • socket_connect($socket, "smtp.163.com",25);
  • socket_write($socket,"HELO localhost\r\n");
  • echo socket_read($socket, 512)."<br/>";
  • socket_write($socket,"AUTH LOGIN ".base64_encode($user)."\r\n");
  • echo socket_read($socket, 512)."<br/>";
  • socket_write($socket,base64_encode($password)."\r\n");
  • echo socket_read($socket, 512)."<br/>";
  • socket_write($socket,"MAIL FROM:<${user}>\r\n");
  • echo socket_read($socket, 512)."<br/>";
  • socket_write($socket,"RCPT TO:<${mailto}>\r\n");
  • echo socket_read($socket, 512)."<br/>";
  • socket_write($socket,"DATA\r\n");
  • echo socket_read($socket, 512)."<br/>";
  • $header = "MIME-Version:1.0\r\n";
  • $header .= "To: ${mailto}\r\n";
  • $header .= "From: ${user}\r\n";
  • $header .= "Subject: ${subject}\r\n";
  • socket_write($socket, $header . "\r\n" . $body);
  • echo socket_read($socket, 512)."<br/>";
  • socket_write($socket, "\r\n.\r\n");
  • echo socket_read($socket, 512)."<br/>";
  • socket_write($socket,"QUIT\r\n");
  • fclose($sock);
  • 参考文章:

    http://www.zzvips.com/article/151234.html

    http://www.zzvips.com/article/164860.html

    希望本文所述对大家PHP程序设计有所帮助。

    原文链接:https://blog.csdn.net/koastal/article/details/53149689

    标签:HTTP smtp PHP socket
    您可能感兴趣