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 相关文章推荐
Http 1.1 Etag 与 Last-Modified提高php效率
Jan 10 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
浅析PHP文件下载原理
Dec 25 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
Sep 22 PHP
php删除二维数组中的重复值方法
Mar 12 PHP
PHP设计模式之观察者模式定义与用法示例
Aug 04 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
Feb 15 PHP
在 PHP 和 Laravel 中使用 Traits的方法
Nov 13 PHP
如何在PHP中生成随机数
Jun 04 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
我的论坛源代码(一)
2006/10/09 PHP
PHP无限分类(树形类)
2013/09/28 PHP
php截取中文字符串不乱码的方法
2013/12/25 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
JavaScript DOM 添加事件
2009/02/14 Javascript
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
React.js入门学习第一篇
2016/03/30 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
使用express+multer实现node中的图片上传功能
2018/02/02 Javascript
JsChart组件使用详解
2018/03/04 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
vue-router重定向和路由别名的使用讲解
2019/01/19 Javascript
Vue 递归多级菜单的实例代码
2019/05/05 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
python微信好友数据分析详解
2018/11/19 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python开头的coding设置方法
2019/08/08 Python
python groupby 函数 as_index详解
2019/12/16 Python
python算的上脚本语言吗
2020/06/22 Python
Python如何实现机器人聊天
2020/09/10 Python
Python语言编写智力问答小游戏功能
2020/10/13 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
Html5 Canvas动画基础碰撞检测的实现
2018/12/06 HTML / CSS
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
领导班子个人对照检查剖析材料
2014/09/29 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
小学生成绩单评语
2014/12/31 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
新入职员工工作总结
2015/10/15 职场文书
windows安装 redis 6.2.6最新步骤详解
2022/04/26 Redis