目录
简介
目前PHP实现web socket 都是使用框架集成来实现,比如hyperf,swoft,或者是安装swoole 扩展来实现websocket,那么有没有PHP本身就能够实现的呢,答案当然有,Let’s go.
函数介绍
服务端
stream_socket_server — Create an Internet or Unix domain server socket
可以帮我创建网络链接具柄,参数如下
stream_socket_server(
string $address,
int &$error_code = null,
string &$error_message = null,
int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
?resource $context = null
): resource|false
客户端
stream_socket_client — Open Internet or Unix domain socket connection
连接句柄
stream_socket_client(
string $address,
int &$error_code = null,
string &$error_message = null,
?float $timeout = null,
int $flags = STREAM_CLIENT_CONNECT,
?resource $context = null
): resource|false
简单运用
<?php //服务端
$socket = stream_socket_server(\"tcp://0.0.0.0:8000\", $errno, $errstr);
if (!$socket) {
echo \"$errstr ($errno)<br />\\n\";
} else {
while ($conn = stream_socket_accept($socket)) { //循环 等待链接
fwrite($conn, \'The local time is \' . date(\'n/j/Y g:i a\') . \"\\n\");//成功链接输出以上内容 大致为:The local time is 3/22/2023 11:13 am
fclose($conn); //断开连接
}
fclose($socket); //断开socket
}
?>
<?php //客户端
$fp = stream_socket_client(\"tcp://0.0.0.0:8000\", $errno, $errstr, 30);
if (!$fp) {
echo \"$errstr ($errno)<br />\\n\";
} else {
fwrite($fp, \"GET / HTTP/1.0\\r\\nHost: www.example.com\\r\\nAccept: */*\\r\\n\\r\\n\");
while (!feof($fp)) {
echo fgets($fp, 1024);
}
fclose($fp);
}
?>
解释
上面的事例,只能在服务器之间调用,而且每次链接都会断开,一旦需要使用服务就需要不断的进行连接,不断的进行三次握手很浪费资源,那么能不能实现一个呢,No Code No BB.
JsDemo
// 创建websocket
ws = new WebSocket(\"ws://\"+domain+\"/\"+port);
// 当socket连接打开时,输入用户名
ws.onopen = function(){}; //自定义 连接建立时处理操作,比如IM系统登陆信息操作
// 当有消息时根据消息类型显示不同信息
ws.onmessage = function(){};// 操作服务端发来的消息
ws.onclose = function() {
console.log(\"连接关闭,定时重连\");
connect();//重新连接
};
ws.onerror = function() {
console.log(\"出现错误\");
};
PHP实现三次握手
$socket = stream_socket_server(\'tcp://\'.$ipServer.\':\'.$portNumber, $errno, $errstr);
while($conn = @stream_socket_accept($socket,$nbSecondsIdle))
{
$message= fread($conn, 1024);
send($conn,$message);
//@todo
//连接成功,有要保持连接,用来接收客户端发送过来的数据包 这里可以把这个连接$conn 保存在内存当中,通过Select or Swoole 事件去loop
fputs ($conn, \"OK\\n\");
}
function send($socket,$buffer){
$Sec_WebSocket_Key = \'\';
if (\\preg_match(\"/Sec-WebSocket-Key: *(.*?)\\r\\n/i\", $buffer, $match)) {
$Sec_WebSocket_Key = $match[1];
}
$new_key = \\base64_encode(\\sha1($Sec_WebSocket_Key . \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\", true));
$handshake_message = \"HTTP/1.1 101 Switching Protocols\\r\\n\"
.\"Upgrade: websocket\\r\\n\"
.\"Sec-WebSocket-Version: 13\\r\\n\"
.\"Connection: Upgrade\\r\\n\"
.\"Sec-WebSocket-Accept: \" . $new_key . \"\\r\\n\";
$handshake_message .= \"\\r\\n\";
var_dump($handshake_message);//打印握手信息,然后发送给客户端,建立完整连接
//socket_write($socket,$handshake_message);
$len = @\\fwrite($socket, $handshake_message);
return 0;
}
:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!
猪小侠源码-最新源码下载平台 PHP教程 PHP实现web socket长链接流程详解 http://www.20zxx.cn/813400/xuexijiaocheng/qes.html
猪小侠源码,优质资源分享网
相关文章
- java非法字符‘\\ufeff‘解决方法 2024-03-11
- Java中单体应用锁的局限性&分布式锁 2024-03-11
- 如何通过php函数解决页面渲染慢的问题? 2024-03-11
- 如何评估php性能优化函数的效果? 2024-03-11
- 如何利用PHP脚本在Linux中进行目录操作 2024-03-11
- 如何通过PHP脚本在Linux中进行系统监测 2024-03-11
- 如何使用php函数来优化表单处理和提交功能? 2024-03-11
- 如何通过PHP脚本在Linux服务器上实现数据加密 2024-03-11
- 如何通过php函数来优化验证码生成和校验? 2024-03-11
- 如何使用php函数来优化多语言支持功能? 2024-03-11
做猪小侠源码的代理,提供一站式服务
如果你不懂得搭建网站或者服务器,小程序,源码之类的怎么办? 第一通过本站学习各种互联网的技术 第二就是联系客服,我帮帮你搭建(当然要收取部分的费用) 第三成为我们的代理,我们提供整套的服务。