D2CampusFest / 3rd

27 stars 4 forks source link

python 에서 client 구별이 가능한 websocket server라이브러리 #34

Closed MyeongKim closed 8 years ago

MyeongKim commented 8 years ago

제가 구현하고자 하는 socket server 기능이 그다지 복잡하지 않아서 웬만하면 현 프로젝트 내에서 python파일을 만들어 동작시키고자 합니다.(현재 프로젝트가 python으로 만들어져있어서)

지난번 밋업에서 말씀해주신것처럼 오픈소스 프로젝트이다보니 되도록이면 node.js같은 다른 플랫폼을 사용하지 않으려고 하는데요, websocket server 기능을 제공하는 라이브러리 중에 socket.io 의 client id 처럼 client들을 서로 구별할 수 있고, 각각의 client들에게 실시간으로 필요한 데이터를 전송하는 기능을 제공하는 라이브러리가 있을까요?

websocket 대신에 ajax로 setTimeout함수를 써서 1초마다 서버에서 모든 데이터를 다시 가져오는 식으로 구현할 수도 있지만 오버헤드가 너무 클 것 같습니다.

gevent-socketio, python-socketio 는 프로젝트가 죽은 상태인 것 같고, 자료를 많이 찾을 수 없었습니다. django-socketio는 python3를 지원하지 않아서 제가 사용할 수가 없네요.

tornado 나 twisted같은 프레임워크를 사용해야하는지(이럴 경우 새로운 프로젝트로 분리) 아니면 차라리 node.js+socket.io조합으로 가야 할지 (마찬가지로 프로젝트 분리) 여러분들의 의견이 궁금합니다.

maxtortime commented 8 years ago

QuesCheetah 코드를 잠시 읽어보았는데 세션 유지를 위해 소켓이 필요하신 거라면 이게 맞는지는 모르겠지만 httpie로 직접 요청을 날려서 로그인이 되게 하는 방법도 있을 것 같습니다. 저희도 맨 처음에 터미널로 로그인을 시도하려고 계속 curl로 웹에 직접 요청을 날려보았지만 번번히 실패해서 httpie를 썼는데 잘 작동했습니다.

저는 flask밖에 할 줄 몰라서 django에서는 어찌 할지 잘 모르겠지만 엔드포인트 하나 잡아주시고 @http_auth_required만 붙여주시고 그 엔드포인트로 아이디하고 비번을 보내시면 될 것 같습니다. 문제는 구별인데 거기까진 구현을 안 하고 프로젝트 방향이 전환되서 정확한 말씀을 못드리겠네요.

MyeongKim commented 8 years ago

@maxtortime 아, 질문 설명이 부족했던것 같습니다. 클라이언트들을 구별하는건 말씀해주신 세션 유지로 처리가 가능할 것 같은데 ...제가 필요했던 기능은 connection되어있는 클라이언트들에게 실시간으로 각자 필요한 메시지를 전달해주는 기능이었습니다. 장고 세션 관련해서 좀더 찾아보도록 하겠습니다. 감사합니다. ^^

MyeongKim commented 8 years ago

질문 수정했습니다.

kbu1564 commented 8 years ago

파이썬 socket.io 프로젝트가 죽은 원인이 아마 조심스레 socket.io 에서 버전별로 independence 한 부분이 존재하여 그럴것이라 생각합니다.

실제로 PHP에도 지금 말씀하신 것과 같은 프로젝트가 존재합니다. 지금도 이루어 지고 있긴한데요 elephant.io라는 프로젝트 입니다. PHP에서 socket.io 와 web socket 으로 통신하기 위한 것입니다. 이 프로젝트에서 socket.io 0.X 버전과 통신하기 위한 클래스 개발에 코드 기여하면서 websocket 쪽으로 공부한적이 있었습니다.

websocket은 HTTP 계층과 동일선상의 계층에 존재하는 프로토콜 입니다. 제가 이를 이용하여 node.js의 socket.io처럼 구현하고자 하였을때 아래 표준 문서를 많이 참고하였습니다. https://tools.ietf.org/html/rfc6455#section-5.2

무엇보다 파이선의 socket.io 프로젝트가 활동한지 몇달 된 것이라면 socket.io 버전이 바뀌면서 작동하지 않을 가능성이 존재합니다. 테스트를 하신다면 javascript로 socket.io 를 쓰지말고 순수 websocket만으로 통신로직을 구현하시는 것과, node.js + socket.io 방법으로 가시는 것이라 생각합니다.

websocket 만을 이용하여 node.js 와 통신하기 원하신다면 아직 죽지않고 활발히 활동하는 websocket 통신관련 파이썬 라이브러리들이 존재하는데 아래것이 바로 보이길래 참고링크 넣어 봅니다. https://github.com/aaugustin/websockets

websocket 통신을 node.js의 socket.io를 사용하지 않고, 클라이언트에서 javascript 로 구현하고, 이를 파이썬 라이브러리를 활용한다면 이 또한 쉬운 방법일수 있을것 같고 지금 상황에서는 이게 그나마 가장 효율이 좋아 보인다 생각합니다.

단 이 경우 파이선으로 돌아가는 websocket-server가 서버상에 daemon형태로 존재해야 하며, 파이썬의 websocket 라이브러리 들이 server 를 위한 것인지 client 제작을 위한 것인지를 잘 확인하셔야 할 것 같습니다.

이건 별 도움은 안되는 말인데요

node.js 의 socket.io 가 큰 이유는 모든 브라우져에 대응하기 위한 것 입니다. 만약 html5를 지원한다면 websocket통신을, 지원하지 않는다면 ajax 를 이용한 xhr-polling 방식을, 이마저도 지원하지 않는다면 flash를 이용한 polling 방식을 지원하도록 되어져 있습니다.

MyeongKim commented 8 years ago

@kbu1564

아, socket.io버전별 차이때문에 django-socketio 같은 것들이 새로운 버전을 더이상 지원하지 않는다고 하는거군요. 아마 gevent-socket.io, python-socketio도 같은 이유인 것 같습니다. 추천해주신대로 client 와 server 에서 socket.io를 사용하지 않고 websocket 만을 사용해서 구현해야겠습니다.

알려주신 https://github.com/aaugustin/websockets 는 제가 며칠 전에 테스트해보고 특정 client를 지정해서 데이터를 전송하는 방법을 찾지못해 포기했었는데, 방금 http://stackoverflow.com/questions/16280747/sending-message-to-a-specific-connected-users-using-websocket 이 링크를 보니 좀 감이 오는 것 같습니다.

socket.io 와 websocket, ajax, polling 방식도 동작 원리만 대충 알고있었지 목적은 정확히 알지 못했는데 덕분에 부족했던 부분을 많이 알게 되었습니다. 정말 감사합니다. ^^ :+1: