jsrosetta

I/O

UDP Server

How Node.js's dgram.createSocket compares to net.ListenUDP (Go), UdpSocket (Rust), Network.framework (Swift), and DatagramSocket (Java) for receiving datagrams.

Minimum versions
Node.js ≥ 12.20Go ≥ 1.0Rust ≥ 1.58Swift ≥ 5.7Java ≥ 25
Verified on
Node.js 24.12.0Go 1.27.1Rust 1.98.1Swift 6.2.4Java 25.0.4.1

Node.js code is an ES module: save it as .mjs or set "type": "module" in package.json.

UDP is a connectionless protocol: there's no Accept() to wait for a client, and each datagram carries the sender's address with it. Node.js uses the dgram module with a 'message' event, Go and Rust read directly with ReadFromUDP/recv_from in a loop, Swift again uses Network.framework (Foundation has no raw UDP socket API), and Java uses DatagramSocket/DatagramPacket, available since its earliest versions.

Datagram server

import dgram from 'node:dgram'
 
const server = dgram.createSocket('udp4')
 
server.on('error', err => {
  console.error(err)
  server.close()
})
 
server.on('message', (msg, rinfo) => {
  const data = msg.toString('utf8').trim()
  console.log(`received: ${data} from ${rinfo.address}:${rinfo.port}`)
})
 
server.on('listening', () => {
  const address = server.address()
  console.log(`server listening ${address.address}:${address.port}`)
})
 
server.bind(3000)
$ node udp_server.js
server listening 0.0.0.0:3000
received: hello world from 127.0.0.1:59740
 
$ go run udp_server.go
server listening [::]:3000
received: hello world from 127.0.0.1:52082
 
$ cargo run
server listening 0.0.0.0:3000
received: hello world from 127.0.0.1:53544
 
$ swift udp_server.swift
server listening 0.0.0.0:3000
received: hello world from 127.0.0.1:52756
 
$ java Main.java
server listening 0.0.0.0:3000
received: hello world from 127.0.0.1:55056

Reference: github.com/miguelmota/golang-for-nodejs-developers#udp-server