대학생 코딩 과제 대행 java, python, oracle 열 번째

https://open.kakao.com/o/s3aMpbA


이번에는 파이썬으로 소켓통신을 하는데 이미지를 주고 받을 수 있도록 코드를 짜 달라고 의뢰를 받았다.

먼저 첫 번째 유형은 클라이언트측에서 이미지파일들을 전송하면 서버에서 수신해서 저장할 수 있도록 하는것이였다.

두 번째 유형은 반대로 서버측에서 이미지파일들을 클라이언트측으로 보내고 클라이언트측에서 저장 할 수 있도록 하는것이였다.


유형 1 : server.py

# TCP server example

from socket import *
import socket
import os
import time
import sys

# 이미지 파일 저장경로
src = "C:\\Users\\자신의유저이름\\Desktop\\저장하고싶은폴더이름\\"


def fileName():
    dte = time.localtime()
    Year = dte.tm_year
    Mon = dte.tm_mon
    Day = dte.tm_mday
    WDay = dte.tm_wday
    Hour = dte.tm_hour
    Min = dte.tm_min
    Sec = dte.tm_sec
    imgFileName = src + str(Year) + '_' + str(Mon) + '_' + str(Day) + '_' + str(Hour) + '_' + str(Min) + '_' + str(
        Sec) + '.jpg'
    return imgFileName


# 서버 소켓 오픈
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 5001))
server_socket.listen(5)

print("TCPServer Waiting for client on port 5000")

while True:

    # 클라이언트 요청 대기중 .
    client_socket, address = server_socket.accept()
    # 연결 요청 성공
    print("I got a connection from ", address)

    data = None

    # Data 수신
    while True:
        img_data = client_socket.recv(1024)
        data = img_data
        if img_data:
            while img_data:
                print("recving Img...")
                img_data = client_socket.recv(1024)
                data += img_data
            else:
                break

    # 받은 데이터 저장
    # 이미지 파일 이름은 현재날짜/시간/분/초.jpg
    img_fileName = fileName()
    img_file = open(img_fileName, "wb")
    print("finish img recv")
    print(sys.getsizeof(data))
    img_file.write(data)
    img_file.close()
    print("Finish ")




client_socket.close()
print("SOCKET closed... END")


유형 1 : client.py

# TCP client example

import socket
import sys
import os
import time

# 받은 파일 저장 경로 폴더
src = "C:\\Users\\자신의유저이름\\Desktop\\save\\";


def fileName():
    dte = time.localtime()
    Year = dte.tm_year
    Mon = dte.tm_mon
    Day = dte.tm_mday
    WDay = dte.tm_wday
    Hour = dte.tm_hour
    Min = dte.tm_min
    Sec = dte.tm_sec
    imgFileName = src + str(Year) + '_' + str(Mon) + '_' + str(Day) + '_' + str(Hour) + '_' + str(Min) + '_' + str(
        Sec) + '.jpg';
    return imgFileName



def transfer(filename):
    capture_file_name = "C://Users//자신의유저이름//Desktop//" + str(filename) + ".jpg"
    # 아래에는 저장 코드가 들어가야 한다.
    # save


    # 3 저장된 파일 보내기

    # img 가져오기 보낼 (파일경로/이름)
    file = open(capture_file_name, "rb")
    img_size = os.path.getsize(capture_file_name)
    img = file.read(img_size)  # 저장된 이미
    file.close()

    # 서버 연결
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect(("127.0.0.1", 5001))

    # 이미지 전송
    client_socket.sendall(img)

    # 서버와 연결 종료
    client_socket.close()
    print("Finish SendAll")




#transfer 함수에 인자값으로 파일 이름을 넣어주면 차례대로 for문을 돌면서 서버쪽으로 이미지파일 전송함
filename_list = [1, 2, 3, 4, 5, 6] # 파일이름을 1.jpg, 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 총 6개 파일
#이미지파일이름을 변경하면 리스트안에 멤버들의 값도 이미지 파일의 이름과 같게 설정하면됨
for i in filename_list:
    transfer(i)
    time.sleep(3) # 서버쪽에서 먼저 보낸 이미지 파일을 다 받기를 기다리기 위해서 3초동안 쉬어줌




