Code

Inviare dati da C# Desktop al Web tramite WebSocket

12 Agosto 2015 - 3 minuti di lettura

Giulio Roggero spiega passo per passo come esporre dati live da un’applicazione C# console a un browser Web usando le WebSocket. L’esempio è stato testato su un sistema operativo Windows 7.

Sul sito Isola Software trovate lo stesso articolo pubblicato in inglese ben tre anni fa, quando ancora non esistevano librerie stabili per le WebSocket in .NET.

La soluzione rimane comunque ancora valida qualora non si volessero usare librerie .NET.

Installazione di NodeJs e Socket.IO

Tutto si basa su Node.js.
Di seguito i link, evitando di entrare nel dettaglio sull’installazione di node su Windows:

Al Windows PATH ricordarsi di aggiungere la directory ;C:\Program Files\NodeJS.

Per accedere al prompt di Node.js, eseguire command prompt (cmd) dopodiché digitare node (come mostrato di seguito):

C:\Users\roggero>node
>

Per uscire, digitare due volte CTRL+C.

Il codice sorgente

Tutto il codice dell’esempio è scaricabile da questo link. Comprende:

  • il WebSocket Gateway (ws.js) e UDP server scritto in Node.js;
  • la pagina index.html, servita da ws.js, che visualizza i dati;
  • la Console Application (desktop.cs), sviluppata in C# (IDE Visual Studio 2010 o superiori) che scrive sulla socket UDP (il contatore è aggiornato ogni 50ms).

WebSocket gateway sulla porta 8070

var app = require('http').createServer(handler), io = require('socket.io').listen(app) , fs = require('fs');
var mysocket = 0; app.listen(8070);
function handler (req, res) {
  fs.readFile(__dirname + '/index.html', function (err, data) {
    if (err) {
      res.writeHead(500);
      return res.end('Error loading index.html');
    }
    res.writeHead(200);
    res.end(data);
  });
}
io.sockets.on('connection', function (socket) {
  console.log('index.html connected');
  mysocket = socket;
});

UDP server sulla porta 41181

var dgram = require("dgram");
var server = dgram.createSocket("udp4");
  server.on("message", function (msg, rinfo) {
  console.log("msg: " + msg);
  if (mysocket != 0) {
    mysocket.emit('field', "" + msg);
    mysocket.broadcast.emit('field', "" + msg);
  }
});
server.on("listening", function () {
  var address = server.address();
  console.log("udp server listening " + address.address + ":" + address.port);
});
server.bind(41181);

Index.html

<html>
<head>
<script src=”http://code.jquery.com/jquery-1.7.2.min.js”></script>
<script src=”/socket.io/socket.io.js”></script>
</head>
<body>
<script> var socket = io.connect(‘http://localhost’); socket.on(‘field’, function (data) { console.log(data); $(“#field”).html(data); });
</script>
Data: <div id=”field”></div>
</body>
</html>

Desktop.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace desktop {
  class Desktop {
    // TODO: check all errors
    static void Main(string[] args) {
      Int32 counter = 0;
      while (true) {
        SendUDP("127.0.0.1", 41181, counter.ToString(), counter.ToString().Length);  
        Thread.Sleep(50);
        counter++;
      }
    }
    public static void SendUDP(string hostNameOrAddress, int destinationPort, string data, int count) {
      IPAddress destination = Dns.GetHostAddresses(hostNameOrAddress)[0];
      IPEndPoint endPoint = new IPEndPoint(destination, destinationPort);
      byte[] buffer = Encoding.ASCII.GetBytes(data);
      Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
      for (int i = 0; i < count; i++) {
        socket.SendTo(buffer, endPoint);
      }
      socket.Close();
      System.Console.WriteLine("Sent: " + data);
    }
  }
}

Let’s the magic happens

Per provare il tutto:

  • da command prompt, digitare node ws.js;
  • eseguire desktop.exe;
  • aprire un browser web e andare all’indirizzo http://localhost:8070.

Qui il video della dimostrazione del sistema fatta da Giulio.

Articolo scritto da