TCP¶
TCP no se puede usar como tal en VanillaJS, ya que en frontend solo se puede usar HTTP y WebSockets. Por eso hay que usar un runtime como NodeJS o Deno o Bun.
Servidor¶
Hay que usar el modulo net
del core de Node.
- Se crea el servidor con
createServer
- Para gestionar los clientes / conexiones / sockets, la lógica se puede pasar por:
createServer
- A través de una callback con el evento
on('connection')
- El cliente / conexión / socket es del tipo
net.Socket
y se gestiona con eventos:data
es cuando recibe datos.close
es cuando se ha cerrado la conexión.error
es cuando ha habido un error.
- El servidor también se gestiona con eventos:
connection
es opcional, en el sentido de que puede ir dentro decreateServer
.close
cuando se cierra el servidor.
- Para iniciar el servidor hay que usar la función
listen
.
import { createServer, Socket } from 'net'
const PORT = process.env.TCP_SERVER_PORT || 9876
// Server + Connection
const server = createServer((client: Socket) => {
const remoteAddress = `${client.remoteAddress}:${client.remotePort}`
console.log(`TCP SERVER: new client connection from ${remoteAddress}`)
client.on('data', (data: Buffer) => {
console.log(`TCP SERVER: connection data from ${remoteAddress}: ${data}`)
client.write('TCP: SERVER: Received\n')
client.write(data)
})
client.once('close', (hadError: boolean) => {
console.log(`TCP SERVER: connection from ${remoteAddress} closed`)
})
client.on('error', (error: Error) => {
console.log(`TCP SERVER: Connection ${remoteAddress} error: ${error.message}`)
})
})
// Server closed
server.on('close', () => console.error('TCP SERVER: closed connection at', new Date()))
// Start server
server.listen(PORT, () => console.log('TCP SERVER: listening on', server.address()))
import { createServer, Socket } from 'net'
const PORT = process.env.TCP_SERVER_PORT || 9876
// Connection logic
const handleConnection = (client: Socket) => {
const remoteAddress = `${client.remoteAddress}:${client.remotePort}`
console.log(`TCP SERVER: new client connection from ${remoteAddress}`)
client.on('data', (data: Buffer) => {
console.log(`TCP SERVER: connection data from ${remoteAddress}: ${data}`)
client.write('TCP: SERVER: Received\n')
client.write(data)
})
client.once('close', (hadError: boolean) => {
console.log(`TCP SERVER: connection from ${remoteAddress} closed`)
})
client.on('error', (error: Error) => {
console.log(`TCP SERVER: Connection ${remoteAddress} error: ${error.message}`)
})
}
// Server + Connection + Close
const server = createServer()
server.on('connection', handleConnection)
server.on('close', () => console.error('TCP SERVER: closed connection at', new Date()))
// Start server
server.listen(PORT, () => console.log('TCP SERVER: listening on', server.address()))
Cliente¶
El cliente / conexión / socket usa la clase net.Socket
. Una vez se inicia con
la función connect
, se gestiona a través de eventos:
data
es cuando recibe datos.close
es cuando se ha cerrado la conexión.error
es cuando ha habido un error.
import { Socket } from 'net'
const URL = process.env.TCP_SERVER_IP || '127.0.0.1'
const PORT = process.env.TCP_SERVER_PORT || 9876
const client = new Socket()
client.connect(Number(PORT), URL, () => {
console.log('TCP CLIENT: connected')
client.write(`Hello world ${new Date()}`)
})
client.on('data', (data: Buffer) => {
console.log('TCP CLIENT: Received', data.toString('utf8'))
})
client.on('close', (hadError: boolean) => {
console.log('TCP CLIENT: socket closed', new Date())
})