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分页显示制作详细讲解
Dec 05 PHP
PHP与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
php读取msn上的用户信息类
Dec 05 PHP
基于OpenCV的PHP图像人脸识别技术
Oct 11 PHP
laravel安装和配置教程
Oct 29 PHP
Yii把CGridView文本框换成下拉框的方法
Dec 03 PHP
php数组合并与拆分实例分析
Jun 12 PHP
php导出生成word的方法
Dec 25 PHP
PHP实现的数据对象映射模式详解
Mar 20 PHP
Laravel5.1框架注册中间件的三种场景详解
Jul 09 PHP
PHP用swoole+websocket和redis实现web一对一聊天
Nov 05 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
Dec 02 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
2013/10/28 PHP
使用php批量删除数据库下所有前缀为prefix_的表
2014/06/09 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
PHP实现搜索时记住状态的方法示例
2018/05/11 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
深入认识JavaScript中的函数
2007/01/22 Javascript
在IE模态窗口中自由查看HTML源码的方法
2007/03/08 Javascript
一个很有趣3D球状标签云兼容IE8
2014/08/22 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
JavaScript ES6中const、let与var的对比详解
2017/06/18 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
vue实现购物车案例
2020/05/30 Javascript
js实现双色球效果
2020/08/02 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
2017/02/13 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
python主线程捕获子线程的方法
2018/06/17 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
python爬取微信公众号文章
2018/08/31 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
Python程序控制语句用法实例分析
2020/01/14 Python
Python常用数据分析模块原理解析
2020/07/20 Python
西班牙在线药店:DosFarma
2020/03/28 全球购物
一套带网友答案的.NET笔试题
2016/12/06 面试题
百度吧主申请感言
2014/01/12 职场文书
网站客服岗位职责
2014/04/05 职场文书
新闻稿格式范文
2015/07/18 职场文书
SpringBoot 整合mongoDB并自定义连接池的示例代码
2022/02/28 MongoDB