목차
我做的一个websocket的demo(php server),websocketdemo
php教程 php手册 我做的一个websocket的demo(php server),websocketdemo

我做的一个websocket的demo(php server),websocketdemo

Jun 13, 2016 am 08:46 AM
html5

我做的一个websocket的demo(php server),websocketdemo

notice:

通过命令行执行php文件  如 php -q c:\path\server.php

通过本地web服务器访问 http://127.0.0.1/websocket/index.php即可

notice:
需要php5.3或以上的执行环境,和一个web服务器如apache
浏览器需支持html5 web socket
这里监听 socket端口 9505,如遇到端口被占用可能需要在这两个文件内修改端口或者杀死相应端口进程

页面手机上看起来比pc上好看!

1.客户端代码 html文件

1.client code: chatdemo "utf-8"> "viewport" content="width=device-width,initial-scale=1, maximum-scale=1, user-scalable=no"> "https://cdn.bootcss.com/bootstrap/3.3.2/css/bootstrap.min.css" rel="stylesheet">
class="container">
class="title">简易聊天demo
class="content">
class="show-area">
class="write-area">
"name" id="name" type="text" placeholder="input your name">
<script><span> $(function(){ <span>var wsurl = <span>'<span>ws://127.0.0.1:9505/websocket/server.php<span>'<span>; <span>var<span> websocket; <span>var i = <span>0<span>; <span>if<span>(window.WebSocket){ websocket = <span>new<span> WebSocket(wsurl); <span>//<span>连接建立 websocket.onopen =<span> function(evevt){ console.log(<span>"<span>Connected to WebSocket server.<span>"<span>); $(<span>'<span>.show-area<span>').append(<span>'<span><p class="bg-info message"><i class="glyphicon glyphicon-info-sign">Connected to WebSocket server!<span>'<span>); } <span>//<span>收到消息 websocket.onmessage = function(<span>event<span>) { <span>var msg = JSON.parse(<span>event.data); <span>//<span>解析收到的json消息数据 <span>var type = msg.type; <span>//<span> 消息类型 <span>var umsg = msg.message; <span>//<span>消息文本 <span>var uname = msg.name; <span>//<span>发送人 i++<span>; <span>if(type == <span>'<span>usermsg<span>'<span>){ $(<span>'<span>.show-area<span>').append(<span>'<span><p class="bg-success message"><i class="glyphicon glyphicon-user"><a name="<span>'+i+<span>'<span>"><span class="label label-primary"><span>'+uname+<span>'<span> say: <span>'+umsg+<span>'<span><span>'<span>); } <span>if(type == <span>'<span>system<span>'<span>){ $(<span>'<span>.show-area<span>').append(<span>'<span><p class="bg-warning message"><a name="<span>'+i+<span>'<span>"><i class="glyphicon glyphicon-info-sign"><span>'+umsg+<span>'<span><span>'<span>); } $(<span>'<span>#message<span>').val(<span>''<span>); window.location.hash = <span>'<span>#<span>'+<span>i; } <span>//<span>发生错误 websocket.onerror = function(<span>event<span>){ i++<span>; console.log(<span>"<span>Connected to WebSocket server error<span>"<span>); $(<span>'<span>.show-area<span>').append(<span>'<span><p class="bg-danger message"><a name="<span>'+i+<span>'<span>"><i class="glyphicon glyphicon-info-sign">Connect to WebSocket server error.<span>'<span>); window.location.hash = <span>'<span>#<span>'+<span>i; } <span>//<span>连接关闭 websocket.onclose = function(<span>event<span>){ i++<span>; console.log(<span>'<span>websocket Connection Closed. <span>'<span>); $(<span>'<span>.show-area<span>').append(<span>'<span><p class="bg-warning message"><a name="<span>'+i+<span>'<span>"><i class="glyphicon glyphicon-info-sign">websocket Connection Closed.<span>'<span>); window.location.hash = <span>'<span>#<span>'+<span>i; } function send(){ <span>var name = $(<span>'<span>#name<span>'<span>).val(); <span>var message = $(<span>'<span>#message<span>'<span>).val(); <span>if(!<span>name){ alert(<span>'<span>请输入用户名!<span>'<span>); <span>return <span>false<span>; } <span>if(!<span>message){ alert(<span>'<span>发送消息不能为空!<span>'<span>); <span>return <span>false<span>; } <span>var msg =<span> { message: message, name: name }; <span>try<span>{ websocket.send(JSON.stringify(msg)); } <span>catch<span>(ex) { console.log(ex); } } <span>//<span>按下enter键发送消息 $(window).keydown(function(<span>event<span>){ <span>if(<span>event.keyCode == <span>13<span>){ console.log(<span>'<span>user enter<span>'<span>); send(); } }); <span>//<span>点发送按钮发送消息 $(<span>'<span>.send<span>').bind(<span>'<span>click<span>'<span>,function(){ send(); }); } <span>else<span>{ alert(<span>'<span>该浏览器不支持web socket<span>'<span>); } }); </script> View Code

 

2.socket服务器端代码 php文件

2.php code: php $host = '127.0.0.1'; $port = '9505'; $null = NULL; //创建tcp socket $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); socket_bind($socket, 0, $port); //监听端口 socket_listen($socket); //连接的client socket 列表 $clients = array($socket); //设置一个死循环,用来监听连接 ,状态 while (true) { $changed = $clients; socket_select($changed, $null, $null, 0, 10); //如果有新的连接 if (in_array($socket, $changed)) { //接受并加入新的socket连接 $socket_new = socket_accept($socket); $clients[] = $socket_new; //通过socket获取数据执行handshake $header = socket_read($socket_new, 1024); perform_handshaking($header, $socket_new, $host, $port); //获取client ip 编码json数据,并发送通知 socket_getpeername($socket_new, $ip); $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' connected'))); send_message($response); $found_socket = array_search($socket, $changed); unset($changed[$found_socket]); } //轮询 每个client socket 连接 foreach ($changed as $changed_socket) { //如果有client数据发送过来 while(socket_recv($changed_socket, $buf, 1024, 0) >= 1) { //解码发送过来的数据 $received_text = unmask($buf); $tst_msg = json_decode($received_text); $user_name = $tst_msg->name; $user_message = $tst_msg->message; //把消息发送回所有连接的 client 上去 $response_text = mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, 'message'=>$user_message))); send_message($response_text); break 2; } //检查offline的client $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ); if ($buf === false) { $found_socket = array_search($changed_socket, $clients); socket_getpeername($changed_socket, $ip); unset($clients[$found_socket]); $response = mask(json_encode(array('type'=>'system', 'message'=>$ip.' disconnected'))); send_message($response); } } } // 关闭监听的socket socket_close($sock); //发送消息的方法 function send_message($msg) { global $clients; foreach($clients as $changed_socket) { @socket_write($changed_socket,$msg,strlen($msg)); } return true; } //解码数据 function unmask($text) { $length = ord($text[1]) & 127; if($length == 126) { $masks = substr($text, 4, 4); $data = substr($text, 8); } elseif($length == 127) { $masks = substr($text, 10, 4); $data = substr($text, 14); } else { $masks = substr($text, 2, 4); $data = substr($text, 6); } $text = ""; for ($i = 0; $i $i) { $text .= $data[$i] ^ $masks[$i%4]; } return $text; } //编码数据 function mask($text) { $b1 = 0x80 | (0x1 & 0x0f); $length = strlen($text); if($length 125) $header = pack('CC', $b1, $length); elseif($length > 125 && $length 65536) $header = pack('CCn', $b1, 126, $length); elseif($length >= 65536) $header = pack('CCNN', $b1, 127, $length); return $header.$text; } //握手的逻辑 function perform_handshaking($receved_header,$client_conn, $host, $port) { $headers = array(); $lines = preg_split("/\r\n/", $receved_header); foreach($lines as $line) { $line = chop($line); if(preg_match('/\A(\S+): (.*)\z/', $line, $matches)) { $headers[$matches[1]] = $matches[2]; } } $secKey = $headers['Sec-WebSocket-Key']; $secAccept = base64_encode(pack('H*', sha1($secKey . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'))); $upgrade = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" . "Upgrade: websocket\r\n" . "Connection: Upgrade\r\n" . "WebSocket-Origin: $host\r\n" . "WebSocket-Location: ws://$host:$port/demo/shout.php\r\n". "Sec-WebSocket-Accept:$secAccept\r\n\r\n"; socket_write($client_conn,$upgrade,strlen($upgrade)); } View Code

 

以后有空再整份java版本的

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

HTML의 테이블 테두리 HTML의 테이블 테두리 Sep 04, 2024 pm 04:49 PM

HTML의 테이블 테두리 안내. 여기에서는 HTML의 테이블 테두리 예제를 사용하여 테이블 테두리를 정의하는 여러 가지 방법을 논의합니다.

HTML 여백-왼쪽 HTML 여백-왼쪽 Sep 04, 2024 pm 04:48 PM

HTML 여백-왼쪽 안내. 여기에서는 HTML margin-left에 대한 간략한 개요와 코드 구현과 함께 예제를 논의합니다.

HTML의 중첩 테이블 HTML의 중첩 테이블 Sep 04, 2024 pm 04:49 PM

HTML의 Nested Table에 대한 안내입니다. 여기에서는 각 예와 함께 테이블 내에 테이블을 만드는 방법을 설명합니다.

HTML 테이블 레이아웃 HTML 테이블 레이아웃 Sep 04, 2024 pm 04:54 PM

HTML 테이블 레이아웃 안내. 여기에서는 HTML 테이블 레이아웃의 값에 대해 예제 및 출력 n 세부 사항과 함께 논의합니다.

HTML 정렬 목록 HTML 정렬 목록 Sep 04, 2024 pm 04:43 PM

HTML 순서 목록에 대한 안내입니다. 여기서는 HTML Ordered 목록 및 유형에 대한 소개와 각각의 예에 대해서도 설명합니다.

HTML 입력 자리 표시자 HTML 입력 자리 표시자 Sep 04, 2024 pm 04:54 PM

HTML 입력 자리 표시자 안내. 여기서는 코드 및 출력과 함께 HTML 입력 자리 표시자의 예를 논의합니다.

HTML에서 텍스트 이동 HTML에서 텍스트 이동 Sep 04, 2024 pm 04:45 PM

HTML에서 텍스트 이동 안내. 여기서는 Marquee 태그가 구문과 함께 작동하는 방식과 구현할 예제에 대해 소개합니다.

HTML 온클릭 버튼 HTML 온클릭 버튼 Sep 04, 2024 pm 04:49 PM

HTML onclick 버튼에 대한 안내입니다. 여기에서는 각각의 소개, 작업, 예제 및 다양한 이벤트의 onclick 이벤트에 대해 설명합니다.

See all articles