Kategori: Programming | Perkiraan waktu baca: 8 menit
Kadang solusi paling praktis itu yang paling sederhana. Di lingkungan kerja saya, ada kebutuhan komunikasi cepat antar-tim di area yang sama, tapi kadang koneksi internet kantor kurang stabil, atau ada concern soal data internal yang sebaiknya nggak lewat platform pihak ketiga sama sekali. Solusinya: bikin aplikasi chat yang jalan murni di jaringan lokal (LAN), tanpa butuh internet sama sekali.
Ini proyek yang jauh lebih sederhana dibanding ARIA yang saya bahas sebelumnya, tapi prinsip "jalan mandiri tanpa cloud" nya mirip.
Kenapa LAN-Only?
- Nggak bergantung internet — tetap jalan meski koneksi ISP kantor down
- Privasi — data chat nggak pernah keluar dari jaringan internal
- Latency sangat rendah — karena semua device ada di jaringan yang sama, respon nyaris instan
- Setup sederhana — nggak perlu domain, SSL certificate, atau hosting cloud
Stack yang Dipakai
- Backend: Node.js + Socket.io, dijalankan di satu komputer/server lokal di jaringan
- Database: SQLite, untuk simpan histori chat secara lokal
- Frontend: HTML/CSS/JS sederhana, diakses lewat browser dari device manapun yang terhubung ke jaringan yang sama
Setup Server
mkdir lan-chat-app
cd lan-chat-app
npm init -y
npm install express socket.io better-sqlite3
const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const Database = require('better-sqlite3');
const app = express();
const server = http.createServer(app);
const io = new Server(server);
const db = new Database('chat.db');
db.exec(`
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT,
message TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
`);
app.use(express.static('public'));
io.on('connection', (socket) => {
console.log('User terhubung:', socket.id);
// Kirim histori chat ke user yang baru connect
const history = db.prepare('SELECT * FROM messages ORDER BY id DESC LIMIT 50').all();
socket.emit('chat-history', history.reverse());
socket.on('send-message', (data) => {
db.prepare('INSERT INTO messages (username, message) VALUES (?, ?)').run(data.username, data.message);
io.emit('new-message', {
username: data.username,
message: data.message,
timestamp: new Date().toISOString(),
});
});
socket.on('disconnect', () => {
console.log('User terputus:', socket.id);
});
});
server.listen(3000, '0.0.0.0', () => {
console.log('Server jalan di semua interface, port 3000');
});
Penting: server.listen(3000, '0.0.0.0', ...) — dengan 0.0.0.0, server bisa diakses dari device lain di jaringan yang sama, bukan cuma dari komputer server itu sendiri.
Frontend Sederhana
<!DOCTYPE html>
<html>
<head>
<title>LAN Chat</title>
<style>
body { font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; }
#messages { height: 400px; overflow-y: auto; border: 1px solid #ccc; padding: 10px; margin-bottom: 10px; }
.message { margin-bottom: 8px; }
.username { font-weight: bold; color: #2F6FED; }
input, button { padding: 10px; font-size: 14px; }
#messageInput { width: 70%; }
</style>
</head>
<body>
<h2>LAN Chat</h2>
<div id="messages"></div>
<input type="text" id="usernameInput" placeholder="Nama kamu" value="User">
<input type="text" id="messageInput" placeholder="Ketik pesan...">
<button onclick="sendMessage()">Kirim</button>
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
const messagesDiv = document.getElementById('messages');
socket.on('chat-history', (history) => {
history.forEach(displayMessage);
});
socket.on('new-message', displayMessage);
function displayMessage(data) {
const div = document.createElement('div');
div.className = 'message';
div.innerHTML = `<span class="username">${data.username}:</span> ${data.message}`;
messagesDiv.appendChild(div);
messagesDiv.scrollTop = messagesDiv.scrollHeight;
}
function sendMessage() {
const username = document.getElementById('usernameInput').value || 'Anonim';
const message = document.getElementById('messageInput').value;
if (!message) return;
socket.emit('send-message', { username, message });
document.getElementById('messageInput').value = '';
}
</script>
</body>
</html>
Cara Diakses dari Device Lain
Setelah server jalan, cek IP lokal komputer server (misal 192.168.1.10), lalu device lain di jaringan WiFi/LAN yang sama tinggal buka browser dan akses:
http://192.168.1.10:3000
Nggak perlu install apapun di sisi client — cukup browser biasa.
Fitur Tambahan yang Bisa Dikembangkan
Versi dasar di atas sudah cukup untuk chat sederhana, tapi beberapa hal yang bisa ditambahkan kalau butuh lebih lengkap:
- Room/channel terpisah — pakai Socket.io namespace atau room untuk pisahkan percakapan per tim/topik
- Typing indicator — event terpisah untuk kasih tahu user lain "sedang mengetik..."
- File sharing — kirim file kecil lewat base64 atau simpan sementara di server lokal
- Notifikasi desktop — pakai Web Notification API supaya user dapat notif meski tab browser di-minimize
Batasan yang Perlu Disadari
- Cuma jalan selama semua device ada di jaringan yang sama — nggak bisa dipakai remote dari luar kantor kecuali di-setup VPN tambahan
- Server harus tetap nyala — kalau komputer yang jadi server dimatikan, chat berhenti total
- Nggak ada enkripsi end-to-end — karena ini murni internal LAN, saya anggap risikonya rendah, tapi kalau butuh keamanan lebih, bisa ditambahkan HTTPS lokal dengan self-signed certificate
Penutup
Proyek sederhana seperti ini jadi bukti bahwa nggak semua solusi komunikasi tim harus bergantung ke platform cloud besar. Kalau kebutuhannya sekadar komunikasi cepat dalam satu lokasi fisik yang sama, LAN-only app seperti ini jauh lebih ringan dan private.
Kalau kamu butuh sistem komunikasi internal custom untuk kebutuhan spesifik tim/perusahaan kamu, saya buka jasa untuk itu. Cek portofolio saya di april-portfolio-pearl.vercel.app atau hubungi lewat halaman Contact.
Ada kebutuhan komunikasi internal yang spesifik? Tulis di komentar, nanti saya bantu diskusikan.

Tidak ada komentar:
Posting Komentar