유형 2 : server.py

import socket
import os
import time


def send_img(filename):
    capture_file_name = "C://Users//자신의유저이름//Desktop//" + str(filename) + ".jpg"



    file = open(capture_file_name, "rb")
    img_size = os.path.getsize(capture_file_name)
    img = file.read(img_size)
    file.close()
    client_socket.sendall(img)


# 서버 소켓 오픈

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 5001))
server_socket.listen(1)

print("TCPServer Waiting for client on port 5001")

while True:
    # 클라이언트 요청 대기중 .
    client_socket, address = server_socket.accept()
    # 연결 요청 성공
    print("I got a connection from ", address)

    if client_socket.recv(1024) == b'hi':#클라쪽에서 이 메세지를 주면 사진을 클라쪽으로 전송한다.

        # send_img 함수에 인자값으로 파일 이름을 넣어주면 차례대로 for문을 돌면서 서버쪽으로 이미지파일 전송함
        filename_list = [1, 2, 3, 4, 5, 6]  # 파일이름을 1.jpg, 2.jpg 3.jpg 4.jpg 5.jpg 6.jpg 총 6개 파일
        # 이미지파일이름을 변경하면 리스트안에 멤버들의 값도 이미지 파일의 이름과 같게 설정하면됨
        file_count = len(filename_list)
        client_socket.send(b'%d' % file_count)
        for i in filename_list:
            send_img(i)
            print(str(i) + "image finish!!!!")
            client_socket.send(b'finish') #클라 쪽에서 이미지 파일을 받을 때 지금 보내는 파일을 마무리를 하라고 알려주기위해서 알림을 보냄
            time.sleep(5)  # 먼저 보낸 이미지 파일을 다 받기를 기다리기 위해서 5초동안 쉬어줌
        print('대기중............')
    else:
        client_socket.close()
        print('Socket closed')



유형 2 : client.py

import socket
import sys
import time

# 이미지 파일 저장경로
src = "C:\\Users\\자신의유저이름\\Desktop\\저장하고싶은폴더이름\\"


def fileName():
    dte = time.localtime()
    Year = dte.tm_year
    Mon = dte.tm_mon
    Day = dte.tm_mday
    WDay = dte.tm_wday
    Hour = dte.tm_hour
    Min = dte.tm_min
    Sec = dte.tm_sec
    imgFileName = src + str(Year) + '_' + str(Mon) + '_' + str(Day) + '_' + str(Hour) + '_' + str(Min) + '_' + str(
        Sec) + '.jpg';
    return imgFileName


def save_img(data):
    img_fileName = fileName()
    img_file = open(img_fileName, "wb")
    print("finish img recv")
    print(sys.getsizeof(data))
    img_file.write(data)
    img_file.close()
    print("Finish ")


def receive_img():
    img_data = client_socket.recv(1024)
    data = img_data
    if img_data:
        while img_data:
            print("****************************recving Img...****************************")
            img_data = client_socket.recv(60000)  # 제일 큰 사진 용량에 따라 설정해주시면 됩니다.
            data += img_data
            save_img(data)
            if img_data[-6:] == b'finish':
                break


# 서버 연결
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 5001))
client_socket.send(b'hi')

file_count = int(client_socket.recv(1024))
for i in range(file_count):
    receive_img()




댓글

  1. 올려주신 코드를 참고하여 라즈베리파이에서 버튼으로 사진을 촬영 할 때마다 서버에 전송하려하는데 사진 촬영까진 되지만 바로 서버로 전송에서 막혔습니다.
    혹시 어떤식으로 해야한느지 알려주실수 있으신가요?

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

About Kafka Basic

About JVM Warm up

About ZGC

Spring Boot Actuator readiness, liveness probes on k8s

About G1 GC

sneak peek jitpack

About idempotent

C 언어 구조체의 포인터 멤버 변수

Synology NAS에 MariaDB 10에 Mysql workbench로 원격접속하기

About Websocket minimize data size and data transfer cost on cloud