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生成xml时添加CDATA标签的方法
Oct 17 PHP
PHP使用mysql_fetch_object从查询结果中获取对象集的方法
Mar 18 PHP
PHP限制HTML内容中图片必须是本站的方法
Jun 16 PHP
Java中final关键字详解
Aug 10 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
Jan 07 PHP
php制作的简单验证码识别代码
Jan 26 PHP
php进行ip地址掩码运算处理的方法
Jul 11 PHP
PHP AjaxForm提交图片上传并显示图片源码
Nov 29 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
Laravel框架查询构造器简单示例
May 08 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
PHP的imageTtfText()函数深入详解
Mar 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访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP用身份证号获取星座和生肖的方法
2013/11/07 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
js实现图片轮换效果代码
2013/04/16 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
jQuery中:checked选择器用法实例
2015/01/04 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
2015/07/27 Javascript
ajax与json 获取数据并在前台使用简单实例
2017/01/19 Javascript
Bootstrap modal 多弹窗之叠加引起的滚动条遮罩阴影问题
2017/02/27 Javascript
Vue+Element使用富文本编辑器的示例代码
2017/08/14 Javascript
javascript Canvas动态粒子连线
2020/01/01 Javascript
JS正则表达式验证端口范围(0-65535)
2020/01/06 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
Python编码时应该注意的几个情况
2013/03/04 Python
Python操作MySQL数据库的方法
2018/06/20 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
详解Python3中的 input() 函数
2020/03/18 Python
python实现图片素描效果
2020/09/26 Python
python pillow库的基础使用教程
2021/01/13 Python
CSS3 flex布局之快速实现BorderLayout布局
2015/12/03 HTML / CSS
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
巴西美妆购物网站:Kutiz Beauté
2019/03/13 全球购物
创业计划书中要认真思考的问题
2013/12/28 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
演讲稿的写法
2014/05/19 职场文书
经销商年会策划方案
2014/05/29 职场文书
大学生入党积极分子自我评价
2014/09/20 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
高三生物教学反思
2016/02/22 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python
新手入门Mysql--概念
2021/06/18 MySQL