웹소켓
웹소켓은 단순한 네트워크 통신 프로토콜입니다
http, ftp 등이 모두 네트워크 통신 프로토콜인 것처럼 너무 많이 생각하지 마세요.
HTTP와 같은 비영구적 프로토콜에 비해 Websocket은 지속적인 네트워크 통신을 위한 프로토콜입니다.
WebSocket과 HTTP의 관계
교차로는 있지만 전부는 아닙니다.
Websocket은 HTTP 프로토콜의 일부를 빌려 핸드셰이크를 완료합니다. (HTTP의 3방향 핸드셰이크는 여기서 한 번만 완료됩니다.)
http와 websocket 요청 헤더 비교:
HTTP:
원래 클라이언트는 http(horseback)를 통해 서버에 편지를 요청했고, 서버는 요청을 처리(답장 작성)한 후 http(horseback)를 통해 다시 반환했습니다.
웹소켓:
클라이언트는 http(승마)를 통해 문자로 서버에 요청하지만 동시에 서버가 WebSocket 프로토콜(두 개의 인터페이스를 지원하는 경우) Upgrade:websocket
및 Connection:Upgrade
(두 개의 파이프)을 전달합니다. Websocket 프로토콜은 사용 가능한 정보를 반환합니다(말 삭제). 이후에 이 두 파이프는 서버가 이를 지원하지 않는 경우 한 쪽이 인위적으로 파이프를 끊지 않는 한 정보 전송에 사용됩니다. 링크를 요청하고 오류 메시지를 반환합니다.
http와 websocket 응답 헤더 비교:
Websocket, Ajax 폴링, 롱 폴링의 차이점
첫 번째는 ajax 폴링입니다. ajax 폴링의 원리는 매우 간단합니다. 이를 통해 브라우저는 몇 초마다 서버에 새로운 정보가 있는지 묻는 요청을 보낼 수 있습니다.
장면 재현:
클라이언트 : 라라라 혹시 새로운 정보가 있나요(요청)
서버: 아니요(응답)
클라이언트 : 라라라 혹시 새로운 정보가 있나요(요청)
서버: 없음. . (답변)
클라이언트 : 라라라 혹시 새로운 정보가 있나요(요청)
서버: 너무 짜증나시네요, 아니. . (답변)
클라이언트: 라라라, 새 메시지 있나요(요청)
서버: 알겠습니다. 여기 있습니다. (답변)
클라이언트: 라라라, 새 메시지 있나요(요청)
서버:. . . 없이. . . . 없이. . 없음
긴 폴링 사실 원리는 ajax 폴링과 유사하며 둘 다 폴링을 사용하므로 여기서는 논의하지 않습니다.
위에서 볼 수 있듯이 폴링은 실제로 지속적으로 HTTP 연결을 설정한 후 서버가 이를 처리할 때까지 기다리는 것으로, 이는 HTTP 프로토콜의 또 다른 특성인수동성을 반영할 수 있습니다. 동시에, 각 HTTP 요청 및 응답 후에 서버는 모든 클라이언트 정보를 삭제합니다. 상태 비저장인 ID 정보(쿠키)를 전달해야 합니다.
Websocket의 등장으로 이러한 문제가 깔끔하게 해결되었습니다.그래서 위의 시나리오는 다음과 같이 수정될 수 있습니다.
클라이언트 : 라라라, 웹소켓 프로토콜을 구축하고 싶어요, 필수 서비스 :
서버: 확인됨, Websocket 프로토콜로 업그레이드되었습니다(HTTP 프로토콜 전환됨)
클라이언트: 정보가 있으면 푸시해 주세요. .
서버: 네, 가끔 말씀드리겠습니다.
클라이언트: 발라브가 알라발라와 싸우기 시작합니다
서버: 아오이 소라
고객님: 코피가 나네요 닦아주세요...
서버 : ㅎㅎ 불교육이 짱이네요 ㅎㅎㅎ
서버 : 엄청 웃었어요 ㅎㅎ
그러나 PHP와 HTML5를 사용하여 WebSocket 요청 및 응답을 완료하기 위해 수천 개의 산과 강을 걷고 울창한 숲 깊은 곳에서 Swoole을 발견했습니다.
순수 C 언어로 작성된 PHP 언어의 비동기, 병렬, 고성능 네트워크 통신 프레임워크는 PHP 언어의 비동기 멀티스레드 서버, 비동기 TCP/UDP 네트워크 클라이언트, 비동기 MySQL, 데이터베이스 연결 풀, AsyncTask, 메시지 큐, 밀리초 타이머, 비동기 파일 읽기 및 쓰기, 비동기 DNS 쿼리.
Http서버
웹소켓 서버
TCP 서버
TCP 클라이언트
Async-IO(비동기)
작업(예약된 작업)
Linux, FreeBSD, MacOS, 유형 3 운영 체제만 지원합니다.
Linux 커널 버전 2.3.32 이상
PHP5.3.10 이상
gcc4.4 이상 또는 clang
cmake2.4+, libswoole.so를 C/C++ 라이브러리로 컴파일할 때 cmake
를 사용해야 합니다.설치:
시스템에 다음 소프트웨어가 있는지 확인해야 합니다.
php-5.3.10 이상
gcc-4.4 이상
만들다
자동 설정
Swoole은 PHP 확장으로 실행됩니다.
설치(루트 권한):
CD 스울
phpize
./구성
만들다
sudo make install
php.ini 구성
확장자=swoole.so
Swoole을 공부하고 싶은 분들은 매뉴얼을 직접 읽어보세요(잘 쓰여있지 않아도 이해는 가능합니다)
채팅방 만들기
서버측: 소켓.php
//创建websocket服务器对象,监听0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0", 9502); //监听WebSocket连接打开事件 $ws->on('open', function ($ws, $request) { $fd[] = $request->fd; $GLOBALS['fd'][] = $fd; //$ws->push($request->fd, "hello, welcome\n"); }); //监听WebSocket消息事件 $ws->on('message', function ($ws, $frame) { $msg = 'from'.$frame->fd.":{$frame->data}\n"; //var_dump($GLOBALS['fd']); //exit; foreach($GLOBALS['fd'] as $aa){ foreach($aa as $i){ $ws->push($i,$msg); } } // $ws->push($frame->fd, "server: {$frame->data}"); // $ws->push($frame->fd, "server: {$frame->data}"); }); //监听WebSocket连接关闭事件 $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; }); $ws->start();
클라이언트: Socket.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="msg"></div> <input type="text" id="text"> <input type="submit" value="发送数据" onclick="song()"> </body> <script> var msg = document.getElementById("msg"); var wsServer = 'ws://192.168.1.253:9502'; //调用websocket对象建立连接: //参数:ws/wss(加密)://ip:port (字符串) var websocket = new WebSocket(wsServer); //onopen监听连接打开 websocket.onopen = function (evt) { //websocket.readyState 属性: /* CONNECTING 0 The connection is not yet open. OPEN 1 The connection is open and ready to communicate. CLOSING 2 The connection is in the process of closing. CLOSED 3 The connection is closed or couldn't be opened. */ msg.innerHTML = websocket.readyState; }; function song(){ var text = document.getElementById('text').value; document.getElementById('text').value = ''; //向服务器发送数据 websocket.send(text); } //监听连接关闭 // websocket.onclose = function (evt) { // console.log("Disconnected"); // }; //onmessage 监听服务器数据推送 websocket.onmessage = function (evt) { msg.innerHTML += evt.data +'<br>'; // console.log('Retrieved data from server: ' + evt.data); }; //监听连接错误信息 // websocket.onerror = function (evt, e) { // console.log('Error occured: ' + evt.data); // }; </script> </html>
위 내용은 Swoole을 기반으로 PHP와 웹소켓 채팅방을 구현하는 전체 내용입니다. 이 글은 PHP와 웹소켓을 배우고 채팅방을 개발하는 모든 분들에게 도움이 될 것이라고 믿습니다.