대학생 코딩 과제 대행 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 JVM Warm up

About idempotent

About Kafka Basic

About ZGC

sneak peek jitpack

Spring Boot Actuator readiness, liveness probes on k8s

About Websocket minimize data size and data transfer cost on cloud

About G1 GC

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