Replies: 3 comments
-
Добавил еще пример https://github.com/didkovsky/onend/tree/main/tcp-2 Сервер: const { createServer } = require('net')
createServer(socket => {
socket.on('error', console.log)
// Если нет этого обработчика, клиент не сможет завершить сокет.
// socket.on('data', () => {})
socket.on('end', () => console.log('end.'))
socket.on('close', () => console.log('close.'))
setTimeout(() => {
// socket.end()
}, 2000)
setInterval(() => {
socket.write('Data.')
}, 500)
})
.listen(444) Клиент: const { Socket } = require('net')
const socket = new Socket()
socket.on('error', console.log)
socket.on('end', () => console.log('End.'))
socket.on('close', () => console.log('Close.'))
socket.on('data', data => {
console.log(data.toString('utf8'))
/**
* Пытаемся закрыть сокет, когда получаем пакет,
* но если на стороне сервера нет обработчика .on('data')
* данные будут приходить пока сервер сам не закроет сокет.
*/
socket.end()
})
socket.connect({
host: 'localhost',
port: 444
}, () => {
socket.write('Hello!')
}) |
Beta Was this translation helpful? Give feedback.
-
И самый интересный пример: https://github.com/didkovsky/onend/tree/main/http-2 Если сделать простенький http-сервачек и клиент, который будет бесконечно писать данные в сокет, можно убедиться, что res.end() сокет не закрывает. Его можно закрыть только через res.socket.end(), res.destroy() или когда клиент сам его захочет закрыть. Сервер: const { createServer } = require('http')
const server = createServer((req, res) => {
console.log('Request.')
req.on('error', console.log)
req.on('end', () => console.log('End.'))
req.on('close', () => console.log('Close.'))
req.on('data', data => {
console.log(data.toString('utf8'))
res.write('Ok.')
/**
* Не закрывает сокет,
* данные будут приходить пока клиент их будет отправлять
*/
res.end()
// Закроет сокет
// res.socket.end()
// или
// res.destroy()
})
})
/**
* Также, сокет не освобождается из пулла
* при maxConnections = 1 второй клиент
* не сможет подключиться.
*/
server.maxConnections = 1
server.listen(333) Клиент: const { request } = require('http')
const options = {
host: 'localhost',
port: 333,
method: 'POST',
path: '/'
}
const req = request(options, response => {
response.on('error', console.log)
response.on('data', data => console.log(data.toString('utf8')))
response.on('end', () => console.log('End.'))
})
req.on('error', console.log)
setInterval(() => {
req.write('Hello.')
}, 1000)
// Не завершаем запрос
// req.end() |
Beta Was this translation helpful? Give feedback.
-
Приветствую!
Заметил одну странную вещь. Если для сокета не определен обработчик события .on('data') то события .on('end') и .on('close') не приходят. Пример:
Сервер:
Клиент:
В http поведение чуть другое. Событие не срабатывает в случае, если клиент завершил соединение, но если соединение мы закрыли со стороны сервера (res.end('Ok.')) тогда .on('end') приходит.
Сервер:
Клиент:
Репозиторий с примерами: https://github.com/didkovsky/onend
Beta Was this translation helpful? Give feedback.
All reactions