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.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
Приветствую!
Заметил одну странную вещь. Если для сокета не определен обработчик события .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