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 WebSocket class takes a function (or class method) as callback for every socket action, for this example i use the process method of the WebsocketChat Class:

 
$chat = new WebsocketChat();
// new WebSocketServer( socket address, socket port, callback function )
$webSocket = new WebSocketServer("84.38.67.247", 8081, array($chat, 'process'));
$webSocket->run();

The WebsocketChat Class handles user actions and messages. We have two actions: ‘login’ and ‘chat’. ‘login’ happens when a new user sets his username, ‘chat’ is always when a user sends a new message:

 
Class WebsocketChat {

	/**
	 * @var array
	 */
	private $messages = array();

	public function process($user, $msg, $server){

		$msg = json_decode($msg);

		if ($msg->action == 'login') {

		}

		if ($msg->action == 'chat') {

		}
	}
}

On the client-side we have to send the right actions if someone clicks ‘login’ or ‘send message’.

 
$('#chat').submit(function(evt){
	evt.preventDefault();
	send({'action':'chat', 'text':$('[name=text]').val()});
});

$('#login').submit(function(evt){
	evt.preventDefault();
	send({'action':'login', 'username':$('[name=username]').val()});
	$('#chat').show();
	$('#login').hide();
});

The login action adds a new chat user to the user-array and loads the last five messages for this new user.

 
if ($msg->action == 'login') {
	$user->data['username'] = filter_var($msg->username, FILTER_SANITIZE_STRING);

	$max = 5;
	if (count($this->messages)<5)
		$max = count($this->messages);

	// on login send last five chat messages
	for($i=count($this->messages)-$max; $i<count($this->messages); $i++) {
		$server->send($user->socket, (string) $this->messages[$i]);
	}
}

If the ‘chat’ action is called then add a new WebsocketChatMessage to the message array and send it to all current chat-users:

 
if ($msg->action == 'chat') {
	$text = filter_var($msg->text, FILTER_SANITIZE_STRING);	
	$lastMessage = new WebsocketChatMessage($user->data['username'], $text, time());

	$user->data['message'][] = $this->messages[] = $lastMessage;

	foreach($server->getUsers() as $user){
		$server->send($user->socket, (string) $lastMessage);
	}			
}

The WebsocketChatMessage is just a container-class for holding the message data:

 
Class WebsocketChatMessage {

	public $text = '';

	public $timestamp = 0;

	public $username = '';

	public function __construct($username, $text, $timestamp) {
		$this->text = $text;
		$this->username = $username;
		$this->timestamp = $timestamp;
	}

	public function __toString() {
		return sprintf('%s %s: %s', strftime('%H:%M', $this->timestamp), $this->username, $this->text);
	}
}

View Chat Example on BOHUCO Labs

View server.php Code

Copy from bohuco.net/blog/2011/01/php5-websocket-example-a-simple-chat/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s