PHP5 WebSocket Example – A Simple Chat
The classic example for websockets is a chat. This chat example has only 200 lines of code (excl. the Websocket class), is really easy to understand and customizable.
The classic example for websockets is a chat. This chat example has only 200 lines of code (excl. the Websocket class), is really easy to understand and customizable.
Auf Anfrage einiger Leser habe ich jetzt die Klasse kommentiert und Informationen zur Lizenz hinzugefügt. An der Funktionalität hat sich nichts geändert. Die aktuelle Version 1.0.5 ist unter folgender URL zu finden: http://bohuco.net/labs/php-websocket-class/lib/WebSocketServer1.0.5.php.txt
WebSockets are the new cool boys in town, but the specs are in a very early state and so it’s hard to keep up to date with the different browser implementations …
my parkinson is still anmnnnciokalpw wj15455f32d
HTML5 WebSockets makes it possible to open a persistent connection to a server within a web-browser via javascript.
Firefox can’t open the connection for the same reason Chrome 6 dev can’t open the connection. You have implemented version -75 of the protocol (which Safari 5 and Chrome 5 use), while Firefox and Chrome 6 dev support version -76.
Thanks zcorpan for your advice … i have recoded my class, now it works with the new Firefox 4 Beta too.
it was very interesting to read.
I want to quote your post in my blog. It can?
And you et an account on Twitter?
Hey, nice introduction to websockets thanks
I have successfully implemented some examples but they only work from localhost.
How can i tell apache/php to allow socket connections beyond localhost?
I don’t understand the need for the eval:
[ eval('var data = ' + msg.data + ';'); ]
why can’t you just do a real var data = msg.data?
msg.data contains JSON as string … with eval i convert it to a real javascript object
Hi skybinary,
Please ensure that the socket is not just listening for localhost calls.
e.g., let’s say you are working with port 8181. Then if you type within a terminal ‘netstat -an | grep LISTEN’ and
you see something like this ’127.0.0.1:8181′ that’s the root of your problem.
So if you want to permit any incoming connection you should do something like this:
$webSocket = new WebSocketServer(“0.0.0.0″, 8181, ‘process’);
opening two windows with the example doesn’t seem to work.
The first Window works but the second one not.
Is it required and possible to set any parameter for the concerned window?
After reloading both Browser-Windows it works and I get both cursers shown while the active one is correctly changeable while the other one is passive.
In a list on the pic the IPs (surely the same) and the cursors are shown.
Question is:
1) how are the windows divided by the script
2) why both windows had to be reloaded and why in the beginning just reloading the 2nd window didn’t show any cursor?
Hi David, which browser (+ version) do you use? If you try with one chrome-window and one chrome inkognito window it should work … or two different browsers.
Hello, very thanks you for this! work!
But i’m too trying PHP WebSocket(http://code.google.com/p/phpwebsocket/) simple example(Chat) but don’t work and i’m get error: Error: INVALID_STATE_ERR: DOM Exception 11
And status is: WebSocket – status 0
Maybe know how to fix this ?
Thanks for this and Good Luck!
Thanks Ldup for your question. I have nothing to do with this project, but i can see that the maintainer is working on the project and he usually answers questions very quick.
Hi, i have a problem with a scripts that is almost the same as yours. The eval function of the very first message received from the server gives me an Unexpected token ILLEGAL error. But all the other messages after the first one work great. When I read the first message with a console.log(msg.data) there is absolutely nothing strange in this message. Is there something special with the first message sent by the server?
Hi,
i have the same problem as Yves : the first message sent by the server raise always a onerror event on the client, the others messages works fine after… really strange… (chrome version 8.0.552.224)
Thank you
Thanks for the comments, i can reproduce the problem and a quickfix is to wrap the eval in a try/catch block. i will look into the problem later, there seems to be a “hidden” char in the response …
Do you plan to ad “wss” feature?
this is the only option working for me behind firewall, simple “ws” fail to connect
an error is occurring on the server can not answer the socket.
php_exif.dll disabled the dll file that was giving error zend parameter in the library.
I am using windows xp and windowdows 7 the same error.
I’m from Brazil my net is networked to another pc
image the error : http://img218.imageshack.us/i/imagemyj.gif/
solve the problems agora ta All ok
thanks for posting can clear my doubts valew old ^ ^
thanks for posting this beautiful work.
is being dealt a new server database that connects with
javascript
his name is jwebsocket a very good api
to be compatible with Internet Explorer 6,7,8,9.
How does this work? From the little I know about php the script gets called each time a browser opens an page. I understand that the server.php calls run so it doesn’t return like simple php scripts, but why aren’t there server instances for every user calling this script? Is it that the “require_once” makes only the first call of the script work and the other silently fail so there is only one server object? I don’t understand why there are not many WebSocketServer objects with each having only 1 client.
(Sorry for my bad english, I’m out of training)
that is not a”typical” php-script which is opened in the browser via http … its a command line script, you can run it for example under linux oder mac osx via “php -q server.php” (if php is installed on the computer) … in this script is a endless-loop, so it runs until it is stopped with Crtl-C … hope that helps
I have problem with this function – private function wrap($msg=”") { return chr(0).$msg.chr(255); }
I get all info and at the end is this char – ÿ which is chr(255).
Therefore at the client side I get error – “Invalid char”. If I remove “chr(255)” char “ÿ” is removed, but client side doesn’t work either.
Hey, i’m tryng to get this to work.
It still doesnt, and the reason is that crappy ‘hidden character’ that prevents json to be effectively interpreted, thus not appearing in the reply itself.
here is the discovery:
http://stackoverflow.com/questions/4880273/character-in-front-of-websocket-message
But not the solution.I’m still looking for a good one to implement, or a way to get rid of that piece.
Found a solution: by js, just use the replace function of javascript example, assume msg is the string returned by websocket.message function
msg = $.parseJSON(msg.data.replace(”, ”));
or, without jquery:
msg = JSON.parse(msg.data.replace(”, ”));
Hope someone will find this helpful to someone.
Sorry, but the ascii code got interpreted.
Between the first ” in the code, insert
0
without the space between, it will work, giving back your Json content.
Fixed memory leak on message quantity:
Class WebsocketChatMessage {
….
// Added destructor
public function __destruct() {
echo “menya stiraut ” . $this->text . “n”;
unset($this->text);
unset($this->username);
unset($this->timestamp);
}
// End of added destructor
….
}
and in
Class WebsocketChat {
…
//added message limit
private $maxmessage = 10;
//End of changes in variables
….
if ($msg->action == ‘chat’) {
$text = filter_var($msg->text, FILTER_SANITIZE_STRING);
$lastMessage = new WebsocketChatMessage($user->data['username'], $text . ” memory state ” . memory_get_usage(), time());
$user->data['message'][] = $this->messages[] = &$lastMessage;
//Begin of cleaning Checking if messages is too much
if (count($this->messages) > $this->maxmessage) {
//Cleaning old messages
array_splice($this->messages, 0, 1);
array_splice($user->data['message'], 0, 1);
}
//End of Cleaning
}
}
}
now the memory usage is clean and correct the script will live!
now who can help me with wss?
i mean SSL for web stocket workaround.
I got ‘StartListening: Unable to bind socket – Address already in use.’ error when php -q server.php command execute in terminal.So web socket is not working.
Please give me direction how can i test web socket properly working or not.
Thank You
How much better is this than Ajax JSON callbacks?
How much better is this than Ajax JSON callbacks?
Could you please update the code to support the new hybi-10 draft?
Could you please update the code to support the new hybi-10 draft?
function hybi_decode($data){
$bytes = $data;
$data_length = “”;
$mask = “”;
$coded_data = “” ;
$decoded_data = “”;
$data_length = $bytes[1] & 127;
if($data_length === 126){
$mask = substr($bytes, 4, 8);
$coded_data = substr($bytes, 8);
}else if($data_length === 127){
$mask = substr($bytes, 10, 14);
$coded_data = substr($bytes, 14);
}else{
$mask = substr($bytes, 2, 6);
$coded_data = substr($bytes, 6);
}
for($i=0;$i<strlen($coded_data);$i++){
$decoded_data .= $coded_data[$i] ^ $mask[$i%4];
}
return $decoded_data;
}
function hybi_encode($data)
{
$frame = Array();
$encoded = "";
$frame[0] = 0×81;
$data_length = strlen($data); if($data_length > 8;
$frame[3] = $data_length & 0xFF;
} for($i=0;$i<sizeof($frame);$i++){
$encoded .= chr($frame[$i]);
} $encoded .= $data;
return $encoded;
}
function hybi_decode($data){
$bytes = $data;
$data_length = “”;
$mask = “”;
$coded_data = “” ;
$decoded_data = “”;
$data_length = $bytes[1] & 127;
if($data_length === 126){
$mask = substr($bytes, 4, 8);
$coded_data = substr($bytes, 8);
}else if($data_length === 127){
$mask = substr($bytes, 10, 14);
$coded_data = substr($bytes, 14);
}else{
$mask = substr($bytes, 2, 6);
$coded_data = substr($bytes, 6);
}
for($i=0;$i<strlen($coded_data);$i++){
$decoded_data .= $coded_data[$i] ^ $mask[$i%4];
}
return $decoded_data;
}
function hybi_encode($data)
{
$frame = Array();
$encoded = "";
$frame[0] = 0×81;
$data_length = strlen($data); if($data_length > 8;
$frame[3] = $data_length & 0xFF;
} for($i=0;$i<sizeof($frame);$i++){
$encoded .= chr($frame[$i]);
} $encoded .= $data;
return $encoded;
}
Hi
Please anyone who knows post how to get the “New URL for Example” working.
I love to see working things before troubleshooting it on my pc later.
I love websockets!
matt
Hi
Please anyone who knows post how to get the “New URL for Example” working.
I love to see working things before troubleshooting it on my pc later.
I love websockets!
matt
source code not showing
Der SproutCore Erfinder Charles Jolley verlässt Apple und gründet ein Unternehmen das sich mit der Entwicklung neuer Rich-Web Applikationen auf HTML5-basis beschäftigen wird.
Die erste Beta-Version von Firefox 4.0 bringt einige neue geile Technologien für Web-Entwickler. Via WebM und HTML5 können jetzt HD-Videos ohne zusätzliches Plugin im Browser angezeigt werden. Der neue HTML5 Parser wurde schneller gemacht und kann jetzt Inline-SVG und MathML.
I have to say, I enjoy reading your site. Maybe you could let me know how I can subscribing with it ? Also just thought I would tell you I found your page through yahoo.
“Die XHTML2 Arbeitsgruppe wird aufgelöst”, das ging heute durch die Fachmedien. XHTML2 war von Anfang an ein typisches “Gut gemeint”-Projekt, und wie wir wissen ist “gut gemeint” das genaue Gegenteil von “gut gemacht”. Alles sollte durchdacht und perfekt werden, dabei hatte man sich schnell von der praktischen Anwendbarkeit verabschiedet und ist in theoretische Undurchsichtigkeit abgeglitten.
Thanks so much. I was having some real problems with my handshake.