Websocket

HTML5 incorpora tecnología de websockets:

https://developer.mozilla.org/es/docs/Web/API/WebSocket

Usarla en javascript es fácil. Para el siguiente ejemplo utilizamos la página echo.websocket.org que acepta conexiones y devuelve lo mismo que le mandas (echo)

<!DOCTYPE html>
<meta charset=”utf-8″ />
<title>WebSocket Test</title>
<script language=”javascript” type=”text/javascript”>

var wsUri = “ws://echo.websocket.org/”;
var output;

function init()
{
output = document.getElementById(“output”);
testWebSocket();
}

function testWebSocket()
{
websocket = new WebSocket(wsUri);
websocket.onopen = function(evt) { onOpen(evt) };
websocket.onclose = function(evt) { onClose(evt) };
websocket.onmessage = function(evt) { onMessage(evt) };
websocket.onerror = function(evt) { onError(evt) };
}

function onOpen(evt)
{
writeToScreen(“CONNECTED”);
doSend(“WebSocket rocks”);
}

function onClose(evt)
{
writeToScreen(“DISCONNECTED”);
}

function onMessage(evt)
{
writeToScreen(‘<span style=”color: blue;”>RESPONSE: ‘ + evt.data+'</span>’);
websocket.close();
}

function onError(evt)
{
writeToScreen(‘<span style=”color: red;”>ERROR:</span> ‘ + evt.data);
}

function doSend(message)
{
writeToScreen(“SENT: ” + message);
websocket.send(message);
}

function writeToScreen(message)
{
var pre = document.createElement(“p”);
pre.style.wordWrap = “break-word”;
pre.innerHTML = message;
output.appendChild(pre);
}

window.addEventListener(“load”, init, false);

</script>

<h2>WebSocket Test</h2>

<div id=”output”></div>

HTML5 en los navegadores

Los nuevos estándar HTML5 y CSS3 han incorporado una serie de características interesantes pero, por desgracia, no todos los navegadores las han implementado en la misma medida. Y tenemos el problema de los navegadores antiguos.

Para saber si podemos usar una característica HTML5 es conveniente usar la siguiente página:

www.caniuse.com/

Nos indica a partir de que versión de navegador se puede usar y cual es el porcentaje global.

Si queremos asegurarnos que todos los navegadores usan una característica podemos usar Polyfill. Un polyfill es un código que nos permite ‘simular’ una característica HTML5 en navegadores que no la soporten.

Aquí hay una lista muy actualizada:

https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills

La librería modernizr nos permite saber lo que podemos usar en un navegador:

https://modernizr.com/

Chat socket io

app.js

 

var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);

app.get('/', function(req, res){
  res.sendfile('index.html');
});
users = [];
io.on('connection', function(socket){
  console.log('A user connected');
  socket.on('setUsername', function(data){
    console.log(data);
    if(users.indexOf(data) > -1){
      socket.emit('userExists', data + ' username is taken! Try some other username.');
    }
    else{
      users.push(data);
      socket.emit('userSet', {username: data});
    }
  });
  socket.on('msg', function(data){
      //Send message to everyone
      io.sockets.emit('newmsg', data);
  })
});
http.listen(3000, function(){
  console.log('listening on localhost:3000');
});

index.html

 <!DOCTYPE html>
<html>
 <head><title>Hello world</title></head>
 <script src="/socket.io/socket.io.js"></script>
 <script>
 var socket = io();
 function setUsername(){
 socket.emit('setUsername', document.getElementById('name').value);
 };
 var user;
 socket.on('userExists', function(data){
 document.getElementById('error-container').innerHTML = data;
 });
 socket.on('userSet', function(data){
 user = data.username;
 document.body.innerHTML = '<input type="text" id="message">\
 <button type="button" name="button" onclick="sendMessage()">Send</button>\
 <div id="message-container"></div>';
 });
 function sendMessage(){
 var msg = document.getElementById('message').value;
 if(msg){
 socket.emit('msg', {message: msg, user: user});
 }
 }
 socket.on('newmsg', function(data){
 if(user){
 document.getElementById('message-container').innerHTML += '<div><b>' + data.user + '</b>: ' + data.message + '</div>'
 }
 })
 </script>
 <body>
 <div id="error-container"></div>
 <input id="name" type="text" name="name" value="" placeholder="Enter your name!">
 <button type="button" name="button" onclick="setUsername()">Let me chat!</button>
 </body>
</html>

Ejemplo de multihilo con node

function longRunningOperation(callback) {
// simulate a 3 second operation
setTimeout(callback, 3000);
}

function userClicked() {
console.log(‘starting a long operation’);
longRunningOperation(function () {
console.log(‘ending a long operation’);
});
}
// simulate a user action
userClicked();

 

Cada uno con su closure:

function longRunningOperation(callback) {
// simulate a 3 second operation
setTimeout(callback, 3000);
}

function webRequest(request) {
console.log(‘starting a long operation for request:’, request.id);
longRunningOperation(function () {
console.log(‘ending a long operation for request:’, request.id);
});
}
// simulate a web request
webRequest({ id: 1 });
// simulate a second web request
webRequest({ id: 2 });

IDEs para node

https://www.jetbrains.com/webstorm/

https://netbeans.org/

https://www.visualstudio.com/

https://www.slant.co/topics/46/~best-ides-for-node-js

Intercambio de datos con JSON

Página ciudades PHP:

<?php
include "bd.php";
$pais = filter_input(INPUT_GET, 'pais');
$sql = "select * from city where country_id=" . $pais;
$ciudades = getSqlRows($sql);
echo json_encode($ciudades);

Página html:

 $('#paises').change(function () {
                    $.get('ciudades.php?pais=' + $(this).val(), function (data, status) {
                        var ciudades = JSON.parse(data);

                        $("#ciudades option").remove();

                        for (var d in ciudades) {

                            $('#ciudades').append($('', {
                                value: ciudades[d].city_id,
                                text: ciudades[d].city
                            }));
                        }
                    });
                });

Necesitaré tener lo siguiente:

 <select id="paises">
 <option value="0">Seleccione un país...</option>
 <?php
 foreach ($paises as $pais) {
 ?>
 <option value="<?= $pais['country_id'] ?>"><?= $pais['country'] ?></option>
 <?php
 }
 ?>
 </select>
 <select id="ciudades"><option value="0">Seleccione un país para ver sus ciudades</option></select>

Funciones útiles black jack

 function puntuacion(valores) {
 var tot = 0;
 for (var i = 0; i < valores.length; i++) {
 tot += valor(valores[i]);
 }
 for (var i = 0; i < valores.length; i++) {
 if (valor(valores[i]) == 1 && tot <= 11) {
 tot += 10;
 }
 }
 return tot;
 }
 
 
 
 
 
 function valor(cadena) {
 var v = parseInt(cadena.slice(0, -1));
 if (v > 10)
 v = 10;
 return v;
 }

 function barajar() {
 var palos = ["t", "p", "c", "d"];
 baraja = [];

 for (var i = 1; i <= 13; i++) {
 for (var j = 0; j < 4; j++) {
 baraja.push(i + palos[j]);
 }
 }
 baraja.shuffle(10);
 } ;


 Array.prototype.shuffle = function (num) {
 num = num || 1;
 for (var i = 0; i < num; i++) {
 this.sort(function () {
 return .5 - Math.random();
 });
 }
 };