iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP如何实现web socket长链接
  • 201
分享到

PHP如何实现web socket长链接

2023-07-05 16:07:19 201人浏览 安东尼
摘要

本文小编为大家详细介绍“PHP如何实现WEB Socket长链接”,内容详细,步骤清晰,细节处理妥当,希望这篇“php如何实现web socket长链接”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知

本文小编为大家详细介绍“PHP如何实现WEB Socket长链接”,内容详细,步骤清晰,细节处理妥当,希望这篇“php如何实现web socket长链接”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

函数介绍

服务端

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

// 创建websocketws = 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;}

读到这里,这篇“PHP如何实现web socket长链接”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网PHP编程频道。

--结束END--

本文标题: PHP如何实现web socket长链接

本文链接: https://www.lsjlt.com/news/353400.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作