SlideShare uma empresa Scribd logo
1 de 56
Baixar para ler offline
Python 채팅 구현하기
Produced by Tae Young Lee
2015년 R User Conference
(Neural Network의 변천사를 통해 본 R에서 DNN활용)
2014년 KGC (Korea Game Conference)
Falinux 에서 IoT관련 세미나
2013년 PlatformDay
Devon 에서 Bigdata관련 세미나
2012년 행정안전부 스마트폰 보안 강의
2011년 공개SW 역량프라자 오픈테크넷 세미나
2016년 BISC Conference
(Machine Learning IN SPAM)
2017년 KCD(Korea Community Day)
(오픈스택으로 바라본 상용 클라우드 플랫폼)
Tensorflow Dev Summit Extended Seoul
(Sequence Model and the RNN API)
CLI
GUI
NUI
CLI
GUI
NUI
Python으로 채팅 구현하기
Python으로 채팅 구현하기
http://www.lds.com/coepost/enabling-a-smart-user-experience-
using-chatbots/
http://blog.restcase.com/webhooks-role-in-the-api-world/
Slack 의 Webhook에 우리의 서버를 등록한다.
등록된 서버로 유입되는 정보(대화)를 분석한다.
결과를 연결된 클라이언트에게 전달
Python으로 채팅 구현하기
Python으로 채팅 구현하기
Python으로 채팅 구현하기
Python : Socket Program
Python으로 채팅 구현하기
클라이언트/서버 아키텍처
서버가 하나 이상의 클라이언트(사용자)에게 '서비스'를 제공
listen
Python으로 채팅 구현하기
Python으로 채팅 구현하기
Socket
• 소켓은 '통신 종단점'이라는 개념을 구체화한 컴퓨터 네트
워크 데이터 구조
• 네트워크를 사용하는 애플리케이션은 통신을 시작하기 전
에 항상 소켓을 만들어야 함
• 소켓 없이는 통신을 시작할 수 없음
• 원래 소켓은 실행중인 프로그램(프로세스)이 같은 호스트
안에 실행 중인 다른 프로그램과 통신하기 위해 개발됨
Socket 유형
• 유닉스 소켓
– AF_UNIX 라는 '패밀리 이름' 을 가진다. AF는 주소 패밀리(Address
family)를 의미.
– 쉽게 클라이언트와 서버가 유닉스 환경의 동일한 컴퓨터에 존재해야
한다는 뜻.
– 이 소켓은 파일 기반이다.
소켓의 기반 구조가 파일 시스템을 통해 지원됨
– 파일 시스템은 같은 호스트에서 실행 중인 프로세스 사이에 지속적으
로 공유되므로, 합리적인 방법이라고 할 수 있다.
• 네트워크 기반
– 패밀리 이름은 AF_INET 이다.
– 클라이언트와 서버가 인터넷 어디서든 존재할 수 있다는 의미를 갖는
다
• 파이썬은 AF_UNIX, AF_NETLINK, AF_TIPC, AF_INET{,6} 패
밀리를 지원
연결 방식에 따른 분류
• 연결 지향 소켓(connection oriented)
– 통신을 하기 전에 반드시 연결 돼 있어야 한다(전화를 거는 것과
유사)
– 레코드 경계 없이 데이터를 순서대로 신뢰성 있게 중복없이 전
달. 각 메세지는 여러 조각으로 나뉘어서 반대편에 확실히 전달
된 다음에 다시 순서대로 한데 묶인 후 기다리는 애플리케이션
에 전달
– 연결 지향 소켓을 구현한 프로토콜(protocol)로는 전송 제어 프
로토콜(TCP, Trasmission Control Protocol) 이 있으며, 이 소켓을
만드려면 소켓 유형으로 SOCK_STREAM(스트림 소켓)을 지정
– 이 소켓은 네트워크상에서 IP를 호스트를 찾기 위해 사용하기 때
문에 두 프로토콜의 이름을 붙여 TCP/IP 라고 함.
• 비연결형 소켓(connectionless)
– 스트림 소켓과 대비되는 데이터그램(Datagram) 유형의 비연결
– 통신 시 최초 연결하는 과정이 필요 없음
– 데이터 전달 과정에서 순서나 신뢰성 이나 중복 방지를 보장할
수 없음. 이는 메세지가 연결 지향 소켓처럼 조각으로 나뉘지 않
고 통째로 송신된다는 것을 의미(우편 서비스에 비유)
– 연결 지향 소켓은 가상 회선을 맨 처음 만들고 유지하기 위해 상
당한 부가 비용이 발생
비연결 지향 소켓은 이런 부담이 덜하고 성능면에서 더 좋다.
– 데이터그램 소켓을 구현한 프로토콜로는 (UDP, User Datagram
Protocol)이 있고, UPD 소켓을 만들려면 SOCK_DGRAM을 소켓
유형으로 지정.
– 이 소켓도 IP를 네트워크상에서 호스트를 찾기 위해 사용
UPD/IP라고도 부름
Socket의 동작 과정
Python으로 채팅 구현하기
conn.close()
from socket import *
svrsock = socket(AF_INET, SOCK_STREAM)
conn.close()
from socket import *
svrsock = socket(AF_INET, SOCK_STREAM)
svrsock.bind(('127.0.0.1', 7799))
conn.close()
from socket import *
svrsock = socket(AF_INET, SOCK_STREAM)
svrsock.bind(('127.0.0.1', 7799))
svrsock.listen(1)
conn.close()
from socket import *
svrsock = socket(AF_INET, SOCK_STREAM)
svrsock.bind(('127.0.0.1', 7799))
svrsock.listen(1)
conn, addr = svrsock.accept()
addr
('127.0.0.1', 50933)
conn.close()
from socket import *
svrsock = socket(AF_INET, SOCK_STREAM)
svrsock.bind(('127.0.0.1', 7799))
svrsock.listen(1)
conn, addr = svrsock.accept()
addr
('127.0.0.1', 50933)
conn.recv(1024)
conn.close()
from socket import *
svrsock = socket(AF_INET, SOCK_STREAM)
svrsock.bind(('127.0.0.1', 7799))
svrsock.listen(1)
conn, addr = svrsock.accept()
addr
('127.0.0.1', 50933)
conn.recv(1024)
conn.close()
conn.close()
from socket import *
clientsock = socket(AF_INET, SOCK_STREAM)
conn.close()
from socket import *
clientsock = socket(AF_INET, SOCK_STREAM)
clientsock.connect(('127.0.0.1',7799))
conn.close()
from socket import *
clientsock = socket(AF_INET, SOCK_STREAM)
clientsock.connect(('127.0.0.1',7799))
clientsock.send('Hi, it is me.')
Python으로 채팅 구현하기
Blocking & Non-Blocking
• blocking 모드일 때 accept, recv, send 호출할 때 연결하려
고 하는 client 가 없을 때 무한정 기다리는 것
• non-blocking 모드일 때는 위와 같은 상황에서 일정한 시
간을 기다려도 응답이 없을 때 예외가 발생
• https://pl.python.org/docs/lib/socket-objects.html
• setblocking(flag)
Set blocking or non-blocking mode of the socket: if flag is 0, the socket is set to non-
blocking, else to blocking mode. Initially all sockets are in blocking mode. In non-
blocking mode, if a recv() call doesn't find any data, or if a send() call can't immediately
dispose of the data, a error exception is raised; in blocking mode, the calls block until
they can proceed. s.setblocking(0) is equivalent to s.settimeout(0); s.setblocking(1) is
equivalent to s.settimeout(None).
• settimeout(value)Set a timeout on blocking socket operations. The value argument can
be a nonnegative float expressing seconds, or None. If a float is given, subsequent
socket operations will raise an timeout exception if the timeout period value has
elapsed before the operation has completed. Setting a timeout of None disables
timeouts on socket operations. s.settimeout(0.0) is equivalent
tos.setblocking(0); s.settimeout(None) is equivalent to s.setblocking(1). New in version
2.3.
• gettimeout()Return the timeout in floating seconds associated with socket operations,
or None if no timeout is set. This reflects the last call
tosetblocking() or settimeout(). New in version 2.3.
위와 같이 기본적으로는 blocking 모드이다. non-blocking
mode를 이용하려면 setblocking(flag)을 이용해 non-
blocking mode 로 가거나 아니면 settimeout 을 이용해
non-blocking mode 로 전환하면 된다.
위와 같이 socket 객체를 생성하고 gettimeout을 하면 처음에 아무
것도 볼 수 없음
blocking mode (default) 이므로 값이 무한대임을 의미
그 다음에 setblocking() 을 이용해 non-blocking mode로 변환한 후
gettimeout을 호출하면 0.0 이 나옴
non-blocking mode의 default time out value는 0.0 임
위의 상황에서 생성된 socket 객체를 제거하고 다시
socket을 생성하면 default 이므로 blocking mode 임을
확인
(gettimeout) 여기서 setblocking 을 이용하지 않고 바로
settimeout 을 이용해도 원하는 timeout을 시간을 가진
non-blocking mode 로 변환되는 것을 확인
Example
• 다음은 blocking mode 의 간단한 예제이다.
Server 측 : localhost connection 이고 8000 port 를
binding 한 후 accept 함수를 호출해 client 와의
connection을 기다리고 있다.
• Client 측 : non-blocking mode 이고 timeout 이 3.5 초이
다. connect 을 통해 서버와 연결 된 후 non-blocking
mode로 변환되고, recv 를 통해 3.5 초간 서버로부터의 데
이터 전송을 기다리다가 예외를 발생시킨다.
https://github.com/tylee33/chat
Python 채팅 Programming
(Flask와 Python의 결합)
easy_install 의 설치 준비
• easy_install 를 설치 하기 위한 distribute_setup.py 다운로드
(https://svn.apache.org/repos/asf/oodt/tools/oodtsite.publisher/tru
nk/distribute_setup.py)
• C:DevelopEnvironmentPython27에 distribute_setup.py를 위치
시킨다.
easy_install 의 설치
• easy_install 의 설치를 위한 distribute_setup.py 의 실행
• DOS 창을 열고 python.exe 이 설치된 디렉토리로 이동 하여 다음
의 명령어를 실행
Flask 실행을 위한 사전 작업
웹 프로그래밍 작성
실행
확인
• pip install flask-socketio
Guillermo Rauch가 만든 Socket.io는 WebSocket, FlashSocket, AJAX Long
Polling, AJAX Multi part Streaming, IFrame, JSONP Polling을 하나의 API로
추상화
개발자가 각 기술을 깊이 이해하지 못하거나 구현 방법을 잘 알지 못해도 사
용할 수 있다. Web Socket과 달리 Socket.io는 표준 기술이 아니고 Node.js
모듈로서 Guillermo Rauch가 CTO로 있는
LearnBoost(https://www.learnboost.com)라는 회사의 저작물이며 MIT 라이센
스를 가진 오픈소스이다. 현재 Node.js가 아닌 다른 프레임워크에서
Socket.io를 사용할 수 있도록 하는 시도가 있다.
WebSocket은 표준이지만 모든 브라우저가 WebSocket을 지원하지 않는다.
Web Socket과 달리 Socket.io는 표준 기술이 아니고 Node.js의 한 모듈
socketio
처음 사용자가 홈페이지에 접속하면 before_request 함수를 거쳐, 세션이 존재
하면 pass 존재하지 않으면 session과 username을 할당한다.(테스트를 위한 것
이기 때문에 간단하게 user1, user2, user3 …으로 하였다.)
@socketio.on(이벤트, 네임스페이스)는 해당 이벤트가 들어왔을 때 어떠한 함
수를 실행 시킬 것인지에 대한 것인데, 이 함수는 내부에서는 이벤트, json 을 이
용해 사용자에게 데이터를 전송할 수 있다. 이 때 emit에 broadcast=True 옵션
을 넣게 되면 sender 만이 아닌 연결되어 있는 모든 사용자에게 데이터를 전송
하게 됨
Flask Back-End
http://yumere.tistory.com/53
WebSocket Front-End
처음 socket.io를 사용하기 위해 head 부분에
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/socket.io
/0.9.16/socket.io.min.js"></script>선언
그리고 var socketio = io.connect(...) 함수를 이용해 해당 namespace에 connect
이 후 Back-End의 request 함수에서 데이터를 전송하게 되면
socket.on('response', function())을 이용해 데이터를 처리
https://github.com/tylee33/Chatting
http://developers.linecorp.com/blog/ko/?p=290
Python으로 채팅 구현하기
Python으로 채팅 구현하기
Python으로 채팅 구현하기

Mais conteúdo relacionado

Mais procurados

Ch7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and APICh7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and APIHongmin Park
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영Tae Young Lee
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편Sam Kim
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용noerror
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편Sam Kim
 
이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱Jong Wook Kim
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것흥배 최
 
Free rtos seminar
Free rtos seminarFree rtos seminar
Free rtos seminarCho Daniel
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)내훈 정
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVAcooddy
 
Kgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-fKgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-fSeungmin Shin
 
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현NAVER D2
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?내훈 정
 

Mais procurados (20)

Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
Ch7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and APICh7,8. Configmaps, Secrets and API
Ch7,8. Configmaps, Secrets and API
 
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
2016317 파이썬기초_파이썬_다중설치부터_Jupyter를이용한프로그래밍_이태영
 
도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편도커 없이 컨테이너 만들기 3편
도커 없이 컨테이너 만들기 3편
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
11_웹서비스활용
11_웹서비스활용11_웹서비스활용
11_웹서비스활용
 
1.intro to k8s
1.intro to k8s1.intro to k8s
1.intro to k8s
 
도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편도커 없이 컨테이너 만들기 2편
도커 없이 컨테이너 만들기 2편
 
Lock free queue
Lock free queueLock free queue
Lock free queue
 
이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱이것이 리눅스다 - 김종욱
이것이 리눅스다 - 김종욱
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
multi-thread 어플리케이션에 대해 모든 개발자가 알아 두지 않으면 안 되는 것
 
Free rtos seminar
Free rtos seminarFree rtos seminar
Free rtos seminar
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
Linux tutorial
Linux tutorialLinux tutorial
Linux tutorial
 
네트워크 기본
네트워크 기본네트워크 기본
네트워크 기본
 
