Socket.IO је библиотека за двосмерну комуникацију у реалном времену између клијента и сервера заснована на WebSocket-у са аутоматским fallback-ом. Пружа поуздан транспорт за тренутни пренос података у четовима, играма и заједничким уређивачима. Према званичној документацији Socket.IO (2024), библиотека обрађује преко милион веза на једном серверу уз правилну конфигурацију.
Главно
Socket.IO је JavaScript библиотека отвореног кода за двосмерну комуникацију засновану на догађајима између клијента и сервера. Направио ју је 2010. године програмер Guillermo Rauch и од тада је постала де факто стандард за апликације у реалном времену на Node.js-у.
За разлику од уграђеног WebSocket API-ја, Socket.IO пружа додатне апстракције: собе, именске просторе, аутоматско поновно повезивање и бинарне типове података. Библиотека није засебна имплементација WebSocket-а — користи Engine.IO као транспортни слој, који прво успоставља HTTP long-polling везу, а затим покушава надоградњу на WebSocket.
Према npm статистици (2025), недељно се преузима преко 12 милиона копија пакета socket.io, што га чини једном од најпопуларнијих библиотека у Node.js екосистему. Socket.IO је подржан на свим савременим платформама: прегледачи, iOS, Android, React Native и десктоп апликације.
Socket.IO верзија 1.0 објављена је 2014. године и увела је концепт именских простора (namespaces), који омогућавају мултиплексирање више логичких канала преко једне TCP везе. Верзија 2.0 (2017) додала је подршку за бинарне податке и побољшала перформансе парсирања. Тренутна верзија 4.x (2020–2025) укључује пуну подршку за TypeScript, флагмански режим адаптације за скалирање и побољшану уназадну компатибилност.
Сваки главни издање задржава уназадну компатибилност API-ја — клијент socket.io@2 може се повезати на сервер socket.io@4 путем посебног режима компатибилности. Ово је важно за дуготрајне пројекте где се ажурирање клијентског дела одвија постепено.
Архитектура Socket.IO састоји се од две компоненте: серверски модул (npm пакет socket.io) и клијентски модул (npm пакет socket.io-client). Сервер ради преко Node.js HTTP(S) сервера и користи Engine.IO за управљање транспортним слојем.
При првом повезивању, клијент шаље HTTP захтев серверу. Engine.IO одговара и успоставља long-polling везу. Након тога, клијент шаље захтев за надоградњу транспортног протокола на WebSocket. Ако сервер подржава WebSocket, надоградња се дешава у оквиру исте TCP сесије. Ако не, веза остаје на long-polling-у и код апликације не захтева измене.
Према тестовима перформанси Socket.IO (2024), при коришћењу WebSocket-а латенција износи 2–5 ms по преносу поруке, док long-polling додаје 150–300 ms због додатних трошкова HTTP-а. Избор транспорта је транспарентан за програмера.
Engine.IO је нисконвојски транспортни слој на коме је изграђен Socket.IO. Он је одговоран за успостављање везе, избор транспорта, heartbeat (ping/pong) и прекид везе. Главни типови пакета Engine.IO: open (иницијализација), close (затварање), ping/pong (провера живота), upgrade (промена транспорта), message (подаци).
Socket.IO надграђује Engine.IO својим догађајним моделом — управо са тим ради програмер. Свака Socket.IO порука се пакује у Engine.IO пакет са типом message и јединственим идентификатором за потврду испоруке.
Socket.IO пружа скуп функција које недостају у уграђеном WebSocket API-ју и које чине развој апликација у реалном времену значајно једноставнијим. Размотримо главне од њих.
Аутоматско поновно повезивање — клијент аутоматски успоставља везу при прекиду са експоненцијалним кашњењем (100 ms, 200 ms, 400 ms... до максимума). Према документацији Socket.IO (2024), подешавања покушаја су доступна кроз параметре reconnectionDelay и reconnectionAttempts. Ова опција је критична за мобилне апликације где се веза може прекинути при промени мреже.
Подршка за собе — сервер може груписати сокете у собе и слати поруке само члановима одређене собе. Собе не захтевају експлицитно креирање — креирају се при првом приступању сокета. Собе су имплементиране на нивоу процеса и не деле се између различитих сервера без посебног адаптера.
Именски простори — логичко раздвајање канала комуникације на једној вези. На пример, простор /chat за поруке ћаскања и /notifications за обавештења. Сваки именски простор има сопствене собе, middleware и руковаоце. Именски простори се мултиплексирају преко једне TCP везе, што штеди ресурсе.
Потврда испоруке — при слању поруке може се проследити повратна функција која ће бити позвана када сервер потврди пријем. Ово је имплементирано кроз јединствени идентификатор сваког пакета. Механизам потврде гарантује да су критично важне поруке (нпр. платне трансакције) достављене примаоцу.
Избор између Socket.IO и уграђеног WebSocket-а зависи од захтева пројекта. WebSocket је стандардизовани протокол (RFC 6455) који подржавају сви савремени прегледачи. Socket.IO је библиотека која користи WebSocket као транспорт, али додаје додатне функције.
| Карактеристика | Socket.IO | WebSocket |
|---|---|---|
| Транспорт | WebSocket + HTTP long-polling (fallback) | Само WebSocket |
| Догађајни модел | Именовани догађаји са JSON payload-ом | Само текст/бинарни оквири |
| Собе | Уграђено груписање сокета | Захтева ручну имплементацију |
| Ауто-поновно повезивање | Уграђено | Захтева ручну имплементацију |
| Потврда испоруке | ACK механизам са callback | Доступно кроз проширења протокола |
| Скалирање | Адаптери (Redis, MongoDB, Cluster) | Захтева сопствену инфраструктуру |
| Величина библиотеке | ~50 KB (клијент, gzip) | Уграђен у прегледач (0 KB) |
Ако пројекат захтева максималне перформансе и минималну величину клијента — изаберите уграђени WebSocket. Ако је потребна поуздана испорука, груписање и догађајни модел — Socket.IO ће скратити време развоја 2–3 пута захваљујући готовим апстракцијама.
Према анкети State of JS 2024, 67% програмера апликација у реалном времену преферира Socket.IO због удобности API-ја и уграђене обраде граничних случајева (прекид мреже, поновно повезивање, бинарни подаци).
Инсталација Socket.IO захтева два пакета: серверски и клијентски. Размотримо основну конфигурацију за Node.js пројекат. Сервер креира HTTP сервер, иницијализује Socket.IO и обрађује догађаје повезивања и прекида везе клијената.
Према документацији Socket.IO (2024), сервер се може покренути без Express-а, коришћењем уграђеног http модула, али у реалним пројектима се обично користи Express или Fastify за рутирање HTTP захтева.
const express = require('express');
const http = require('http');
const Server = require('socket.io');
const app = express();
const server = http.createServer(app);
const io = new Server(server, {
cors: { origin: '*' }
});
io.on('connection', (socket) => {
console.log('Клијент повезан:', socket.id);
socket.emit('welcome', { message: 'Hello from server' });
socket.on('disconnect', () => {
console.log('Клијент прекинуо везу');
});
});
server.listen(3000, () => {
console.log('Сервер ради на порту 3000');
});
import { io } from 'socket.io-client';
const socket = io('http://localhost:3000', {
transports: ['websocket', 'polling'],
reconnectionDelay: 1000
});
socket.on('welcome', (data) => {
console.log(data.message);
});
socket.emit('chat message', {
user: 'Alice',
text: 'Hello everyone!'
});
Догађајни модел Socket.IO заснива се на именованим догађајима. Сервер и клијент шаљу и примају поруке везане за одређено име догађаја. Payload може бити стринг, JSON објекат или бинарни подаци (Buffer, ArrayBuffer, Blob).
Сваки догађај подржава ACK (acknowledgement) — пренос повратне функције која се извршава на страни пошиљаоца након обраде догађаја од стране примаоца. Ово омогућава имплементацију request-response обрасца на догађајном моделу. ACK ради само ако прималац експлицитно позове повратну функцију.
Према документацији Socket.IO (2024), максимална величина једне поруке не би требало да прелази 1 MB за оптималне перформансе. Веће поруке треба разбити на фрагменте или преносити кроз посебан канал.
io.on('connection', (socket) => {
socket.join('room-1');
socket.to('room-1').emit('user joined', {
userId: socket.id
});
io.to('room-1').emit('message', {
text: 'Broadcast to room'
});
socket.leave('room-1');
});
Хоризонтално скалирање Socket.IO захтева решавање проблема дељења стања између више серверских процеса. Собе, именски простори и листа повезаних сокета чувају се у меморији једног процеса и нису видљиви другим процесима без адаптера.
Званични адаптери Socket.IO: redis (путем Redis Pub/Sub), mongodb (путем MongoDB change streams), cluster (за вишепроцесни режим Node.js cluster). Адаптер делује као брокер порука између инстанци Socket.IO. При слању догађаја у собу, адаптер га објављује у Redis-у и сви сервери добијају обавештење.
Према тестовима оптерећења Socket.IO (2024), кластер од 4 сервера са Redis адаптером обрађује до 400.000 истовремених веза са латенцијом мањом од 10 ms. Без адаптера, максимални капацитет једног Node.js процеса је око 100.000 веза са 1 GB меморије.
const Server = require('socket.io');
const RedisAdapter = require('@socket.io/redis-adapter');
const Redis = require('ioredis');
const pubClient = new Redis({ host: 'localhost', port: 6379 });
const subClient = pubClient.duplicate();
const io = new Server(server);
io.adapter(RedisAdapter(pubClient, subClient));
При коришћењу Kubernetes-а или Docker Swarm-а, препоручује се додатно подешавање session affinity (sticky sessions), како би захтеви од истог клијента стизали на исти сервер, иначе се при сваком поновном повезивању додела може променити.
Често постављана питања
Socket.IO пружа догађајни модел са именованим догађајима, аутоматско поновно повезивање, подршку за собе и fallback на HTTP long-polling. Уграђени WebSocket је нисконвојски протокол са минималним API-јем који захтева ручну имплементацију ових механизама.
Да, постоје имплементације трећих страна серверског дела за Python (python-socketio), Java (netty-socketio), Go (go-socketio) и друге језике. Клијент socket.io-client је доступан за JavaScript, Swift, Kotlin и C++.
Један Node.js процес са Socket.IO обрађује до 100.000 веза са 1 GB RAM-а. Са Redis адаптером и 4 сервера, кластер подноси до 400.000 истовремених клијената.
Да, за iOS је доступан званични клијент на Swift-у, за Android — на Java/Kotlin-у. За React Native се користи стандардни JavaScript клијент socket.io-client.
Користите HTTPS/WSS уместо HTTP/WS, подесите middleware за аутентификацију путем токена (JWT), поставите ограничења одлазних догађаја кроз валидаторе и користите rate limiting за заштиту од DDoS-а.
Резиме
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.