[javascript] Socket.io를 사용하여 실시간 전화 기능을 어떻게 구현할 수 있나요?
Socket.io는 실시간 양방향 통신을 구현하는 데 사용되는 JavaScript 라이브러리입니다. 이를 사용하여 웹 애플리케이션에 실시간 기능을 추가할 수 있습니다. 전화 기능도 Socket.io를 통해 구현할 수 있습니다.
아래는 Socket.io를 사용하여 실시간 전화 기능을 구현하는 간단한 예제입니다.
// 서버 측 코드
const express = require('express');
const app = express();
const http = require('http').createServer(app);
const io = require('socket.io')(http);
// 웹 소켓 연결 시
io.on('connection', (socket) => {
// 전화 연결 요청을 받으면
socket.on('call', (callee) => {
// 수신자에게 전화 요청 이벤트를 전송
io.to(callee).emit('incoming-call', socket.id);
});
// 전화 수신 시
socket.on('answer-call', (caller) => {
// 통화 연결을 위해 호출자에게 전화 수락 이벤트를 전송
io.to(caller).emit('call-accepted', socket.id);
});
// 연결된 통화 시 처리할 이벤트 등록
socket.on('voice-data', (data) => {
// 음성 데이터 처리 로직
console.log('Received voice data:', data);
// 음성 데이터를 수신자에게 전송
socket.broadcast.emit('voice-data', data);
});
});
// 웹 서버 시작
http.listen(3000, () => {
console.log('Server started on port 3000');
});
// 클라이언트 측 코드
const socket = io();
const myId = 'user1'; // 사용자 고유 식별자
// 전화 연결 요청 시
function callUser(userId) {
socket.emit('call', userId);
}
// 전화 연결 수락 시
function answerCall(callerId) {
socket.emit('answer-call', callerId);
}
// 통화 중 음성 데이터 전송
function sendVoiceData(data) {
socket.emit('voice-data', data);
}
// 전화 수락 이벤트 처리
socket.on('call-accepted', (calleeId) => {
console.log('Call accepted by', calleeId);
// 전화 연결 성공 시 처리 로직
});
// 전화 수신 이벤트 처리
socket.on('incoming-call', (callerId) => {
console.log('Incoming call from', callerId);
// 수신된 전화에 대한 UI 처리 로직
});
// 음성 데이터 수신
socket.on('voice-data', (data) => {
// 음성 데이터 처리 로직
console.log('Received voice data:', data);
});
이 예제에서는 Socket.io를 사용하여 실시간 통화를 구현했습니다. 서버 측에서는 connection 이벤트를 통해 소켓 연결을 처리하고, call 이벤트를 통해 전화 연결 요청을 받습니다. 수신자에게 incoming-call 이벤트를 전송하여 전화 수락 여부를 확인합니다.
클라이언트 측에서는 callUser 함수를 사용하여 특정 사용자에게 전화를 걸고, answerCall 함수를 사용하여 전화를 수락합니다. 음성 데이터는 sendVoiceData 함수를 통해 전송되며, voice-data 이벤트를 수신하면 해당 데이터를 처리합니다.
Socket.io를 사용하여 실시간 전화 기능을 구현할 때에는 호출자와 수신자 간의 연결 설정 및 음성 데이터 처리 등 추가적인 기능과 보안을 고려해야 합니다. 예제 코드는 단순한 기능을 보여주기 위한 것이므로 실제 구현 시에는 다양한 상황을 고려하여 개발해야 합니다.
참조: Socket.io 공식 문서