2013-05-30 36 views
2

我測試了一些websockets,並且在創建一些觸發器/事件時遇到了問題。如何在websockets php中創建事件?

我不確定這是否可能,但我只想嘗試。

所以我下載了一個例子,我目前只是用它

這打打鬧鬧是server.php的樣子:

<?php 
include("C:\wamp\www\social\index.php"); 
// prevent the server from timing out 
set_time_limit(0); 

// include the web sockets server script (the server is started at the far bottom of this file) 
require 'class.PHPWebSocket.php'; 

// when a client sends data to the server 
function wsOnMessage($clientID, $message, $messageLength, $binary) { 
global $Server; 

$Server->log('received message from ' . $Server->wsClients[$clientID]['user']); 

$ip = long2ip($Server->wsClients[$clientID][6]); 

// check if message length is 0 
if ($messageLength == 0) { 
    $Server->wsClose($clientID); 
    return; 
} 

//The speaker is the only person in the room. Don't let them feel lonely. 
if (sizeof($Server->wsClients) == 1){ 
    $item = wire('pages')->get('template=item'); 
    $Server->wsSend($clientID, "There isn't anyone else in the room, but I'll still listen to you. --Your Trusty Server"); 
    $Server->wsSend($clientID, $clientID); 
} 
else 
    //Send the message to everyone but the person who said it 
    foreach ($Server->wsClients as $id => $client) 
     if ($id != $clientID){ 
      $Server->wsSend($id, "Visitor $clientID ($ip) said \"$message\" "); 
     } 
} 

// when a client connects 
function wsOnOpen($clientID) 
{ 
global $Server; 
$ip = long2ip($Server->wsClients[$clientID][6]); 
$Server->wsClients[$clientID]['user'] = wire('user')->name; 
$Server->log("$ip ($clientID) has connected. Username: " . $Server- >wsClients[$clientID]['user']); 

//Send a join notice to everyone but the person who joined 
foreach ($Server->wsClients as $id => $client) 
    if ($id != $clientID){ 
     $Server->wsSend($id, "Visitor $clientID ($ip) has joined the room."); 
    } 
} 

// when a client closes or lost connection 
function wsOnClose($clientID, $status) { 
global $Server; 
$ip = long2ip($Server->wsClients[$clientID][6]); 

$Server->log("$ip ($clientID) has disconnected."); 

//Send a user left notice to everyone in the room 
foreach ($Server->wsClients as $id => $client) 
    $Server->wsSend($id, "Visitor $clientID ($ip) has left the room."); 
} 

function wsOnTest($clientID, $status) { 
global $Server; 
$ip = long2ip($Server->wsClients[$clientID][6]); 

$Server->log("Custom message"); 

//Send a user left notice to everyone in the room 
foreach ($Server->wsClients as $id => $client) 
    $Server->wsSend($id, "Custom message"); 
} 

// start the server 
$Server = new PHPWebSocket(); 
$Server->bind('message', 'wsOnMessage'); 
$Server->bind('open', 'wsOnOpen'); 
$Server->bind('close', 'wsOnClose'); 
$Server->bind('test', 'wsOnTest'); 
// for other computers to connect, you will probably need to change this to your LAN IP  or external IP, 
// alternatively use: gethostbyaddr(gethostbyname($_SERVER['SERVER_NAME'])) 
$Server->wsStartServer('127.0.0.1', 9300); 

?> 

這是一箇中的index.html簡單的聊天應用。正如你可以在server.php和這個文件中看到的,我嘗試過創建一個事件或稱爲test的函數。

