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


Posted in PHP onApril 13, 2018

本文实例讲述了PHP编程实现的TCP服务端和客户端功能。分享给大家供大家参考,具体如下:

1、修改php.ini,打开extension=php_sockets.dll

2、服务端程序SocketServer.php

<?php
//确保在连接客户端时不会超时
set_time_limit(0);
//设置IP和端口号
$address = "127.0.0.1";
$port = 3046;
/**
 * 创建一个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() fail:" . socket_strerror(socket_last_error()) . "/n");
//阻塞模式
socket_set_block($sock) or die("socket_set_block() fail:" . socket_strerror(socket_last_error()) . "/n");
//绑定到socket端口
$result = socket_bind($sock, $address, $port) or die("socket_bind() fail:" . socket_strerror(socket_last_error()) . "/n");
//开始监听
$result = socket_listen($sock, 4) or die("socket_listen() fail:" . 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");
  while(1){
    //读取客户端数据
    echo "Read client data \n";
    //socket_read函数会一直读取客户端数据,直到遇见\n,\t或者\0字符.PHP脚本把这写字符看做是输入的结束符.
    $buf = socket_read($msgsock, 8192);
    echo "Received msg: $buf  \n";
    if($buf == "bye"){
      //接收到结束消息,关闭连接,等待下一个连接
      socket_close($msgsock);
      continue;
    }
    //数据传送 向客户端写入返回结果
    $msg = "welcome \n";
    socket_write($msgsock, $msg, strlen($msg)) or die("socket_write() failed: reason: " . socket_strerror(socket_last_error()) ."/n");
  }
} while (true);
socket_close($sock);
?>

3、客户端程序SocketClient.php

<?php
set_time_limit(0);
$host = "127.0.0.1";
$port = 3046;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)or die("Could not create socket\n");
$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");
  echo("input what you want to say to the server:\n");
  $text = fgets(STDIN);
  socket_write($socket, $text);
}
socket_close($socket);
?>

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,看 extension=php_gd2.dll   和  extension=php_sockets.dll 扩展是否打开;

2. 看phpInfo()显示的内容里,socket模块是否为enable;

我检查了一下,发现都是符合的。但错误仍然出现?怎么回事呢?

后来我才发现,原来是我在phpInfo()里看到的和在cmd窗口里使用的php不是同一个东西。

原因是我多次安装过php. 先前的php在系统的环境变量里面注册了path。所以在cmd窗口里使用的是以前的php. 而在phpInfo()里显示的是现在的php的设置。

解决的办法很简单了,就把系统环境变量里的path里,指向老的Php的路径改为指向正在使用的Php的路径。这样在cmd里的php和在浏览器里的php就是同一个东西了。

就是这样。

5、其流程与C语言很相似,实际上就是封装了C语言的socket

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

PHP 相关文章推荐
详解:――如何将图片储存在数据库里
Dec 05 PHP
PHP cron中的批处理
Sep 16 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
Aug 15 PHP
php中curl使用指南
Feb 05 PHP
如何在HTML 中嵌入 PHP 代码
May 13 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
Jan 07 PHP
PHP编程中尝试程序并发的几种方式总结
Mar 21 PHP
php 如何设置一个严格控制过期时间的session
May 05 PHP
Laravel下生成验证码的类
Nov 15 PHP
Yii框架页面渲染操作实例详解
Jul 19 PHP
PHP实现简单用户登录界面
Oct 23 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 #PHP
php 字符串中是否包含指定字符串的多种方法
Apr 12 #PHP
ThinkPHP框架使用redirect实现页面重定向的方法实例分析
Apr 12 #PHP
PHP实现的mongoDB数据库操作类完整实例
Apr 10 #PHP
PHP实现的简单组词算法示例
Apr 10 #PHP
PHP实现的大文件切割与合并功能示例
Apr 10 #PHP
PHP实现分布式memcache设置web集群session同步的方法
Apr 10 #PHP
You might like
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
全新的PDO数据库操作类php版(仅适用Mysql)
2012/07/22 PHP
php二维数组排序详解
2013/11/06 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
浅谈javascript对象模型和function对象
2014/12/26 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
setTimeout函数的神奇使用
2017/02/26 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
原生js实现无缝轮播图效果
2021/01/28 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
python读取和保存视频文件
2018/04/16 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
python如何查看微信消息撤回
2018/11/27 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
html5.2 dialog简介详解
2018/02/27 HTML / CSS
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
运动会广播稿20字
2014/02/18 职场文书
廉洁教育学习材料
2014/05/19 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
2016年安全生产先进个人事迹材料
2016/02/29 职场文书
react antd实现动态增减表单
2021/06/03 Javascript
使用Python解决图表与画布的间距问题
2022/04/11 Python