使用socket系列函数实现连接TCP服务

首先需要先有一个 tcp 服务,我们使用 php中的 socket 系列函数实现。

  1. <?php
  2. //创建socket套接字
  3. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  4. //设置阻塞模式
  5. socket_set_block($socket);
  6. //为套接字绑定ip和端口
  7. socket_bind($socket,'127.0.0.1',3046);
  8. //监听socket
  9. socket_listen($socket,4);
  10. while(true)
  11. {
  12. //接收客户端请求
  13. if(($msgsocket = socket_accept($socket)) !== false)
  14. {
  15. //读取请求内容
  16. $buf = socket_read($msgsocket, 8192);
  17. echo "Received msg: $buf \n";
  18. $str = "this is a service message";
  19. //向连接的客户端发送数据
  20. socket_write($msgsocket, $str,strlen($str));
  21. //操作完之后需要关闭该连接否则 feof() 函数无法正确识别打开的句柄是否读取完成
  22. socket_close($msgsocket);
  23. }
  24. }

连接 tcp 服务:

使用 socket 系列函数连接

  1. <?php
  2. $st="socket send message";
  3. $length = strlen($st);
  4. //创建tcp套接字
  5. $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
  6. //连接tcp
  7. socket_connect($socket, '127.0.0.1',3046);
  8. //向打开的套集字写入数据(发送数据)
  9. $s = socket_write($socket, $st, $length);
  10. //从套接字中获取服务器发送来的数据
  11. $msg = socket_read($socket,8190);
  12. echo $msg;
  13. //关闭连接
  14. socket_close($socket);

使用socket系列函数实现连接TCP服务

使用 fsockopen 连接

  1. <?php
  2. //使用 fsockopen 打开tcp连接句柄
  3. $fp = fsockopen("tcp://127.0.0.1",3046);
  4. $msg = "fsockopen send message";
  5. //向句柄中写入数据
  6. fwrite($fp,$msg);
  7. $ret = "";
  8. //循环遍历获取句柄中的数据,其中 feof() 判断文件指针是否指到文件末尾
  9. while (!feof($fp)){
  10. stream_set_timeout($fp, 2);
  11. $ret .= fgets($fp, 128);
  12. }
  13. //关闭句柄
  14. fclose($fp);
  15. echo $ret;

使用socket系列函数实现连接TCP服务

使用 stream_socket_client 连接

  1. <?php
  2. //使用 stream_socket_client 打开 tcp 连接
  3. $fp = stream_socket_client("tcp://127.0.0.1:3046");
  4. $msg = "fsockopen send message";
  5. //向句柄中写入数据
  6. fwrite($fp,$msg);
  7. $ret = "";
  8. //循环遍历获取句柄中的数据,其中 feof() 判断文件指针是否指到文件末尾
  9. while (!feof($fp)){
  10. stream_set_timeout($fp, 2);
  11. $ret .= fgets($fp, 128);
  12. }
  13. //关闭句柄
  14. fclose($fp);
  15. echo $ret;

使用socket系列函数实现连接TCP服务