91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP如何實現web?socket長鏈接

發布時間:2023-03-25 13:56:47 來源:億速云 閱讀:108 作者:iii 欄目:開發技術

本文小編為大家詳細介紹“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

// 創建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;
}

讀到這里,這篇“PHP如何實現web socket長鏈接”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南乐县| 延安市| 八宿县| 镇巴县| 湖北省| 永川市| 广饶县| 浦城县| 万荣县| 潼关县| 简阳市| 湖北省| 罗山县| 神池县| 桃源县| 稷山县| 福贡县| 禹州市| 贡嘎县| 静安区| 扶风县| 辽阳市| 虞城县| 德格县| 科尔| 孝义市| 宝丰县| 平定县| 万荣县| 泰宁县| 资阳市| 会同县| 罗山县| 安义县| 阜宁县| 泗洪县| 新民市| 安新县| 呼和浩特市| 区。| 安乡县|