[Flask] Flask 웹 소켓 서버 구축
웹 소켓이란? 본래 서버와 클라이언트가 통신하기 위해서는 HTTP 통신을 통해 클라이언트의 요청과 서버의 응답 형식으로 통신이 이루어진다. HTTP 통신은 무조건 클라이언트의 요청이 있어야 서버에서 데이터를 송신할 수 있는데, 이 과정이 이루어지고 나면 클라이언트와 서버 간의 연결이 종료된다. 이를 개선하여 클라이언트와 서버의 연결을 유지하면서 서로 원할 때마다 데이터를 송수신 하기 위해 등장한 것이 웹 소켓이다. 1. SocketIO 라이브러리 설치 pip install flask-socketio 에디터 터미널에 입력해준다. 2. 해당 라이브러리 임포트 from flask_socketio import SocketIO 3. Flask 서버에 웹 소켓 서버 적용 app = Flask(__name__) so..
2024.02.05
[Flask] Flask 서버를 이용한 카메라 웹 스트리밍
파이썬의 OpenCV를 이용한 카메라를 웹에 표출하기 위해서는 Flask 서버를 구축해야 한다. 1. Flask 설치 pip install Flask Flask를 설치하기 위해 해당 명령어를 입력한다. 2. 라이브러리 Import from flask import Flask, Response, render_template import cv2 Flask를 포함하여 여러 라이브러리를 임포트한다. 3. 카메라 표출 함수 생성 camera = cv2.VideoCapture(0) def generate_frames(): while True: success, frame = camera.read() # 프레임 읽기 if not success: break else: ret, buffer = cv2.imencode('.j..
2024.02.01
728x90

웹 소켓이란?

  • 본래 서버와 클라이언트가 통신하기 위해서는 HTTP 통신을 통해 클라이언트의 요청과 서버의 응답 형식으로 통신이 이루어진다.
  • HTTP 통신은 무조건 클라이언트의 요청이 있어야 서버에서 데이터를 송신할 수 있는데, 이 과정이 이루어지고 나면 클라이언트와 서버 간의 연결이 종료된다.
  • 이를 개선하여 클라이언트와 서버의 연결을 유지하면서 서로 원할 때마다 데이터를 송수신 하기 위해 등장한 것이 웹 소켓이다.

 

1. SocketIO 라이브러리 설치

pip install flask-socketio
  • 에디터 터미널에 입력해준다.

 

2. 해당 라이브러리 임포트

from flask_socketio import SocketIO

 

 

3. Flask 서버에 웹 소켓 서버 적용

app = Flask(__name__)
socketio = SocketIO(app)
  • 변수로 생성한 Flask 객체를 SocketIO 생성자에 삽입하여 웹 소켓 서버로 적용한다.

 

4. 서버 실행

socketio.run(app, port=5000, debug=True)
  • 기존 Flask 서버를 실행할 때는 app.run() 함수를 실행시켰지만, 웹소켓을 적용한 서버를 실행할 때는 socketio.run() 함수를 실행한다.

 

5. 데이터를 송수신하는 방법

socketio.emit('sendEventName', data) # 데이터 송신

@socketio.on('receiveEventName') # 데이터 수신
def handle_message(data):
    print('받은 데이터: {}'.format(data))
  • 클라이언트와 데이터를 송수신하기 위해서는 각 작업이 이루어지는 이벤트 이름을 클라이언트와 통일한다.
  • 첫 번째 파라미터에는 그에 해당하는 이벤트 이름을 적고, 두 번째 파라미터에는 보내거나 받는 데이터가 사용된다.
728x90

'Python > Flask' 카테고리의 다른 글

[Flask] Flask 서버를 이용한 카메라 웹 스트리밍  (0) 2024.02.01
728x90

파이썬의 OpenCV를 이용한 카메라를 웹에 표출하기 위해서는 Flask 서버를 구축해야 한다.

 

1. Flask 설치

pip install Flask
  • Flask를 설치하기 위해 해당 명령어를 입력한다.

 

2. 라이브러리 Import

from flask import Flask, Response, render_template
import cv2
  • Flask를 포함하여 여러 라이브러리를 임포트한다.

 

3. 카메라 표출 함수 생성

camera = cv2.VideoCapture(0)
def generate_frames():
    while True:
        success, frame = camera.read()  # 프레임 읽기
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\\r\\n'
                   b'Content-Type: image/jpeg\\r\\n\\r\\n' + frame + b'\\r\\n')  # 프레임 스트리밍
  • 카메라 영상의 프레임 단위 이미지를 반환해주는 함수를 작성한다.
  • 일단 IP 카메라가 존재하지 않아서 camera = cv2.VideoCapture(0)을 통해 웹캠을 불러온다.

 

4. 카메라 표출 함수 실행 매핑 작성

@app.route('/camera')
def getCamera():
    return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')
  • 카메라 프레임을 반환해주는 매핑 함수를 작성한다.
  • 해당 함수는 html 내에서 이용하면 된다.

 

5. 카메라 표출 페이지 출력 매핑 작성

@app.route('/cameraPage')
def cameraPage():
    return render_template('cameraPage.html')
  • 카메라 영상을 보여줄 페이지를 렌더링는 매핑을 작성한다.

 

6. 카메라를 최종적으로 출력하는 HTML 작성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Camera</title>
</head>
<body>
    <div>
        <img src="/camera" style="height:100vh; width: 100%"/>
    </div>
</body>
</html>
  • <img src="/camera" style="height:100vh; width: 100%"/> 해당 코드를 통해 Flask 내 카메라 표출 함수를 이용하여 최종적으로 카메라를 표출한다.

 

※ 전체 코드

from flask import Flask, Response, render_template
import cv2

app = Flask(__name__)
camera = cv2.VideoCapture(0)  # 웹캠에 연결

@app.route('/')
@app.route('/home')
def home():
    return '메인 페이지'

def generate_frames():
    while True:
        success, frame = camera.read()  # 프레임 읽기
        if not success:
            break
        else:
            ret, buffer = cv2.imencode('.jpg', frame)
            frame = buffer.tobytes()
            yield (b'--frame\\r\\n'
                   b'Content-Type: image/jpeg\\r\\n\\r\\n' + frame + b'\\r\\n')  # 프레임 스트리밍

@app.route('/cameraPage')
def cameraPage():
    return render_template('cameraPage.html')

@app.route('/camera')
def getCamera():
    return Response(generate_frames(), mimetype='multipart/x-mixed-replace; boundary=frame')

if __name__ == '__main__':
    app.run(debug=True)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Camera</title>
</head>
<body>
    <div>
        <img src="/camera" style="height:100vh; width: 100%"/>
    </div>
</body>
</html>
728x90

'Python > Flask' 카테고리의 다른 글

[Flask] Flask 웹 소켓 서버 구축  (0) 2024.02.05