대학생 코딩 과제 대행 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')
이번에는 파이썬으로 소켓통신을 하는데 이미지를 주고 받을 수 있도록 코드를 짜 달라고 의뢰를 받았다.
먼저 첫 번째 유형은 클라이언트측에서 이미지파일들을 전송하면 서버에서 수신해서 저장할 수 있도록 하는것이였다.
두 번째 유형은 반대로 서버측에서 이미지파일들을 클라이언트측으로 보내고 클라이언트측에서 저장 할 수 있도록 하는것이였다.
유형 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()
올려주신 코드를 참고하여 라즈베리파이에서 버튼으로 사진을 촬영 할 때마다 서버에 전송하려하는데 사진 촬영까진 되지만 바로 서버로 전송에서 막혔습니다.
답글삭제혹시 어떤식으로 해야한느지 알려주실수 있으신가요?