• 售前

  • 售后

热门帖子
入门百科

PHP编程实现的TCP服务端和客户端功能示例

[复制链接]
自在山高 显示全部楼层 发表于 2021-10-25 19:49:43 |阅读模式 打印 上一主题 下一主题
本文实例讲述了PHP编程实现的TCP服务端和客户端功能。分享给各人供各人参考,具体如下:
1、修改php.ini,打开extension=php_sockets.dll
2、服务端程序SocketServer.php
  1. <?php
  2. //确保在连接客户端时不会超时
  3. set_time_limit(0);
  4. //设置IP和端口号
  5. $address = "127.0.0.1";
  6. $port = 3046;
  7. /**
  8. * 创建一个SOCKET
  9. * AF_INET=是ipv4 如果用ipv6,则参数为 AF_INET6
  10. * SOCK_STREAM为socket的tcp类型,如果是UDP则使用SOCK_DGRAM
  11. */
  12. $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() fail:" . socket_strerror(socket_last_error()) . "/n");
  13. //阻塞模式
  14. socket_set_block($sock) or die("socket_set_block() fail:" . socket_strerror(socket_last_error()) . "/n");
  15. //绑定到socket端口
  16. $result = socket_bind($sock, $address, $port) or die("socket_bind() fail:" . socket_strerror(socket_last_error()) . "/n");
  17. //开始监听
  18. $result = socket_listen($sock, 4) or die("socket_listen() fail:" . socket_strerror(socket_last_error()) . "/n");
  19. echo "OK\nBinding the socket on $address:$port ... ";
  20. echo "OK\nNow ready to accept connections.\nListening on the socket ... \n";
  21. do { // never stop the daemon
  22.   //它接收连接请求并调用一个子连接Socket来处理客户端和服务器间的信息
  23.   $msgsock = socket_accept($sock) or die("socket_accept() failed: reason: " . socket_strerror(socket_last_error()) . "/n");
  24.   while(1){
  25.     //读取客户端数据
  26.     echo "Read client data \n";
  27.     //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
  28.     $buf = socket_read($msgsock, 8192);
  29.     echo "Received msg: $buf  \n";
  30.     if($buf == "bye"){
  31.       //接收到结束消息,关闭连接,等待下一个连接
  32.       socket_close($msgsock);
  33.       continue;
  34.     }
  35.     //数据传送 向客户端写入返回结果
  36.     $msg = "welcome \n";
  37.     socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");
  38.   }
  39. } while (true);
  40. socket_close($sock);
  41. ?>
复制代码
3、客户端程序SocketClient.php
  1. <?php
  2. set_time_limit(0);
  3. $host = "127.0.0.1";
  4. $port = 3046;
  5. $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socket\n");
  6. $connection = socket_connect($socket, $host, $port) or die("Could not connet server\n");
  7. socket_write($socket, "hello socket") or die("Write failed\n");
  8. while ($buff = socket_read($socket, 1024, PHP_NORMAL_READ)) {
  9.   echo("Response was:" . $buff . "\n");
  10.   echo("input what you want to say to the server:\n");
  11.   $text = fgets(STDIN);
  12.   socket_write($socket, $text);
  13. }
  14. socket_close($socket);
  15. ?>
复制代码
4、测试
运行服务端程序:C:\wamp\bin\php\php5.4.16\php.exe C:\wamp\www\SocketServer.php
运行客户端程序: C:\wamp\bin\php\php5.4.16\php.exe C:\wamp\www\SocketClient.php
如果碰到
Fatal error: Call to undefined function socket_create()。
1. 找到php.ini,看
  1. extension=php_gd2.dll
复制代码
  和
  1. extension=php_sockets.dll
复制代码
扩展是否打开;
2. 看
  1. phpInfo()
复制代码
显示的内容里,socket模块是否为enable;
我检查了一下,发现都是符合的。但错误仍旧出现?怎么回事呢?
后来我才发现,原来是我在
  1. phpInfo()
复制代码
里看到的和在cmd窗口里利用的php不是同一个东西。
缘故原由是我多次安装过php. 先前的php在体系的环境变量里面注册了path。以是在cmd窗口里利用的是从前的php. 而在
  1. phpInfo()
复制代码
里显示的是现在的php的设置。
解决的办法很简单了,就把体系环境变量里的path里,指向老的Php的路径改为指向正在利用的Php的路径。如许在cmd里的php和在浏览器里的php就是同一个东西了。
就是如许。
5、其流程与C语言很相似,实际上就是封装了C语言的socket
更多关于PHP干系内容感爱好的读者可查看本站专题:《php socket用法总结》、《php字符串(string)用法总结》、《PHP数学运算技巧总结》、《php面向对象程序筹划入门教程》、《PHP数组(Array)操纵技巧大全》、《PHP数据结构与算法教程》、《php程序筹划算法总结》及《PHP网络编程技巧总结》
希望本文所述对各人PHP程序筹划有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作