본문 바로가기
WebSocket

[파이썬] 웹 소켓 사용하기!😊

by @ENFJ 2022. 11. 12.

1. 웹 소켓 라이브러리 설치

pip install websockets

2. 웹 소켓 스크립트 작성

# 웹 소켓 서버사용 start
# 
#  
import asyncio;
# 웹 소켓 모듈을 선언한다.
import websockets;
 
# 클라이언트 접속이 되면 호출된다.
async def accept(websocket, path):
  while True:
    # 클라이언트로부터 메시지를 대기한다.
    data = await websocket.recv();
    print("receive : " + data);
    # 클라인언트로 echo를 붙여서 재 전송한다.
    await websocket.send("echo : " + data);
 
# 웹 소켓 서버 생성.호스트는 localhost에 port는 9998로 생성한다. 
start_server = websockets.serve(accept, "localhost", 9998);
# 비동기로 서버를 대기한다.
asyncio.get_event_loop().run_until_complete(start_server);
asyncio.get_event_loop().run_forever();

# 웹 소켓 서버사용 END

import asyncio 에서 asyncio 란?

파이썬 3.5부터 지원하는 asyncio는 비동기 프로그래밍을 위한 모듈입니다.

+asyncio는 async/await 구문을 사용하여 동시성 코드를 작성하는 라이브러리입니다.

 

아래는 asyncio(비동기 i/o) 예제 코드입니다. (https://docs.python.org/ko/3.8/library/asyncio.html)

import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

# Python 3.7+
asyncio.run(main())

 

실행시켜보면 hello... 가 출력되고 1초 뒤 ...world 도 출력 되는 것을 확인 할 수 있다.

 

async 키워드는 function 앞에 사용한다. function 앞에 async를 붙이면 해당 함수는 항상 프라미스를 반환한다. 프라미스가 아닌 값을 반환하더라도 이행 상태의 프라미스(resolved promise)로 값을 감싸 이행된 프라미스가 반환되도록 한다.

 

awaitasync 함수 안에서만 동작한다. await는 ‘기다리다'라는 뜻을 가진 영단어 인데, 프라미스가 처리될 때 까지 기다리는 역할을 한다. 그리고 결과는 그 이후 반환된다.

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>Insert title here</title>
  </head>
<body>
  <form>
    <!-- 서버로 메시지를 보낼 텍스트 박스 -->
    <input id="textMessage" type="text">
    <!-- 전송 버튼 -->
    <input onclick="sendMessage()" value="Send" type="button">
    <!-- 접속 종료 버튼 -->
    <input onclick="disconnect()" value="Disconnect" type="button">
  </form>
  <br />
  <!-- 출력 area -->
  <textarea id="messageTextArea" rows="10" cols="50"></textarea>
  <script type="text/javascript">
    // 웹 서버를 접속한다.
    var webSocket = new WebSocket("ws://localhost:9998");
    // 웹 서버와의 통신을 주고 받은 결과를 출력할 오브젝트를 가져옵니다.
    var messageTextArea = document.getElementById("messageTextArea");
    // 소켓 접속이 되면 호출되는 함수
    webSocket.onopen = function(message){
      messageTextArea.value += "Server connect...\n";
    };
    // 소켓 접속이 끝나면 호출되는 함수
    webSocket.onclose = function(message){
      messageTextArea.value += "Server Disconnect...\n";
    };
    // 소켓 통신 중에 에러가 발생되면 호출되는 함수
    webSocket.onerror = function(message){
      messageTextArea.value += "error...\n";
    };
    // 소켓 서버로 부터 메시지가 오면 호출되는 함수.
    webSocket.onmessage = function(message){
      // 출력 area에 메시지를 표시한다.
      messageTextArea.value += "Recieve From Server => "+message.data+"\n";
    };
    // 서버로 메시지를 전송하는 함수
    function sendMessage(){
      var message = document.getElementById("textMessage");
      messageTextArea.value += "Send to Server => "+message.value+"\n";
      //웹소켓으로 textMessage객체의 값을 보낸다.
      webSocket.send(message.value);
      //textMessage객체의 값 초기화
      message.value = "";
    }
    function disconnect(){
      webSocket.close();
    }
  </script>	
</body>	
</html>

결과

 

참고:

http://mohwaproject.tistory.com/entry/%E3%85%81%E3%85%81%E3%85%81

 

웹에서 실시간 데이터 처리하기(WebSocket, Comet)

HTML5 WebSocket은 웹에서 양 방향 통신을 지원하며, 그에 따른 실시간 서비스를 구현하기에 적합한 기술입니다. 또한, HTTP 실시간 통신 방식(COMET)인 폴링(Polling), 롱폴링(Long Polling), 스트리밍(Streaming)

mohwaproject.tistory.com

https://nowonbun.tistory.com/674

'WebSocket' 카테고리의 다른 글

웹 소켓(WebSocket) 코드분석(server.js 편)  (1) 2022.11.14
웹 소켓 (코드 분석 2 : python 편)  (0) 2022.11.13
웹 소켓 (코드 분석)  (1) 2022.11.13
웹 소켓 (Web Socket)🤝🤝  (1) 2022.11.12