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 获取完整url地址
Dec 20 PHP
php 搜索框提示(自动完成)实例代码
Feb 05 PHP
Codeigniter实现处理用户登录验证后的URL跳转
Jun 12 PHP
PHP之autoload运行机制实例分析
Aug 28 PHP
PHP实现采集中国天气网未来7天天气
Oct 15 PHP
PHP生成条形码大揭秘
Sep 24 PHP
php实现在线通讯录功能(附源码)
May 13 PHP
java微信开发之上传下载多媒体文件
Jun 24 PHP
php基于dom实现读取图书xml格式数据的方法
Feb 03 PHP
WHOOPS PHP调试库的使用
Sep 29 PHP
PHP使用file_get_contents发送http请求功能简单示例
Apr 29 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 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中的float类型使用说明
2010/07/27 PHP
fgetcvs在linux的问题
2012/01/15 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
关于PHP内置的字符串处理函数详解
2017/02/04 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
两个select之间option的互相添加操作(jquery实现)
2009/11/12 Javascript
jQuery LigerUI 使用教程表格篇(1)
2012/01/18 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
利用js实现禁止复制文本信息
2015/06/03 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
jQuery滚动监听实现商城楼梯式导航效果
2017/03/06 Javascript
axios学习教程全攻略
2017/03/26 Javascript
基于jQuery的表单填充实例
2017/08/22 jQuery
Angular js 实现添加用户、修改密码、敏感字、下拉菜单的综合操作方法
2017/10/24 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
Python写的PHPMyAdmin暴力破解工具代码
2014/08/06 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
python十进制和二进制的转换方法(含浮点数)
2018/07/07 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
pytorch torch.expand和torch.repeat的区别详解
2019/11/05 Python
基于HTML5 FileSystem API的使用介绍
2013/04/24 HTML / CSS
幼儿园教师培训制度
2014/01/16 职场文书
私人会所最新创业计划书范文
2014/03/24 职场文书
感恩之星事迹材料
2014/05/03 职场文书
2014年档案室工作总结
2014/12/01 职场文书
平安家庭事迹材料
2014/12/20 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python
教你快速构建一个基于nginx的web集群项目
2021/11/27 Servers