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 相关文章推荐
php 信息采集程序代码
Mar 17 PHP
PHP Memcached应用实现代码
Feb 08 PHP
QueryPath PHP 中的jQuery
Apr 11 PHP
新手学习PHP的一些基础知识分享
Jul 27 PHP
php数组函数序列之asort() - 对数组的元素值进行升序排序,保持索引关系
Nov 02 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
Aug 31 PHP
php set_time_limit()函数的使用详解
Jun 05 PHP
在yii中新增一个用户验证的方法详解
Jun 20 PHP
php单链表实现代码分享
Jul 04 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
YII框架模块化处理操作示例
Apr 26 PHP
windows系统php环境安装swoole具体步骤
Mar 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
php 判断数组是几维数组
2013/03/20 PHP
PHP检测用户是否关闭浏览器的方法
2016/02/14 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
不一样的文字闪烁 轮番闪烁
2009/11/11 Javascript
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
Javascript 浮点运算精度问题分析与解决
2014/03/26 Javascript
javascript操作字符串的原生方法
2014/12/22 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
jQuery实现磁力图片跟随效果完整示例
2016/09/16 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
Jqprint实现页面打印
2017/01/06 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
使用Vue完成一个简单的todolist的方法
2017/12/01 Javascript
AngularJS实现的2048小游戏功能【附源码下载】
2018/01/03 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
JS+CSS实现动态时钟
2021/02/19 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
Python操作列表的常用方法分享
2014/02/13 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
django站点管理详解
2017/12/12 Python
Odoo中如何生成唯一不重复的序列号详解
2018/02/10 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
html5跨域通讯之postMessage的用法总结
2013/11/07 HTML / CSS
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
大学毕业生个人自荐信范文
2014/01/08 职场文书
关于旷工的检讨书
2014/02/02 职场文书
高一化学教学反思
2014/02/05 职场文书
工程质量承诺书
2014/03/27 职场文书
校园文化标语
2014/06/18 职场文书
公司年底活动方案
2014/08/17 职场文书
志愿者爱心公益活动策划方案
2014/09/15 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js