SlideShare a Scribd company logo
Startup JavaScript
9. Socket.IO 및 Node.JS 고급
THINKER TO MAKER
x
Socket.IO
THINKER TO MAKER
Real-Time Application
Socket.IO
JavaScript 를 이용하여 실시간 어플리케이션을 구축할 수 있도록 하는 엔진.
양 방향의 이벤트 기반의 통신이 가능하고, 모든 플랫폼과 장치에서 동작
실시간으로 차트나 로그 데이터를 전달하여 표시
실 시간 분석
몇 줄의 코드만으로 채팅 어플리케이션 개발 가능
인스턴스 메신져
이미지, 오디오, 비디오 같은 이진 데이터 전달 가능
바이너리 스트리밍
상대방의 수정 내역을 보면서 동시 문서 수정
문서 협업
Hello Socket.IO
Express 와 Http 모듈과 연동하여 웹 통신 포트로 실시간 서버 구축 가능
웹 파일에서는 Socket.IO 클라이언트가 제공되어 손쉽게 구축 가능
$ npm install socket.io
Socket.IO 설치
<script
src='/socket.io/socket.io.js'></script
>
<script>
var socket = io();
socket.on('news', function(data){
document.write(JSON.stringify(data));
socket.emit('feedback',{ hello :
'world2' });
});
</script>
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
// 기본 접속 경로
app.get('/', function (req, res) {
res.sendFile(__dirname +
'/sample1.html');
});
// 외부 접속시 처리
io.on('connection', function (socket) {
// 접속한 모든 클라이언트에 전달
socket.emit('news', { hello: 'world1' });
// Client 로 부터 수신받는 event
socket.on('feedback', function (data) {
console.log(data);
});
});
데이터 전달 방식
THINKER TO MAKER
Unicast, Broadcast
Unicast, Multicast
특정 소켓 혹은 접속한 모든 소켓에 데이터를 전달하는 방식
Socket.IO 에서 손쉽게 데이터를 전달 할 수 있게 함
BroadcastUnicast
Unicast & Broadcast 구현 (Server)
Unicast 를 위해서는 보내려는 특정 소켓을 가리켜야 함
Broadcast 는 socket 의 broadcast 를 이용하여 전달 가능
// Broadcast
socket.on('broadcast', function (data) {
console.log('Broadcast : ' + data);
socket.broadcast.emit('msg', data);
});
// Unicast
socket.on('unicast', function(data){
console.log('Unicast : ' + data);
sock.emit('msg', data);
});
// Send All!
socket.on('sendall', function(data){
console.log('Sendall : ' + data);
io.emit('msg', data);
});
});
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
// 기본 접속 경로
app.get('/', function (req, res) {
res.sendFile(__dirname + '/sample2.html');
});
// 첫번째 접속
var sock = undefined;
// 외부 접속시 처리
io.on('connection', function (socket) {
// 접속한 모든 클라이언트에 전달
socket.emit('news', { hello: 'world1' });
if(!sock){
sock = socket;
}
Unicast & Broadcast 구현 (Client)
jQuery 와 Socket.IO 클라이언트를 이용하여 웹 페이지 구성
Unicast, Broadcast 를 확인할 수 있도록 버튼 구성
$('#unicast').click(function(){
sendMsg('unicast');
});
$('#broadcast').click(function(){
sendMsg('broadcast');
});
$('#sendall').click(function(){
sendMsg('sendall');
});
});
</script>
</head>
<body>
<input type='text' />
<p/>
<button id='unicast'>Unicast</button>
<button id='broadcast'>Broadcast</button>
<button id='sendall'>Sendall</button>
<div id='msgs'/>
</body>
</html>
<html>
<head>
<title>Hello Pi!</title>
<script src='https://code.jquery.com/jquery-
3.1.1.min.js'></script>
<script src='/socket.io/socket.io.js'></script>
<script>
$(function(){
var socket = io();
var id = 'Guest_' + Math.floor((Math.random() * 10) + 1);
socket.on('msg', function(data){
$('#msgs').append($('<p>').text('ID : ' + data.id + ' : ' +
data.msg));
});
var sendMsg = function(type){
var msg = $('input').val();
$('#msgs').append($('<p>').text('ME : ' + id + ' : ' +
msg));
socket.emit(type, { id : id, msg : msg});
$('input').val('');
}
Multicast 구현
THINKER TO MAKER
Namespace, Room
Multicast 구현
Multicast 는 접속한 클라이언트에서 특정 클라이언트 그룹만 데이터 전달
Socket.IO 에서는 Namespace 혹은 Room 으로 구현 가능
Multicast
특정 Namespace 를 지정하여 별도의 커넥션 관리
Namespace 를 이용한 구현 방법
방명에 Join, Leave 하는 식으로 데이터 처리
Room 을 이용한 구현 방법
P : 코드에 명시적으로 Multicast 대상이 구분됨
N : Multicast 대상 마다 코드가 늘어 남
P : 별다른 코드 추가 필요 없음. 간단한 구조
N : Multicast 대상이 명시적으로 표현 안됨
Multicast with Namespace (Server)
Unicast 를 위해서는 보내려는 특정 소켓을 가리켜야 함
Broadcast 는 socket 의 broadcast 를 이용하여 전달 가능
// Namespace2
app.get('/nsp2', function (req, res) {
res.sendFile(__dirname + '/nsp2.html');
});
var nsp2 = io.of('/namespace2');
nsp2.on('connection', function (socket) {
socket.emit('new', { namespace: 'nsp2' });
socket.on('broadcast', function (data) {
console.log('Nsp2 : ' + data);
socket.broadcast.emit('msg', data);
});
});
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
// Namespace1
app.get('/nsp1', function (req, res) {
res.sendFile(__dirname + '/nsp1.html');
});
var nsp1 = io.of('/namespace1');
nsp1.on('connection', function (socket) {
socket.emit('new', { namespace: 'nsp1' });
socket.on('broadcast', function (data) {
console.log('Nsp1 : ' + data);
socket.broadcast.emit('msg', data);
});
});
Multicast with Namespace (Client)
Namespace 를 이용하여 서버 구현 시, 클라이언트 접속 인자로 Namespace
이름을 입력하여 사용해야 함
<script src='/socket.io/socket.io.js'></script>
<script>
var socket = io('/namespace2');
var count = 0;
socket.on('new', function(data){
document.write(count++ + ' / ' +
JSON.stringify(data));
socket.emit('broadcast',{ name : 'namespace1' });
});
socket.on('msg', function(data){
document.write(count++ + ' : ' +
JSON.stringify(data));
});
</script>
<script src='/socket.io/socket.io.js'></script>
<script>
var socket = io('/namespace1');
var count = 0;
socket.on('new', function(data){
document.write(count++ + ' / ' +
JSON.stringify(data));
socket.emit('broadcast',{ name : 'namespace1' });
});
socket.on('msg', function(data){
document.write(count++ + ' : ' +
JSON.stringify(data));
});
</script>
Nsp2.htmlNsp1.html
Multicast with Room (Server)
Room 방식을 사용 시는 방 접속 시 join, 나올 땐 leave 함수를 사용
해당 Room 의 Socket 에 데이터를 보내기 위해서 to(방명)을 이용
socket.on('leave', function (data) {
console.log('Leave : ' + data.id + ' / '
+ data.room + ' Leaved!');
socket.leave(data.room);
io.to(data.room).emit('leave', data);
});
socket.on('msg', function (data) {
console.log('msg : ' + data.id + ' / ' +
data.room);
socket.broadcast.to(data.room).emit('msg',
data);
});
});
var app = require('express')();
var server = require('http').Server(app);
var io = require('socket.io')(server);
server.listen(80);
app.get('/', function (req, res) {
res.sendFile(__dirname + '/room.html');
});
io.on('connection', function (socket) {
console.log('connected');
socket.on('join', function (data) {
console.log('Join : ' + data.id + ' / '
+ data.room + ' Joined!');
socket.join(data.room);
io.to(data.room).emit('join', data);
});
Multicast with Room (Client)
클라이언트 측에서 Room 에 접속을 위해 별도로 할 작업은 없음
방명을 전달하여 서버 측에서 처리 해야 함
$('#room2').click(function(){
room = 'room2';
socket.emit('join', { id : id, room : 'room2'});
});
$('#send').click(function(){
var msg = $('input').val();
$('#msgs').append($('<p>').text('ME : ' + id + ' : ' + msg));
socket.emit('msg', { id : id, msg : msg, room : room});
$('input').val('');
});
});
</script>
</head>
<body>
<input type='text' />
<p/>
<button id='room1'>ROOM1 Join</button>
<button id='room2'>ROOM2 Join</button>
<button id='send'>Send</button>
<div id='msgs'/>
</body>
</html>
<html>
<head>
<title>Hello Pi!</title>
<script src='https://code.jquery.com/jquery-
3.1.1.min.js'></script>
<script src='/socket.io/socket.io.js'></script>
<script>
$(function(){
var socket = io();
var id = 'Guest_' + Math.floor((Math.random() * 10) + 1);
var room = 'room1';
socket.on('join', function(data){
$('#msgs').append($('<p>').text('ID : ' + data.id + ' : ' +
data.room + ' Joined!'));
});
socket.on('msg', function(data){
$('#msgs').append($('<p>').text('ID : ' + data.id + ' : ' +
data.msg));
});
$('#room1').click(function(){
room = 'room1';
socket.emit('join', { id : id, room : 'room1'});
});
W www.circul.us G group.circul.us
S social.circul.us C cafe.circul.us
CONTACT.US circulus@circul.us
THINKER TO MAKER
ANY
QUESTION?
x
Ad

More Related Content

What's hot (20)

1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초
Circulus
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
Node.js
Node.jsNode.js
Node.js
ymtech
 
Node.js 심화과정
Node.js 심화과정Node.js 심화과정
Node.js 심화과정
Seokyou (Kevin) Hong
 
아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장
Woo Yeong Choi
 
Leadweb Nodejs
Leadweb NodejsLeadweb Nodejs
Leadweb Nodejs
근호 최
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
정석 양
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
은숙 이
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
Dong Jun Kwon
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
Myoung-gyu Gang
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
Dong Jun Kwon
 
Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822
병헌 정
 
Node.js 기본과정
Node.js 기본과정Node.js 기본과정
Node.js 기본과정
Seokyou (Kevin) Hong
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
WooYoung Cho
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
HyungKuIm
 
Express 프레임워크
Express 프레임워크Express 프레임워크
Express 프레임워크
Choonghyun Yang
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
 
Html5 web workers
Html5 web workersHtml5 web workers
Html5 web workers
Woo Jin Kim
 
Play node conference
Play node conferencePlay node conference
Play node conference
John Kim
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. Job
Hyosung Jeon
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초
Circulus
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
Node.js
Node.jsNode.js
Node.js
ymtech
 
아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장
Woo Yeong Choi
 
Leadweb Nodejs
Leadweb NodejsLeadweb Nodejs
Leadweb Nodejs
근호 최
 
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
[하코사세미나]미리보는 대규모 자바스크립트 어플리케이션 개발
정석 양
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
은숙 이
 
Angular2 router&http
Angular2 router&httpAngular2 router&http
Angular2 router&http
Dong Jun Kwon
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
Myoung-gyu Gang
 
Angular2 가기전 Type script소개
 Angular2 가기전 Type script소개 Angular2 가기전 Type script소개
Angular2 가기전 Type script소개
Dong Jun Kwon
 
Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822
병헌 정
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
WooYoung Cho
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
HyungKuIm
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
NAVER D2
 
Html5 web workers
Html5 web workersHtml5 web workers
Html5 web workers
Woo Jin Kim
 
Play node conference
Play node conferencePlay node conference
Play node conference
John Kim
 
windows via c++ Ch 5. Job
windows via c++ Ch 5. Jobwindows via c++ Ch 5. Job
windows via c++ Ch 5. Job
Hyosung Jeon
 

Viewers also liked (20)

Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용
Circulus
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
Circulus
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
Circulus
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Circulus
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Circulus
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
Circulus
 
123D Design - 모델링 기초
123D Design - 모델링 기초123D Design - 모델링 기초
123D Design - 모델링 기초
Circulus
 
Startup 123D Design - 9. 강아지 모델링
Startup 123D Design - 9. 강아지 모델링Startup 123D Design - 9. 강아지 모델링
Startup 123D Design - 9. 강아지 모델링
Circulus
 
Personal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manualPersonal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manual
Circulus
 
123D Design - 컵 만들기
123D Design - 컵 만들기123D Design - 컵 만들기
123D Design - 컵 만들기
Circulus
 
123D Design - 전구 디자인 하기
123D Design - 전구 디자인 하기123D Design - 전구 디자인 하기
123D Design - 전구 디자인 하기
Circulus
 
Startup 123D Design - 8.벤치 만들기
Startup 123D Design - 8.벤치 만들기Startup 123D Design - 8.벤치 만들기
Startup 123D Design - 8.벤치 만들기
Circulus
 
123D Design - 정리함 만들기
123D Design - 정리함 만들기123D Design - 정리함 만들기
123D Design - 정리함 만들기
Circulus
 
Startup 123D Design - 7.물뿌리개 만들기
Startup 123D Design - 7.물뿌리개 만들기Startup 123D Design - 7.물뿌리개 만들기
Startup 123D Design - 7.물뿌리개 만들기
Circulus
 
123D Design - 화분 만들기
123D Design - 화분 만들기123D Design - 화분 만들기
123D Design - 화분 만들기
Circulus
 
Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅
Circulus
 
nodejs websocket & SOCKET.IO
nodejs websocket & SOCKET.IOnodejs websocket & SOCKET.IO
nodejs websocket & SOCKET.IO
Mungyu Choi
 
웹 개발 스터디 01 - PHP, MySQL 연동
웹 개발 스터디 01 - PHP, MySQL 연동웹 개발 스터디 01 - PHP, MySQL 연동
웹 개발 스터디 01 - PHP, MySQL 연동
Yu Yongwoo
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교
Junyoung Lee
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
Jeongsang Baek
 
Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용Startup JavaScript 10 - OpenAPI & RSS 활용
Startup JavaScript 10 - OpenAPI & RSS 활용
Circulus
 
Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저Startup JavaScript 6 - 함수, 스코프, 클로저
Startup JavaScript 6 - 함수, 스코프, 클로저
Circulus
 
2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자2.Startup JavaScript - 연산자
2.Startup JavaScript - 연산자
Circulus
 
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리Startup JavaScript 3 - 조건문, 반복문, 예외처리
Startup JavaScript 3 - 조건문, 반복문, 예외처리
Circulus
 
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Startup JavaScript 5 - 객체(Date, RegExp, Object, Global)
Circulus
 
Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체Startup JavaScript 4 - 객체
Startup JavaScript 4 - 객체
Circulus
 
123D Design - 모델링 기초
123D Design - 모델링 기초123D Design - 모델링 기초
123D Design - 모델링 기초
Circulus
 
Startup 123D Design - 9. 강아지 모델링
Startup 123D Design - 9. 강아지 모델링Startup 123D Design - 9. 강아지 모델링
Startup 123D Design - 9. 강아지 모델링
Circulus
 
Personal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manualPersonal Interconnect AUdio - piAu manual
Personal Interconnect AUdio - piAu manual
Circulus
 
123D Design - 컵 만들기
123D Design - 컵 만들기123D Design - 컵 만들기
123D Design - 컵 만들기
Circulus
 
123D Design - 전구 디자인 하기
123D Design - 전구 디자인 하기123D Design - 전구 디자인 하기
123D Design - 전구 디자인 하기
Circulus
 
Startup 123D Design - 8.벤치 만들기
Startup 123D Design - 8.벤치 만들기Startup 123D Design - 8.벤치 만들기
Startup 123D Design - 8.벤치 만들기
Circulus
 
123D Design - 정리함 만들기
123D Design - 정리함 만들기123D Design - 정리함 만들기
123D Design - 정리함 만들기
Circulus
 
Startup 123D Design - 7.물뿌리개 만들기
Startup 123D Design - 7.물뿌리개 만들기Startup 123D Design - 7.물뿌리개 만들기
Startup 123D Design - 7.물뿌리개 만들기
Circulus
 
123D Design - 화분 만들기
123D Design - 화분 만들기123D Design - 화분 만들기
123D Design - 화분 만들기
Circulus
 
Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅Startup 123D Design - 10. 3D프린팅
Startup 123D Design - 10. 3D프린팅
Circulus
 
nodejs websocket & SOCKET.IO
nodejs websocket & SOCKET.IOnodejs websocket & SOCKET.IO
nodejs websocket & SOCKET.IO
Mungyu Choi
 
웹 개발 스터디 01 - PHP, MySQL 연동
웹 개발 스터디 01 - PHP, MySQL 연동웹 개발 스터디 01 - PHP, MySQL 연동
웹 개발 스터디 01 - PHP, MySQL 연동
Yu Yongwoo
 
웹 IDE 비교
웹 IDE 비교웹 IDE 비교
웹 IDE 비교
Junyoung Lee
 
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
소셜게임 서버 개발 관점에서 본 Node.js의 장단점과 대안
Jeongsang Baek
 
Ad

Similar to Startup JavaScript 9 - Socket.IO 실시간 통신 (20)

채팅 소스부터 Https 주소까지
채팅 소스부터  Https 주소까지채팅 소스부터  Https 주소까지
채팅 소스부터 Https 주소까지
Kenu, GwangNam Heo
 
What's new in IE11
What's new in IE11What's new in IE11
What's new in IE11
Jae Sung Park
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
John Kim
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
현철 조
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
Jin wook
 
챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기
성일 한
 
Nexacro
NexacroNexacro
Nexacro
HyungKuIm
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4
성일 한
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
정출 김
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programming
ihpark92
 
Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현
Hongchae Lee
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH, 케이티하이텔
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210
Yong Joon Moon
 
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIDo IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Hyunghun Cho
 
20131217 html5
20131217 html520131217 html5
20131217 html5
DK Lee
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
Kiyoung Moon
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
상현 조
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
Sangon Lee
 
채팅 소스부터 Https 주소까지
채팅 소스부터  Https 주소까지채팅 소스부터  Https 주소까지
채팅 소스부터 Https 주소까지
Kenu, GwangNam Heo
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
John Kim
 
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
[NDC17] Unreal.js - 자바스크립트로 쉽고 빠른 UE4 개발하기
현철 조
 
Node.js의 도입과 활용
Node.js의 도입과 활용Node.js의 도입과 활용
Node.js의 도입과 활용
Jin wook
 
챗봇 시작해보기
챗봇 시작해보기챗봇 시작해보기
챗봇 시작해보기
성일 한
 
처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4처음배우는 자바스크립트, 제이쿼리 #4
처음배우는 자바스크립트, 제이쿼리 #4
성일 한
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
정출 김
 
Blockchain 4th dapp programming
Blockchain 4th dapp programmingBlockchain 4th dapp programming
Blockchain 4th dapp programming
ihpark92
 
Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현Spring-WebSocket 기반 Full-Featured 채팅 구현
Spring-WebSocket 기반 Full-Featured 채팅 구현
Hongchae Lee
 
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH_Detail day_화성에서 온 개발자 금성에서 온 기획자 시리즈_5차_데이터분석_조범석_20120613
KTH, 케이티하이텔
 
파이썬+네트워크 20160210
파이썬+네트워크 20160210파이썬+네트워크 20160210
파이썬+네트워크 20160210
Yong Joon Moon
 
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open APIDo IoT Yourself! - 사물 간의 연결을 위한 Open API
Do IoT Yourself! - 사물 간의 연결을 위한 Open API
Hyunghun Cho
 
20131217 html5
20131217 html520131217 html5
20131217 html5
DK Lee
 
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
유니티 + Nodejs를 활용한 멀티플레이어 게임 개발하기
Kiyoung Moon
 
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server SampleGCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
GCGC- CGCII 서버 엔진에 적용된 기술 (6) - CGCII Server Sample
상현 조
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
jongho jeong
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
Sangon Lee
 
Ad

More from Circulus (10)

라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT
Circulus
 
라즈베리파이입문 - 연세대 특강
라즈베리파이입문 - 연세대 특강라즈베리파이입문 - 연세대 특강
라즈베리파이입문 - 연세대 특강
Circulus
 
123D Design - 스마트폰 케이스 모델링
123D Design - 스마트폰 케이스 모델링123D Design - 스마트폰 케이스 모델링
123D Design - 스마트폰 케이스 모델링
Circulus
 
JavaScript Everywhere from Mobile and Robot
JavaScript Everywhere from Mobile and RobotJavaScript Everywhere from Mobile and Robot
JavaScript Everywhere from Mobile and Robot
Circulus
 
piBo- Personal Intelligent roBOt
piBo- Personal Intelligent roBOtpiBo- Personal Intelligent roBOt
piBo- Personal Intelligent roBOt
Circulus
 
웨어러블 디바이스를 활용한 개인용 지능형 로봇
웨어러블 디바이스를 활용한 개인용 지능형 로봇웨어러블 디바이스를 활용한 개인용 지능형 로봇
웨어러블 디바이스를 활용한 개인용 지능형 로봇
Circulus
 
라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드
Circulus
 
라즈베리파이로 IoT 시작하기 복습
라즈베리파이로 IoT 시작하기 복습라즈베리파이로 IoT 시작하기 복습
라즈베리파이로 IoT 시작하기 복습
Circulus
 
라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기
Circulus
 
라즈베라파이란 무엇인가?
라즈베라파이란 무엇인가?라즈베라파이란 무엇인가?
라즈베라파이란 무엇인가?
Circulus
 
라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT라즈베리파이와자바스크립트로만드는 IoT
라즈베리파이와자바스크립트로만드는 IoT
Circulus
 
라즈베리파이입문 - 연세대 특강
라즈베리파이입문 - 연세대 특강라즈베리파이입문 - 연세대 특강
라즈베리파이입문 - 연세대 특강
Circulus
 
123D Design - 스마트폰 케이스 모델링
123D Design - 스마트폰 케이스 모델링123D Design - 스마트폰 케이스 모델링
123D Design - 스마트폰 케이스 모델링
Circulus
 
JavaScript Everywhere from Mobile and Robot
JavaScript Everywhere from Mobile and RobotJavaScript Everywhere from Mobile and Robot
JavaScript Everywhere from Mobile and Robot
Circulus
 
piBo- Personal Intelligent roBOt
piBo- Personal Intelligent roBOtpiBo- Personal Intelligent roBOt
piBo- Personal Intelligent roBOt
Circulus
 
웨어러블 디바이스를 활용한 개인용 지능형 로봇
웨어러블 디바이스를 활용한 개인용 지능형 로봇웨어러블 디바이스를 활용한 개인용 지능형 로봇
웨어러블 디바이스를 활용한 개인용 지능형 로봇
Circulus
 
라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드
Circulus
 
라즈베리파이로 IoT 시작하기 복습
라즈베리파이로 IoT 시작하기 복습라즈베리파이로 IoT 시작하기 복습
라즈베리파이로 IoT 시작하기 복습
Circulus
 
라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기라즈베리파이와 자바스크립트로 IoT 시작하기
라즈베리파이와 자바스크립트로 IoT 시작하기
Circulus
 
라즈베라파이란 무엇인가?
라즈베라파이란 무엇인가?라즈베라파이란 무엇인가?
라즈베라파이란 무엇인가?
Circulus
 

Startup JavaScript 9 - Socket.IO 실시간 통신

  • 1. Startup JavaScript 9. Socket.IO 및 Node.JS 고급 THINKER TO MAKER x
  • 3. Socket.IO JavaScript 를 이용하여 실시간 어플리케이션을 구축할 수 있도록 하는 엔진. 양 방향의 이벤트 기반의 통신이 가능하고, 모든 플랫폼과 장치에서 동작 실시간으로 차트나 로그 데이터를 전달하여 표시 실 시간 분석 몇 줄의 코드만으로 채팅 어플리케이션 개발 가능 인스턴스 메신져 이미지, 오디오, 비디오 같은 이진 데이터 전달 가능 바이너리 스트리밍 상대방의 수정 내역을 보면서 동시 문서 수정 문서 협업
  • 4. Hello Socket.IO Express 와 Http 모듈과 연동하여 웹 통신 포트로 실시간 서버 구축 가능 웹 파일에서는 Socket.IO 클라이언트가 제공되어 손쉽게 구축 가능 $ npm install socket.io Socket.IO 설치 <script src='/socket.io/socket.io.js'></script > <script> var socket = io(); socket.on('news', function(data){ document.write(JSON.stringify(data)); socket.emit('feedback',{ hello : 'world2' }); }); </script> var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); server.listen(80); // 기본 접속 경로 app.get('/', function (req, res) { res.sendFile(__dirname + '/sample1.html'); }); // 외부 접속시 처리 io.on('connection', function (socket) { // 접속한 모든 클라이언트에 전달 socket.emit('news', { hello: 'world1' }); // Client 로 부터 수신받는 event socket.on('feedback', function (data) { console.log(data); }); });
  • 5. 데이터 전달 방식 THINKER TO MAKER Unicast, Broadcast
  • 6. Unicast, Multicast 특정 소켓 혹은 접속한 모든 소켓에 데이터를 전달하는 방식 Socket.IO 에서 손쉽게 데이터를 전달 할 수 있게 함 BroadcastUnicast
  • 7. Unicast & Broadcast 구현 (Server) Unicast 를 위해서는 보내려는 특정 소켓을 가리켜야 함 Broadcast 는 socket 의 broadcast 를 이용하여 전달 가능 // Broadcast socket.on('broadcast', function (data) { console.log('Broadcast : ' + data); socket.broadcast.emit('msg', data); }); // Unicast socket.on('unicast', function(data){ console.log('Unicast : ' + data); sock.emit('msg', data); }); // Send All! socket.on('sendall', function(data){ console.log('Sendall : ' + data); io.emit('msg', data); }); }); var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); server.listen(80); // 기본 접속 경로 app.get('/', function (req, res) { res.sendFile(__dirname + '/sample2.html'); }); // 첫번째 접속 var sock = undefined; // 외부 접속시 처리 io.on('connection', function (socket) { // 접속한 모든 클라이언트에 전달 socket.emit('news', { hello: 'world1' }); if(!sock){ sock = socket; }
  • 8. Unicast & Broadcast 구현 (Client) jQuery 와 Socket.IO 클라이언트를 이용하여 웹 페이지 구성 Unicast, Broadcast 를 확인할 수 있도록 버튼 구성 $('#unicast').click(function(){ sendMsg('unicast'); }); $('#broadcast').click(function(){ sendMsg('broadcast'); }); $('#sendall').click(function(){ sendMsg('sendall'); }); }); </script> </head> <body> <input type='text' /> <p/> <button id='unicast'>Unicast</button> <button id='broadcast'>Broadcast</button> <button id='sendall'>Sendall</button> <div id='msgs'/> </body> </html> <html> <head> <title>Hello Pi!</title> <script src='https://code.jquery.com/jquery- 3.1.1.min.js'></script> <script src='/socket.io/socket.io.js'></script> <script> $(function(){ var socket = io(); var id = 'Guest_' + Math.floor((Math.random() * 10) + 1); socket.on('msg', function(data){ $('#msgs').append($('<p>').text('ID : ' + data.id + ' : ' + data.msg)); }); var sendMsg = function(type){ var msg = $('input').val(); $('#msgs').append($('<p>').text('ME : ' + id + ' : ' + msg)); socket.emit(type, { id : id, msg : msg}); $('input').val(''); }
  • 9. Multicast 구현 THINKER TO MAKER Namespace, Room
  • 10. Multicast 구현 Multicast 는 접속한 클라이언트에서 특정 클라이언트 그룹만 데이터 전달 Socket.IO 에서는 Namespace 혹은 Room 으로 구현 가능 Multicast 특정 Namespace 를 지정하여 별도의 커넥션 관리 Namespace 를 이용한 구현 방법 방명에 Join, Leave 하는 식으로 데이터 처리 Room 을 이용한 구현 방법 P : 코드에 명시적으로 Multicast 대상이 구분됨 N : Multicast 대상 마다 코드가 늘어 남 P : 별다른 코드 추가 필요 없음. 간단한 구조 N : Multicast 대상이 명시적으로 표현 안됨
  • 11. Multicast with Namespace (Server) Unicast 를 위해서는 보내려는 특정 소켓을 가리켜야 함 Broadcast 는 socket 의 broadcast 를 이용하여 전달 가능 // Namespace2 app.get('/nsp2', function (req, res) { res.sendFile(__dirname + '/nsp2.html'); }); var nsp2 = io.of('/namespace2'); nsp2.on('connection', function (socket) { socket.emit('new', { namespace: 'nsp2' }); socket.on('broadcast', function (data) { console.log('Nsp2 : ' + data); socket.broadcast.emit('msg', data); }); }); var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); server.listen(80); // Namespace1 app.get('/nsp1', function (req, res) { res.sendFile(__dirname + '/nsp1.html'); }); var nsp1 = io.of('/namespace1'); nsp1.on('connection', function (socket) { socket.emit('new', { namespace: 'nsp1' }); socket.on('broadcast', function (data) { console.log('Nsp1 : ' + data); socket.broadcast.emit('msg', data); }); });
  • 12. Multicast with Namespace (Client) Namespace 를 이용하여 서버 구현 시, 클라이언트 접속 인자로 Namespace 이름을 입력하여 사용해야 함 <script src='/socket.io/socket.io.js'></script> <script> var socket = io('/namespace2'); var count = 0; socket.on('new', function(data){ document.write(count++ + ' / ' + JSON.stringify(data)); socket.emit('broadcast',{ name : 'namespace1' }); }); socket.on('msg', function(data){ document.write(count++ + ' : ' + JSON.stringify(data)); }); </script> <script src='/socket.io/socket.io.js'></script> <script> var socket = io('/namespace1'); var count = 0; socket.on('new', function(data){ document.write(count++ + ' / ' + JSON.stringify(data)); socket.emit('broadcast',{ name : 'namespace1' }); }); socket.on('msg', function(data){ document.write(count++ + ' : ' + JSON.stringify(data)); }); </script> Nsp2.htmlNsp1.html
  • 13. Multicast with Room (Server) Room 방식을 사용 시는 방 접속 시 join, 나올 땐 leave 함수를 사용 해당 Room 의 Socket 에 데이터를 보내기 위해서 to(방명)을 이용 socket.on('leave', function (data) { console.log('Leave : ' + data.id + ' / ' + data.room + ' Leaved!'); socket.leave(data.room); io.to(data.room).emit('leave', data); }); socket.on('msg', function (data) { console.log('msg : ' + data.id + ' / ' + data.room); socket.broadcast.to(data.room).emit('msg', data); }); }); var app = require('express')(); var server = require('http').Server(app); var io = require('socket.io')(server); server.listen(80); app.get('/', function (req, res) { res.sendFile(__dirname + '/room.html'); }); io.on('connection', function (socket) { console.log('connected'); socket.on('join', function (data) { console.log('Join : ' + data.id + ' / ' + data.room + ' Joined!'); socket.join(data.room); io.to(data.room).emit('join', data); });
  • 14. Multicast with Room (Client) 클라이언트 측에서 Room 에 접속을 위해 별도로 할 작업은 없음 방명을 전달하여 서버 측에서 처리 해야 함 $('#room2').click(function(){ room = 'room2'; socket.emit('join', { id : id, room : 'room2'}); }); $('#send').click(function(){ var msg = $('input').val(); $('#msgs').append($('<p>').text('ME : ' + id + ' : ' + msg)); socket.emit('msg', { id : id, msg : msg, room : room}); $('input').val(''); }); }); </script> </head> <body> <input type='text' /> <p/> <button id='room1'>ROOM1 Join</button> <button id='room2'>ROOM2 Join</button> <button id='send'>Send</button> <div id='msgs'/> </body> </html> <html> <head> <title>Hello Pi!</title> <script src='https://code.jquery.com/jquery- 3.1.1.min.js'></script> <script src='/socket.io/socket.io.js'></script> <script> $(function(){ var socket = io(); var id = 'Guest_' + Math.floor((Math.random() * 10) + 1); var room = 'room1'; socket.on('join', function(data){ $('#msgs').append($('<p>').text('ID : ' + data.id + ' : ' + data.room + ' Joined!')); }); socket.on('msg', function(data){ $('#msgs').append($('<p>').text('ID : ' + data.id + ' : ' + data.msg)); }); $('#room1').click(function(){ room = 'room1'; socket.emit('join', { id : id, room : 'room1'}); });
  • 15. W www.circul.us G group.circul.us S social.circul.us C cafe.circul.us CONTACT.US [email protected] THINKER TO MAKER ANY QUESTION? x

Editor's Notes

  • #2: Circulus 팀 박종건입니다. 위 사진은 작년 창조경제박람회때 포스터 운반하던 파이보의 모습입니다. 파이보와 함께 펼쳐가는 미래를 이야기 하겠습니다.