728x90
반응형

Transmission Control Protocol

 

컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약(프로토콜)의 일종

한국어로 번역하면 전송 제어 프로토콜.

TCP는 세계 통신 표준으로 개발된 OSI 모형에서 4번째 계층인 전송 계층(Transport Layer)에서 사용하는 규약으로,

보통 하위 계층에서 사용하는 IP와 엮여서 TCP/IP로 표현하는 경우가 많음

동일 계층에서 사용하는 또 다른 프로토콜인 UDP 가 존재함.

 


# socket-server.py

import socket
from _thread import *   # Load to entire module in Thread


# Create Thread
def socketThread(clientSocket, addr):
    
    print('addr : ', addr)
    while True:
        data = clientSocket.recv(1024)
        
        if not data:
            print('Disconnected addr : ', addr)
            break
        
        print('Receved addr: ', addr, data.decode()) # (decode)binary -> text
        
        clientSocket.send(data)

HOST = '127.0.0.1' # Local Host
PORT = 9999

serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serverSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serverSocket.bind((HOST, PORT)) # tuple
serverSocket.listen()

print('server start')

while True:
    print('wait')
    
    clientSocket, addr = serverSocket.accept()
    start_new_thread(socketThread, (clientSocket, addr))
    
serverSocket.close()
# socket-client.py

import socket


HOST = '192.168.0.49'
PORT = 9999

clientSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
clientSocket.connect((HOST, PORT))

while True:
    inputText = input('send message : ')
    
    clientSocket.send(inputText.encode()) # (encode)String -> Binary
    
    data = clientSocket.recv(1024)
    print('Received message : ', data.decode())

# socket-server-cam.py

import socket 
from _thread import *

import cv2
import base64
import numpy as np


# 쓰레드에서 실행되는 코드입니다. 
# 접속한 클라이언트마다 새로운 쓰레드가 생성되어 통신을 하게 됩니다. 
def threaded(client_socket, addr): 

    global clients

    print('Connected by :', addr[0], ':', addr[1]) 

    clients.append(client_socket)
    clientIndex = len(clients) - 1

    # 클라이언트가 접속을 끊을 때 까지 반복합니다. 
    while True: 

        try:
            # 데이터가 수신되면 클라이언트에 다시 전송합니다.(에코)
            data = client_socket.recv(1024)
            if not data: 
                print('Disconnected by ' + addr[0],':',addr[1])
                clients.pop(clientIndex)

                break

            # print('Received from ' + addr[0],':',addr[1] , data.decode())
            # client_socket.send(data) 

        except ConnectionResetError as e:

            print('Disconnected by ' + addr[0],':',addr[1])
            break
             
    client_socket.close() 


HOST = '127.0.0.1'
PORT = 9999

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_socket.bind((HOST, PORT)) 
server_socket.listen() 

print('server start')


clients = []

def sendCamThread(cap):

    global clients

    while cap.isOpened():
        retval, frame = cap.read()

        if not retval:
            continue

        decoImg = cv2.imencode('.jpg', frame)[1]
        bData = base64.b64encode(decoImg)
        # print('imageBytes: ', len(imageBytes))
        
        for client in clients:
            # byte로 바꿔서 전송
            try:
                client.send(bData)
                client.send(b'\x20')
            except:
                pass
            

cap = cv2.VideoCapture(0)
start_new_thread(sendCamThread, (cap,))

# 클라이언트가 접속하면 accept 함수에서 새로운 소켓을 리턴합니다.
# 새로운 쓰레드에서 해당 소켓을 사용하여 통신을 하게 됩니다. 
while True: 

    print('wait')

    client_socket, addr = server_socket.accept()
    start_new_thread(threaded, (client_socket, addr)) 

server_socket.close()
# socket-client-cam.py

import socket 
import cv2
import numpy as np
import base64


HOST = '127.0.0.1'
PORT = 9999

client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 
client_socket.connect((HOST, PORT)) 

recivedBuf = b''

# 키보드로 입력한 문자열을 서버로 전송하고 
# 서버에서 에코되어 돌아오는 메시지를 받으면 화면에 출력합니다. 
# quit를 입력할 때 까지 반복합니다. 
while True: 

    data = client_socket.recv(1024)
    space = data.find(b'\x20')

    # # if data.find(b'\xff\xd8') > -1:
    if space > -1:

        key = cv2.waitKey(16)
        if key == 27:
            break

        # 11111111111201111111111
        
        # 지금까지 받은 데이터를 출력
        recivedBuf += data[:space]
        # print('Received from the server :', len(recivedBuf))
        # print('Received from the server :', recivedBuf)

        buf = base64.b64decode(recivedBuf)
        buf = np.frombuffer(buf, dtype=np.uint8)  #jpg

        img = cv2.imdecode(buf, cv2.IMREAD_COLOR)
        # print('Received from the server img:', img.shape)

        cv2.imshow('cam', img)

        recivedBuf = b''
        recivedBuf += data[space+1:]

        continue


    recivedBuf += data
    # print('Received from the server :', len(recived))

client_socket.close()
728x90
반응형

'Network' 카테고리의 다른 글

Network Structure  (0) 2022.12.17
File Transfer Protocol (FTP)  (0) 2022.12.04
HTTP Protocol  (0) 2022.12.01
Protocol  (0) 2022.12.01
Serial Communication  (0) 2022.12.01

+ Recent posts