>백엔드 개발 >파이썬 튜토리얼 >클라이언트 측 및 서버 측 이미지 전송을 구현하는 Python 코드

클라이언트 측 및 서버 측 이미지 전송을 구현하는 Python 코드

不言
不言원래의
2018-09-11 16:57:463358검색

이 문서의 내용은 클라이언트 측 및 서버 측 이미지 전송을 구현하는 Python 코드에 관한 것입니다. 이는 특정 참고 가치가 있으므로 도움이 될 수 있습니다.

질문: 그래프를 전송하려면 Windows를 클라이언트로, Linux를 서버로 사용하여 그래프를 전송하세요.

프로그램:

'''
Fuction:客户端发送图片和数据
Date:2018.9.8
Author:snowking
'''
###客户端client.py
import socket
import os
import sys
import struct

def sock_client_image():
    while True:
        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(('服务器的ip', 6666))  #服务器和客户端在不同的系统或不同的主机下时使用的ip和端口,首先要查看服务器所在的系统网卡的ip
            # s.connect(('127.0.0.1', 6666))  #服务器和客户端都在一个系统下时使用的ip和端口
        except socket.error as msg:
            print(msg)
            print(sys.exit(1))
        filepath = input('input the file: ')   #输入当前目录下的图片名 xxx.jpg
        fhead = struct.pack(b'128sq', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size)  #将xxx.jpg以128sq的格式打包
        s.send(fhead)

        fp = open(filepath, 'rb')  #打开要传输的图片
        while True:
            data = fp.read(1024) #读入图片数据
            if not data:
                print('{0} send over...'.format(filepath))
                break
            s.send(data)  #以二进制格式发送图片数据
        s.close()
        # break    #循环发送
   
if __name__ == '__main__':
    sock_client_image()

###服务器端server.py
import socket
import os
import sys
import struct

def socket_service_image():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        # s.bind(('127.0.0.1', 6666))
        s.bind(('服务器的ip', 6666))
        s.listen(10)
    except socket.error as msg:
        print(msg)
        sys.exit(1)

    print("Wait for Connection.....................")

    while True:
        sock, addr = s.accept()  #addr是一个元组(ip,port)
        deal_image(sock, addr)
def deal_image(sock, addr):
    print("Accept connection from {0}".format(addr))  #查看发送端的ip和端口

    while True:
        fileinfo_size = struct.calcsize('128sq')
        buf = sock.recv(fileinfo_size)   #接收图片名
        if buf:
            filename, filesize = struct.unpack('128sq', buf)
            fn = filename.decode().strip('\x00')
            new_filename = os.path.join('./', 'new_' + fn)  #在服务器端新建图片名(可以不用新建的,直接用原来的也行,只要客户端和服务器不是同一个系统或接收到的图片和原图片不在一个文件夹下)

            recvd_size = 0
            fp = open(new_filename, 'wb')

            while not recvd_size == filesize:
                if filesize - recvd_size > 1024:
                    data = sock.recv(1024)
                    recvd_size += len(data)
                else:
                    data = sock.recv(1024)
                    recvd_size = filesize
                fp.write(data)  #写入图片数据
            fp.close()
        sock.close()
        break
        
if __name__ == '__main__':
    socket_service_image()

실행 결과:
서버:

클라이언트 측 및 서버 측 이미지 전송을 구현하는 Python 코드

클라이언트:

클라이언트 측 및 서버 측 이미지 전송을 구현하는 Python 코드

추가 지침:
1. 먼저 Linux 시스템에서 server.py(python server.py)를 실행한 다음 Windows Python 터미널에서 client.py를 실행하고 현재 디렉터리에 전송할 이미지 이름을 입력합니다. heat.jpg라는 터미널을 실행하면 서버 경로에 new_heat.jpg 이미지 파일이 나타나는 것을 확인할 수 있어 파일 전송이 성공한 것을 확인할 수 있습니다.
2. 처음에는 인터넷에서 코드를 참조할 때 여러 가지 오류가 발생했습니다. 디버깅 중에 수신된 이미지 데이터가 계속 손실되고 struct.pack의 압축 형식을 이해한 후에 발견했습니다. 문제는 l이 긴 정수인 128sl로 밝혀졌습니다. 범위를 초과하면 수신된 사진 데이터가 손실되므로 q로 변경하면 범위가 더 커지고 사진을 볼 수 있습니다. 정상적으로 접수됩니다. 다음 그림은 struct.pack의 압축 형식 및 데이터 범위 대응 테이블입니다.

클라이언트 측 및 서버 측 이미지 전송을 구현하는 Python 코드
관련 권장 사항:

Python XML RPC 서버 및 클라이언트 예제

Python의 TCP 서버 및 클라이언트 구현 방법 자세히 설명

위 내용은 클라이언트 측 및 서버 측 이미지 전송을 구현하는 Python 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.