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,我寧可不...
在此先感謝!
對於PHP,我建議您使用http://socketo.me作爲WebSocket解決方案。 – leggetter