Skip to content
Snippets Groups Projects
Select Git revision
  • 091fde0d82064ded9a6fc0f50f00f014451c292d
  • master default
  • neil
  • hpgl
  • sw-shawn-liu
  • ppa
  • fran
  • trotec-port
  • fs-hotfix
  • jake
  • ml-mods
  • fabmo-app
12 results

udpserver.js

Blame
  • udpserver.js 3.21 KiB
    //
    // udpserver.js
    //    WebSocket UDP server
    //
    // Neil Gershenfeld
    // (c) Massachusetts Institute of Technology 2016
    //
    // This work may be reproduced, modified, distributed, performed, and
    // displayed for any purpose, but must acknowledge the mods
    // project. Copyright is retained and must be preserved. The work is
    // provided as is; no warranty is provided, and users accept all
    // liability.
    //
    // check command line
    //
    if (process.argv.length < 4) {
       console.log("command line: node udpserver.js client_address server_port")
       process.exit(-1)
       }
    //
    // get address(es)
    //
    var os = require('os')
    var interfaces = os.networkInterfaces()
    var addresses = []
    for (var i in interfaces) {
       for (var j in interfaces[i]) {
          var address = interfaces[i][j]
          if (address.family === 'IPv4')
             addresses.push(address.address)
          }
       }
    //
    // start server
    //
    var dgram = require("dgram")
    var client_address = process.argv[2]
    var server_port = process.argv[3]
    console.log("listening for connection from client address "+client_address+" on server port "+server_port)
    var WebSocketServer = require('ws').Server
    wss = new WebSocketServer({port:server_port})
    //
    // handle connection
    //
    wss.on('connection',function(ws) {
       //
       // check address
       //
       if (ws._socket.remoteAddress != client_address) {
          console.log("connection rejected from "+ws._socket.remoteAddress)
          ws.send('socket closed')
          ws.close()
          }
       else {
          console.log("connection accepted from "+ws._socket.remoteAddress)
          }
       //
       // handle messages
       //
       var server = null
       ws.on("message",function(message) {
          var msg = JSON.parse(message)
          //
          // open local server
          //
          if (msg.type == 'open local') {
             var port = parseInt(msg.port)
             server = dgram.createSocket("udp4")
             server.bind(port)
             server.on('listening',function() {
                console.log("server listening on port "+port)
                msg = {}
                msg.type = 'listening'
                msg.addresses = addresses
                msg.status = 'listening on '+port
                ws.send(JSON.stringify(msg))
                })
             server.on("message",function(message,info) {
                var msg = {}
                msg.type = 'message'
                msg.message = message.toString('utf8')
                msg.info = info
                ws.send(JSON.stringify(msg))
                })
             server.on("error",function(err) {
                msg = {}
                msg.type = 'status'
                msg.status = 'error: '+JSON.stringify(err)
                ws.send(JSON.stringify(msg))
                })
             }
          //
          // send string
          //
          else if (msg.type = 'send string') {
             var client = dgram.createSocket("udp4")
             client.send(msg.string,0,msg.string.length,msg.port,msg.host,
                function(err) {
                   client.close()
                   msg = {}
                   msg.type = 'status'
                   msg.status = 'transmit ('+JSON.stringify(err)+')'
                   ws.send(JSON.stringify(msg))
                   }
                )
             }
          })
       //
       // close
       //
       ws.on("close",function() {
          console.log("connection closed")
          if (server != null)
             server.close()
          server = null
          })
       })