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 全角转半角实现代码
May 16 PHP
php数组中删除元素的实现代码
Jun 22 PHP
PHP表单递交控件名称含有点号(.)会被转化为下划线(_)的处理方法
Jan 06 PHP
ThinkPHP中处理表单中的注意事项
Nov 22 PHP
浅谈PHP的数据库接口和技术
Dec 09 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
PHP中Laravel 关联查询返回错误id的解决方法
Apr 01 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
php curl上传、下载、https登陆实现代码
Jul 23 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
Dec 25 PHP
php删除一个路径下的所有文件夹和文件的方法
Feb 07 PHP
PHP中SESSION过期设置
Mar 09 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 SQL之where语句生成器
2009/03/24 PHP
PHP详解ASCII码对照表与字符转换
2011/12/05 PHP
php实现微信公众号主动推送消息
2015/12/31 PHP
php处理带有中文URL的方法
2016/07/11 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
PHP中TP5 上传文件的实例详解
2017/07/31 PHP
YII框架关联查询操作示例
2019/04/29 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
JS与jQuery实现子窗口获取父窗口元素值的方法
2017/04/17 jQuery
react-router实现按需加载
2017/05/09 Javascript
mui上拉加载更多下拉刷新数据的封装过程
2017/11/03 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
vue中defineProperty和Proxy的区别详解
2020/11/30 Vue.js
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
Python中的下划线详解
2015/06/24 Python
pandas object格式转float64格式的方法
2018/04/10 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
django用户登录验证的完整示例代码
2019/07/21 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
2019/08/08 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
2020/06/02 Python
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
银行介绍信范文
2014/01/10 职场文书
小学生环保倡议书
2014/05/15 职场文书
飞屋环游记观后感
2015/06/08 职场文书
redis实现的四种常见限流策略
2021/06/18 Redis