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 相关文章推荐
对javascript和select部件的结合运用
Oct 09 PHP
PHP得到mssql的存储过程的输出参数功能实现
Nov 23 PHP
linux环境apache多端口配置虚拟主机的方法深入介绍
Jun 09 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 PHP
php中memcache 基本操作实例
May 17 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
实现PHP中session存储及删除变量
Oct 15 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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 rsa 加密,解密,签名,验签详解
2016/12/06 PHP
laravel框架中间件 except 和 only 的用法示例
2019/07/12 PHP
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
基于jquery实现日历签到功能
2020/09/11 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
浅谈js原生拖放
2016/11/21 Javascript
JavaScript之浏览器对象_动力节点Java学院整理
2017/07/03 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
AngularJs分页插件使用详解
2018/06/30 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
vue路由前进后退动画效果的实现代码
2018/12/10 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
微信浏览器下拉黑边解决方案 wScroollFix
2020/01/21 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
MySQL最常见的操作语句小结
2015/05/07 Python
python自定义类并使用的方法
2015/05/07 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
磁盘垃圾文件清理器python代码实现
2020/08/24 Python
VSCode下配置python调试运行环境的方法
2018/04/06 Python
python3中函数参数的四种简单用法
2018/07/09 Python
以SQLite和PySqlite为例来学习Python DB API
2020/02/05 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
python爬虫容易学吗
2020/06/02 Python
Python getsizeof()和getsize()区分详解
2020/11/20 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
人事专员的职责
2014/02/26 职场文书
综合内勤岗位职责
2014/04/14 职场文书
青春无悔演讲稿
2014/05/08 职场文书
工人先进事迹材料
2014/12/26 职场文书
担保贷款承诺书
2015/04/30 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书