<!doctype html> 
<html> 
<head> 
    <meta charset='UTF-8' /> 
    <style> 
     input, textarea {border:1px solid #CCC;margin:0px;padding:0px} 

     #body {max-width:800px;margin:auto} 
     #log {width:100%;height:400px} 
     #message {width:100%;line-height:20px} 
    </style> 
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
    <script src="fancywebsocket.js"></script> 
    <script> 
     var Server; 

     function log(text) { 
      $log = $('#log'); 
      //Add text to log 
      $log.append(($log.val()?"\n":'')+text); 
      //Autoscroll 
      $log[0].scrollTop = $log[0].scrollHeight - $log[0].clientHeight; 
     } 

     function send(text) { 
      Server.send('message', text); 
     } 

     function test(text){ 
      Server.send('test', text); 
     } 

     $(document).ready(function() { 
      log('Connecting...'); 
      Server = new FancyWebSocket('ws://127.0.0.1:9300'); 

      $('#message').keypress(function(e) { 
       if (e.keyCode == 13 && this.value) { 
        log('You: ' + this.value); 
        send(this.value); 
        test(this. value); 

        $(this).val(''); 
       } 
      }); 

      //Let the user know we're connected 
      Server.bind('open', function() { 
       log("Connected."); 
      }); 

      //OH NOES! Disconnection occurred. 
      Server.bind('close', function(data) { 
       log("Disconnected."); 
      }); 

      //Log any messages sent from server 
      Server.bind('message', function(payload) { 
       log(payload); 
      }); 

      Server.bind('test', function(payload) { 
       log(payload); 
      }); 

      Server.connect(); 
     }); 
    </script> 
</head> 

<body> 
    <div id='body'> 
     <textarea id='log' name='log' readonly='readonly'></textarea><br/> 
     <input type='text' id='message' name='message' /> 
    </div> 
</body> 

</html> 

而且是完整的,在fancywebsocket.js

var FancyWebSocket = function(url) 
{ 
    var callbacks = {}; 
    var ws_url = url; 
    var conn; 

    this.bind = function(event_name, callback){ 
     callbacks[event_name] = callbacks[event_name] || []; 
     callbacks[event_name].push(callback); 
     return this;// chainable 
    }; 

    this.send = function(event_name, event_data){ 
     this.conn.send(event_data); 
     return this; 
    }; 

    this.connect = function() { 
     if (typeof(MozWebSocket) == 'function') 
      this.conn = new MozWebSocket(url); 
     else 
      this.conn = new WebSocket(url); 

     // dispatch to the right handlers 
     this.conn.onmessage = function(evt){ 
      dispatch('message', evt.data); 
     }; 

     this.conn.onclose = function(){dispatch('close',null)} 
     this.conn.onopen = function(){dispatch('open',null)} 
    }; 

    this.disconnect = function() { 
     this.conn.close(); 
    }; 

    var dispatch = function(event_name, message){ 
     var chain = callbacks[event_name]; 
     if(typeof chain == 'undefined') return; // no callbacks for this event 
     for(var i = 0; i < chain.length; i++){ 
      chain[i](message) 
     } 
    } 
}; 

所以,如何使事件就像消息,例如郵寄或某事,或者我需要發送數組(JSON)與信息在JSON,我寧可不...

在此先感謝!

+0

對於PHP,我建議您使用http://socketo.me作爲WebSocket解決方案。 – leggetter

回答

0

我討厭這麼說,但你可能應該使用JSON。 websocket協議沒有定義有效載荷的結構,所以沒有「websocket」的方式來做到這一點。但是這已經在WAMP Standard之前完成了,他們的確使用了JSON,特別是JSON數組,其中第一個項目標識了消息類型,例如,歡迎消息:

[ TYPE_ID_WELCOME , sessionId , protocolVersion, serverIdent ] 

我覺得更靈活的執行(你已經提到),會是這樣的

{"name": "overTheLine", "message": "Mark it 8, Dude."} 

所以你可以做這樣的事情

// when a client sends data to the server 
function wsOnMessage($clientID, $message, $messageLength, $binary) { 
    $messageObj = json_decode($message); 
    if (property_exists($messageObj, 'name') 
     and property_exists($messageObj, 'message') 
     and is_callable($messageObj->name)) { 
     $messageObj->name($messageObj->message); 
    } 
... 
} 

// over the line response 
function overTheLine($msg) { 
    return "Mark it zero!"; 
} 

,同樣在客戶端。