一个最简单的PHP-sockets程序(总结了很容易犯的一些错误)

第一步:检查环境是否正常(window或linux-centos)

完全可以不用管--enable-sockets选项,这个是旧版本的问题,新版本自动安装sockets扩展并开启! 按照下面来检查是否成功

PHP官网在使用sockets的时候会有一段这样的声明,可是在新版本PHP中,你去配置文件php.ini中寻找不到这个配置,尼玛很郁闷!我们在开发中可以不管他,可以使用命令:php -m来查看你PHP中是否安装了扩展sockets即可

正常来说,新版PHP自动安装这些扩展的,在你的配置文件中,会有这么一行,说明已经开启sockets扩展,如果没开启,就去掉前面的分号开启即可!

extension=sockets

第二步:准备服务端和客户端的代码,细节在代码中有备注!

服务器端代码一定要注意2个问题:否则很容易出错:

A、 切记:socket_listen函数只能单独一行执行,不能带and或or语句,否则监听失败!

B、最最关键容易忽略的:服务器接收请求后,执行读写的资源$socket是socket_accept函数返回的结果!

 

server.php服务器端代码

<?php


$address = "0.0.0.0";
$port = 8089;


// Create a TCP Stream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 注:服务器端的$address如果赋值0(所有ip-外网内网),赋值【0.0.0.0】(只有局域网),赋值【127.0.0.1】(指定ip)
socket_bind($socket, $address, $port) or die('Could not bind to address');
/**
 * 创建socket服务器监听(这里不会阻塞);
 * 切记:socket_listen函数只能单独一行执行,不能带and或or语句,否则监听失败!
**/ 
socket_listen($socket);
echo "${port}端口正在监听中....";

//阻塞函数,等待客户端请求!
/**
 * 特别注意:(新手都会犯的一个错误)
 * 1、PHP的sockets传输中,阻塞函数socket_accept才是最核心的。请求成功了,才会继续往下执行!
 * 2、在端口监听完毕之后,要等待客户端发送请求,必须执行阻塞函数socket_accept,等待接收请求!
 * 3、最最关键容易忽略的:服务器接收请求后,socket_accept阻塞函数执行通过,会返回一个新的$msg_socket,服务器的读写操作都是新的$msg_socket来操作!
 **/

while (true){
    //每一次客户端的请求,都会返回一个新的$msg_socket对象执行数据传输!
    $msg_socket = socket_accept($socket);
    socket_write($msg_socket, "hello Server", 64);
    echo socket_read($msg_socket,1024);
}

?>

 

client.php客户端代码

<?php 

//根据服务器端的ip范围来指定客户端的ip即可
$address = "127.0.0.1";
$port = 8089;

// Create a TCP Stream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($socket, $address, $port);


$result =  socket_read($socket, 2048);
echo "客户端接收到的数据为${result}";

socket_write($socket, "hello Client", 64);

?>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值