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:WebSocket サーバーに接続しました!
'); } //メッセージへ websocket.onmessage = function(event) { var msg = JSON.parse(event.data); //解析收到達したjsonメッセージデータ var type = msg.type; //消息型 var umsg = msg.message; //メッセージ文本 var uname = msg.name; //発信者 i++; if(type == 'usermsg'){ $('.show-area').append(''+umsg+''); } if(type == 'システム'){ $('.show-area').append(''+umsg+'' ); } $('#メッセージ').val(''); window.location.hash = '#'+i; } //発行错误 websocket.onerror = function(event){ 私++; console.log("WebSocketサーバーへの接続エラー"); $('.show-area').append(''); window.location.hash = '#'+i; } //连接关闭 websocket.onclose = function(event){ 私++; console.log('websocket接続が閉じられました。'); $('.show-area').append(''); window.location.hash = '#'+i; }関数 send(){ var name = $('#name').val(); var message = $('#message').val(); if(!名前){ alert('ユーザー名を入力してください!'); 戻る false; } if(!メッセージ){ alert('送信メッセージを空にすることはできません!'); 戻る false; } var msg = { メッセージ: メッセージ、 名前: 名前 }; 試してみる{ websocket.send(JSON.stringify(msg)); } キャッチ(元) { コンソール.ログ(ex); } } //Enterキーを押してメッセージを送信してください $(ウィンドウ).keydown(function(イベント){ if(イベント.keyCode == 13){ console.log('ユーザー入力'); 送信(); } }); //送信ボタンをクリックしてメッセージを送信してください $('.send').bind('click',function(){ 送信(); }); } 他{ alert('このブラウザはWebソケット')をサポートしていません。 } }); スクリプト> ボディ> コードを表示
2.socketサーバーサイドコードPHPファイル
2.phpコード: php $host = '127.0.0.1'; $port = '9505'; $null = NULL; //TCPソケットを作成する $socket =socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1); ソケットバインド($socket, 0, $port); //リスニングポート socket_listen($socket); //接続されたクライアントソケットリスト $clients = 配列($socket); //接続とステータスを監視するための無限ループを設定します ながら (本当) { $変更されました = $クライアント; ソケット_select($changed, $null, $null, 0, 10); //新しい繋がりがあれば if (in_array($socket, $changed)) { //新しいソケット接続を受け入れて参加します $socket_new =socket_accept($socket); $clients[] = $socket_new; //ソケット経由でデータを取得し、ハンドシェイクを実行します $header =socket_read($socket_new, 1024); Perform_handshaking($header, $socket_new, $host, $port); //クライアントIPでエンコードされたJSONデータを取得して通知を送信します socket_getpeername($socket_new, $ip); $response =マスク(json_encode(array('type'=>'システム', 'メッセージ'=>$ip. 接続されました'))); send_message($response); $found_socket = array_search($socket, $changed); unset($changed[$found_socket]); } //各クライアントソケット接続のポーリング foreach ($changed as $changed_socket) { //クライアントデータが送信された場合 while(socket_recv($changed_socket, $buf, 1024, 0) >= 1) { //送信されたデータをデコードします $received_text =マスク解除($buf); $tst_msg = json_decode($received_text); $user_name = $tst_msg->name; $user_message = $tst_msg->message; //接続されているすべてのクライアントにメッセージを送り返します $response_text = Mask(json_encode(array('type'=>'usermsg', 'name'=>$user_name, メッセージ'=>$user_message))); send_message($response_text); 休憩 2; } //オフラインクライアントを確認してください $buf = @socket_read($changed_socket, 1024, PHP_NORMAL_READ); if ($buf === false) { $found_socket = array_search($changed_socket, $clients); ソケットゲットピア名($changed_socket, $ip); unset($clients[$found_socket]); $response =マスク(json_encode(array('type'=>'システム', 'メッセージ'=>$ip. 切断されました'))); send_message($response); } } } // リスニングソケットを閉じます socket_close($sock); //メッセージの送信方法 関数 send_message($msg) { グローバル $クライアント; foreach($clients as $changed_socket) { @socket_write($changed_socket,$msg,strlen($msg)); } 戻る 本当; }//解解データ 関数 unmask($text) { $length = ord($text[1]) & 127; if($length == 126) { $マスク = substr($text, 4, 4); $data = substr($text, 8); } elseif($length == 127) { $マスク = substr($text, 10, 4); $data = substr($text, 14); } 他 { $マスク = substr($text, 2, 4); $data = substr($text, 6); } $text = ""; for ($i = 0; $i < strlen($data); ++$i) { $text .= $data[$i] ^ $masks[$i%4]; } 戻る $text; } //编码データ 関数マスク($text) { $b1 = 0x80 | (0x1 & 0x0f); $length = strlen($text); if($length <= 125) $header = パック('CC', $b1, $length); elseif($length > 125 && $length < 65536) $header = パック('CCn', $b1, 126, $length); elseif($length >= 65536) $header = パック('CCNN', $b1, 127, $length); return $header.$text; } //握る手の逻辑 関数 Perform_handshaking($receved_header,$client_conn, $host, $port) { $headers = array(); $lines = preg_split("/rn/", $receved_header); foreach($lines as $line) { $line = チョップ($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 ソケット プロトコル ハンドシェイク" . 「アップグレード: websocketrn」 . 「接続: アップグレード」 . "WebSocket-Origin: $hostrn" . 「WebSocket-Location: ws://$host:$port/demo/shout.phprn」。 "Sec-WebSocket-Accept:$secAcceptrnrn"; ソケット書き込み($client_conn,$upgrade,strlen($upgrade)); } コードを表示
以降有空再整份java版本です