TCP/IP Protocol - JAVA
TCP/IP Protocol - JAVATCP/IP Protocol - JAVA
TCP/IP Protocol - JAVA
 
Kgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-fKgc2014 one daylearnunitycryptography-f
Kgc2014 one daylearnunitycryptography-f
 
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
[2D7]레기온즈로 살펴보는 확장 가능한 게임서버의 구현
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 

Semelhante a Python으로 채팅 구현하기

Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Sung-jae Park
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQLI Goo Lee
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약세빈 정
 
[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술NAVER D2
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
Internship backend
Internship backendInternship backend
Internship backendYein Sim
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsminseok kim
 
코딩에는 좋은 노트북이 필요 없다
코딩에는 좋은 노트북이 필요 없다코딩에는 좋은 노트북이 필요 없다
코딩에는 좋은 노트북이 필요 없다Han Sung Kim
 
Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템
Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템
Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템Park JoongSoo
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초Yu Yongwoo
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기YoungSu Son
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기Chris Ohk
 
[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...
[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...
[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...OpenStack Korea Community
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...JooHyung Kim
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]지환 김
 
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트iFunFactory Inc.
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 

Semelhante a Python으로 채팅 구현하기 (20)

Implementing remote procedure calls rev2
Implementing remote procedure calls rev2Implementing remote procedure calls rev2
Implementing remote procedure calls rev2
 
Fluentd with MySQL
Fluentd with MySQLFluentd with MySQL
Fluentd with MySQL
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
 
[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술[112]clova platform 인공지능을 엮는 기술
[112]clova platform 인공지능을 엮는 기술
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
Internship backend
Internship backendInternship backend
Internship backend
 
OpenStack Swift Debugging
OpenStack Swift DebuggingOpenStack Swift Debugging
OpenStack Swift Debugging
 
Meetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vsMeetup tools for-cloud_native_apps_meetup20180510-vs
Meetup tools for-cloud_native_apps_meetup20180510-vs
 
Kafka slideshare
Kafka   slideshareKafka   slideshare
Kafka slideshare
 
KAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdf
 
코딩에는 좋은 노트북이 필요 없다
코딩에는 좋은 노트북이 필요 없다코딩에는 좋은 노트북이 필요 없다
코딩에는 좋은 노트북이 필요 없다
 
Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템
Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템
Jenkins와 Gitlab으로 쉽고 빠르게 구축하는 협업시스템
 
리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초리눅스 소켓 프로그래밍 기초
리눅스 소켓 프로그래밍 기초
 
클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기클라우드 환경에서 알아야할 성능 이야기
클라우드 환경에서 알아야할 성능 이야기
 
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
[C++ Korea 3rd Seminar] 새 C++은 새 Visual Studio에, 좌충우돌 마이그레이션 이야기
 
[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...
[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...
[OpenStack Day in Korea 2015] Track 2-4 - Towards Programmable Network (Conce...
 
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
AWS Community Day 2022 - Nitro Enclave를 이용하여 안전하게 고객 정보 다...
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
 
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
[아이펀팩토리]2017 NDC 강연 자료_아이펀 엔진 개발 노트
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 

Mais de Tae Young Lee

Exploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMsExploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMsTae Young Lee
 
LLM 모델 기반 서비스 실전 가이드
LLM 모델 기반 서비스 실전 가이드LLM 모델 기반 서비스 실전 가이드
LLM 모델 기반 서비스 실전 가이드Tae Young Lee
 
Recommendation System History
Recommendation System HistoryRecommendation System History
Recommendation System HistoryTae Young Lee
 
검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPTTae Young Lee
 
검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론Tae Young Lee
 
The Deep Learning Compiler
The Deep Learning CompilerThe Deep Learning Compiler
The Deep Learning CompilerTae Young Lee
 
History of Vision AI
History of Vision AIHistory of Vision AI
History of Vision AITae Young Lee
 
Enhanced ai platform
Enhanced ai platformEnhanced ai platform
Enhanced ai platformTae Young Lee
 
Real estate trust solution
Real estate trust solutionReal estate trust solution
Real estate trust solutionTae Young Lee
 
Transfer learning usage
Transfer learning usageTransfer learning usage
Transfer learning usageTae Young Lee
 
Create a solution including deep learning models
Create a solution including deep learning modelsCreate a solution including deep learning models
Create a solution including deep learning modelsTae Young Lee
 
Infra as a model service
Infra as a model serviceInfra as a model service
Infra as a model serviceTae Young Lee
 
Deep learning financial product recommendation model
Deep learning financial product recommendation modelDeep learning financial product recommendation model
Deep learning financial product recommendation modelTae Young Lee
 
Deep Learning Through Various Processes
Deep Learning Through Various ProcessesDeep Learning Through Various Processes
Deep Learning Through Various ProcessesTae Young Lee
 
Reinforcement learning
Reinforcement learningReinforcement learning
Reinforcement learningTae Young Lee
 

Mais de Tae Young Lee (20)

Exploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMsExploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMs
 
LLM 모델 기반 서비스 실전 가이드
LLM 모델 기반 서비스 실전 가이드LLM 모델 기반 서비스 실전 가이드
LLM 모델 기반 서비스 실전 가이드
 
Recommendation System History
Recommendation System HistoryRecommendation System History
Recommendation System History
 
검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT검색엔진에 적용된 ChatGPT
검색엔진에 적용된 ChatGPT
 
검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론검색엔진에 적용된 딥러닝 모델 방법론
검색엔진에 적용된 딥러닝 모델 방법론
 
PaLM Paper Review
PaLM Paper ReviewPaLM Paper Review
PaLM Paper Review
 
The Deep Learning Compiler
The Deep Learning CompilerThe Deep Learning Compiler
The Deep Learning Compiler
 
History of Vision AI
History of Vision AIHistory of Vision AI
History of Vision AI
 
Aws architecture
Aws architectureAws architecture
Aws architecture
 
Enhanced ai platform
Enhanced ai platformEnhanced ai platform
Enhanced ai platform
 
Nvidia architecture
Nvidia architectureNvidia architecture
Nvidia architecture
 
Ai based on gpu
Ai based on gpuAi based on gpu
Ai based on gpu
 
Real estate trust solution
Real estate trust solutionReal estate trust solution
Real estate trust solution
 
Transfer learning usage
Transfer learning usageTransfer learning usage
Transfer learning usage
 
Create a solution including deep learning models
Create a solution including deep learning modelsCreate a solution including deep learning models
Create a solution including deep learning models
 
Infra as a model service
Infra as a model serviceInfra as a model service
Infra as a model service
 
Bayesian learning
Bayesian learningBayesian learning
Bayesian learning
 
Deep learning financial product recommendation model
Deep learning financial product recommendation modelDeep learning financial product recommendation model
Deep learning financial product recommendation model
 
Deep Learning Through Various Processes
Deep Learning Through Various ProcessesDeep Learning Through Various Processes
Deep Learning Through Various Processes
 
Reinforcement learning
Reinforcement learningReinforcement learning
Reinforcement learning
 

Python으로 채팅 구현하기

  • 2. 2015년 R User Conference (Neural Network의 변천사를 통해 본 R에서 DNN활용) 2014년 KGC (Korea Game Conference) Falinux 에서 IoT관련 세미나 2013년 PlatformDay Devon 에서 Bigdata관련 세미나 2012년 행정안전부 스마트폰 보안 강의 2011년 공개SW 역량프라자 오픈테크넷 세미나 2016년 BISC Conference (Machine Learning IN SPAM) 2017년 KCD(Korea Community Day) (오픈스택으로 바라본 상용 클라우드 플랫폼) Tensorflow Dev Summit Extended Seoul (Sequence Model and the RNN API)
  • 4. CLI
  • 5. GUI
  • 6. NUI
  • 10. http://blog.restcase.com/webhooks-role-in-the-api-world/ Slack 의 Webhook에 우리의 서버를 등록한다. 등록된 서버로 유입되는 정보(대화)를 분석한다. 결과를 연결된 클라이언트에게 전달
  • 14. Python : Socket Program
  • 16. 클라이언트/서버 아키텍처 서버가 하나 이상의 클라이언트(사용자)에게 '서비스'를 제공 listen
  • 19. Socket • 소켓은 '통신 종단점'이라는 개념을 구체화한 컴퓨터 네트 워크 데이터 구조 • 네트워크를 사용하는 애플리케이션은 통신을 시작하기 전 에 항상 소켓을 만들어야 함 • 소켓 없이는 통신을 시작할 수 없음 • 원래 소켓은 실행중인 프로그램(프로세스)이 같은 호스트 안에 실행 중인 다른 프로그램과 통신하기 위해 개발됨
  • 20. Socket 유형 • 유닉스 소켓 – AF_UNIX 라는 '패밀리 이름' 을 가진다. AF는 주소 패밀리(Address family)를 의미. – 쉽게 클라이언트와 서버가 유닉스 환경의 동일한 컴퓨터에 존재해야 한다는 뜻. – 이 소켓은 파일 기반이다. 소켓의 기반 구조가 파일 시스템을 통해 지원됨 – 파일 시스템은 같은 호스트에서 실행 중인 프로세스 사이에 지속적으 로 공유되므로, 합리적인 방법이라고 할 수 있다. • 네트워크 기반 – 패밀리 이름은 AF_INET 이다. – 클라이언트와 서버가 인터넷 어디서든 존재할 수 있다는 의미를 갖는 다 • 파이썬은 AF_UNIX, AF_NETLINK, AF_TIPC, AF_INET{,6} 패 밀리를 지원
  • 21. 연결 방식에 따른 분류 • 연결 지향 소켓(connection oriented) – 통신을 하기 전에 반드시 연결 돼 있어야 한다(전화를 거는 것과 유사) – 레코드 경계 없이 데이터를 순서대로 신뢰성 있게 중복없이 전 달. 각 메세지는 여러 조각으로 나뉘어서 반대편에 확실히 전달 된 다음에 다시 순서대로 한데 묶인 후 기다리는 애플리케이션 에 전달 – 연결 지향 소켓을 구현한 프로토콜(protocol)로는 전송 제어 프 로토콜(TCP, Trasmission Control Protocol) 이 있으며, 이 소켓을 만드려면 소켓 유형으로 SOCK_STREAM(스트림 소켓)을 지정 – 이 소켓은 네트워크상에서 IP를 호스트를 찾기 위해 사용하기 때 문에 두 프로토콜의 이름을 붙여 TCP/IP 라고 함.
  • 22. • 비연결형 소켓(connectionless) – 스트림 소켓과 대비되는 데이터그램(Datagram) 유형의 비연결 – 통신 시 최초 연결하는 과정이 필요 없음 – 데이터 전달 과정에서 순서나 신뢰성 이나 중복 방지를 보장할 수 없음. 이는 메세지가 연결 지향 소켓처럼 조각으로 나뉘지 않 고 통째로 송신된다는 것을 의미(우편 서비스에 비유) – 연결 지향 소켓은 가상 회선을 맨 처음 만들고 유지하기 위해 상 당한 부가 비용이 발생 비연결 지향 소켓은 이런 부담이 덜하고 성능면에서 더 좋다. – 데이터그램 소켓을 구현한 프로토콜로는 (UDP, User Datagram Protocol)이 있고, UPD 소켓을 만들려면 SOCK_DGRAM을 소켓 유형으로 지정. – 이 소켓도 IP를 네트워크상에서 호스트를 찾기 위해 사용 UPD/IP라고도 부름
  • 25. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM)
  • 26. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799))
  • 27. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1)
  • 28. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1) conn, addr = svrsock.accept() addr ('127.0.0.1', 50933)
  • 29. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1) conn, addr = svrsock.accept() addr ('127.0.0.1', 50933) conn.recv(1024)
  • 30. conn.close() from socket import * svrsock = socket(AF_INET, SOCK_STREAM) svrsock.bind(('127.0.0.1', 7799)) svrsock.listen(1) conn, addr = svrsock.accept() addr ('127.0.0.1', 50933) conn.recv(1024) conn.close()
  • 31. conn.close() from socket import * clientsock = socket(AF_INET, SOCK_STREAM)
  • 32. conn.close() from socket import * clientsock = socket(AF_INET, SOCK_STREAM) clientsock.connect(('127.0.0.1',7799))
  • 33. conn.close() from socket import * clientsock = socket(AF_INET, SOCK_STREAM) clientsock.connect(('127.0.0.1',7799)) clientsock.send('Hi, it is me.')
  • 35. Blocking & Non-Blocking • blocking 모드일 때 accept, recv, send 호출할 때 연결하려 고 하는 client 가 없을 때 무한정 기다리는 것 • non-blocking 모드일 때는 위와 같은 상황에서 일정한 시 간을 기다려도 응답이 없을 때 예외가 발생
  • 36. • https://pl.python.org/docs/lib/socket-objects.html • setblocking(flag) Set blocking or non-blocking mode of the socket: if flag is 0, the socket is set to non- blocking, else to blocking mode. Initially all sockets are in blocking mode. In non- blocking mode, if a recv() call doesn't find any data, or if a send() call can't immediately dispose of the data, a error exception is raised; in blocking mode, the calls block until they can proceed. s.setblocking(0) is equivalent to s.settimeout(0); s.setblocking(1) is equivalent to s.settimeout(None). • settimeout(value)Set a timeout on blocking socket operations. The value argument can be a nonnegative float expressing seconds, or None. If a float is given, subsequent socket operations will raise an timeout exception if the timeout period value has elapsed before the operation has completed. Setting a timeout of None disables timeouts on socket operations. s.settimeout(0.0) is equivalent tos.setblocking(0); s.settimeout(None) is equivalent to s.setblocking(1). New in version 2.3. • gettimeout()Return the timeout in floating seconds associated with socket operations, or None if no timeout is set. This reflects the last call tosetblocking() or settimeout(). New in version 2.3. 위와 같이 기본적으로는 blocking 모드이다. non-blocking mode를 이용하려면 setblocking(flag)을 이용해 non- blocking mode 로 가거나 아니면 settimeout 을 이용해 non-blocking mode 로 전환하면 된다.
  • 37. 위와 같이 socket 객체를 생성하고 gettimeout을 하면 처음에 아무 것도 볼 수 없음 blocking mode (default) 이므로 값이 무한대임을 의미 그 다음에 setblocking() 을 이용해 non-blocking mode로 변환한 후 gettimeout을 호출하면 0.0 이 나옴 non-blocking mode의 default time out value는 0.0 임
  • 38. 위의 상황에서 생성된 socket 객체를 제거하고 다시 socket을 생성하면 default 이므로 blocking mode 임을 확인 (gettimeout) 여기서 setblocking 을 이용하지 않고 바로 settimeout 을 이용해도 원하는 timeout을 시간을 가진 non-blocking mode 로 변환되는 것을 확인
  • 39. Example • 다음은 blocking mode 의 간단한 예제이다. Server 측 : localhost connection 이고 8000 port 를 binding 한 후 accept 함수를 호출해 client 와의 connection을 기다리고 있다.
  • 40. • Client 측 : non-blocking mode 이고 timeout 이 3.5 초이 다. connect 을 통해 서버와 연결 된 후 non-blocking mode로 변환되고, recv 를 통해 3.5 초간 서버로부터의 데 이터 전송을 기다리다가 예외를 발생시킨다.
  • 43. easy_install 의 설치 준비 • easy_install 를 설치 하기 위한 distribute_setup.py 다운로드 (https://svn.apache.org/repos/asf/oodt/tools/oodtsite.publisher/tru nk/distribute_setup.py) • C:DevelopEnvironmentPython27에 distribute_setup.py를 위치 시킨다.
  • 44. easy_install 의 설치 • easy_install 의 설치를 위한 distribute_setup.py 의 실행 • DOS 창을 열고 python.exe 이 설치된 디렉토리로 이동 하여 다음 의 명령어를 실행
  • 45. Flask 실행을 위한 사전 작업
  • 48. 확인 • pip install flask-socketio
  • 49. Guillermo Rauch가 만든 Socket.io는 WebSocket, FlashSocket, AJAX Long Polling, AJAX Multi part Streaming, IFrame, JSONP Polling을 하나의 API로 추상화 개발자가 각 기술을 깊이 이해하지 못하거나 구현 방법을 잘 알지 못해도 사 용할 수 있다. Web Socket과 달리 Socket.io는 표준 기술이 아니고 Node.js 모듈로서 Guillermo Rauch가 CTO로 있는 LearnBoost(https://www.learnboost.com)라는 회사의 저작물이며 MIT 라이센 스를 가진 오픈소스이다. 현재 Node.js가 아닌 다른 프레임워크에서 Socket.io를 사용할 수 있도록 하는 시도가 있다. WebSocket은 표준이지만 모든 브라우저가 WebSocket을 지원하지 않는다. Web Socket과 달리 Socket.io는 표준 기술이 아니고 Node.js의 한 모듈 socketio
  • 50. 처음 사용자가 홈페이지에 접속하면 before_request 함수를 거쳐, 세션이 존재 하면 pass 존재하지 않으면 session과 username을 할당한다.(테스트를 위한 것 이기 때문에 간단하게 user1, user2, user3 …으로 하였다.) @socketio.on(이벤트, 네임스페이스)는 해당 이벤트가 들어왔을 때 어떠한 함 수를 실행 시킬 것인지에 대한 것인데, 이 함수는 내부에서는 이벤트, json 을 이 용해 사용자에게 데이터를 전송할 수 있다. 이 때 emit에 broadcast=True 옵션 을 넣게 되면 sender 만이 아닌 연결되어 있는 모든 사용자에게 데이터를 전송 하게 됨 Flask Back-End http://yumere.tistory.com/53
  • 51. WebSocket Front-End 처음 socket.io를 사용하기 위해 head 부분에 <script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/socket.io /0.9.16/socket.io.min.js"></script>선언 그리고 var socketio = io.connect(...) 함수를 이용해 해당 namespace에 connect 이 후 Back-End의 request 함수에서 데이터를 전송하게 되면 socket.on('response', function())을 이용해 데이터를 처리