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 |