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安全编程之加密功能
Oct 09 PHP
基于php伪静态的实现详细介绍
Apr 28 PHP
php实现12306余票查询、价格查询示例
Apr 17 PHP
php中用memcached实现页面防刷新功能
Aug 19 PHP
cakephp打印sql语句的方法
Feb 13 PHP
PHP判断一个字符串是否是回文字符串的方法
Mar 23 PHP
使用symfony命令创建项目的方法
Mar 17 PHP
ThinkPHP实现图片上传操作的方法详解
May 08 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
Laravel开启跨域请求的方法
Oct 13 PHP
PHP代码加密的方法总结
Mar 13 PHP
PHP使用非对称加密算法RSA
Apr 21 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
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
ThinkPHP模板替换与系统常量及应用实例教程
2014/08/22 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
Zend Framework框架中实现Ajax的方法示例
2017/06/27 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
2017/12/13 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
php生成二维码不保存服务器还有下载功能的实现代码
2018/08/09 PHP
JavaScript-世界上误解最深的语言分析
2007/08/12 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
JS实现的Select三级下拉菜单代码
2015/08/20 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
webpack2.0搭建前端项目的教程详解
2017/04/05 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python使用re模块正则提取字符串中括号内的内容示例
2018/06/01 Python
TensorFlow绘制loss/accuracy曲线的实例
2020/01/21 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
详解如何在css3打包后自动追加前缀插件:autoprefixer
2018/12/18 HTML / CSS
大学生党员个人总结
2015/02/13 职场文书
后勤工作个人总结
2015/02/28 职场文书
起诉书范文
2015/05/20 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis