不同系统、程序之间传输照片有着多种
方式这里介绍三种:FTP、UDP、TCP。
FTP实现传输照片
FTP传输照片适合大尺寸照片,如几十兆,是应用层协议,传输层基础是TCP连接。FTP使用了两个并行的TCP来传输文件:一个是控制连接,一个是数据连接。
#服务端
# -*- coding:utf-8 -*-
from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
# 实例化DummyAuthorizer来创建ftp用户
authorizer = DummyAuthorizer()
# 参数:用户名,密码,目录,权限
authorizer.add_user('admin', '123456', r'/home/....../icons/', perm='elradfmwMT')
# 匿名登录
# authorizer.add_anonymous('/home/nobody')
handler = FTPHandler
handler.authorizer = authorizer
# 参数:IP,端口,handler
server = FTPServer(('192.168.1.122', 2021), handler) # 设置为0.0.0.0为本机的IP地址
server.serve_forever()
#客户端
# ftp互联
def ftpconnect(host, username, password):
ftp = FTP()
# ftp.set_debuglevel(2)
ftp.connect(host, 2021)
ftp.login(username, password)
return ftp
# 从本地上传文件到ftp
def uploadfile(ftp, remotepath, localpath):
bufsize = 1024
fp = open(localpath, 'rb')
ftp.storbinary('STOR ' + remotepath, fp, bufsize)
ftp.set_debuglevel(0)
fp.close()
if __name__ == '__main__':
ftp = ftpconnect(lower_ip, lower_id, lower_password)
uploadfile(ftp, f"{file_name}", file)
ftp.quit()
UDP实现传输照片
UDP传输照片适合小尺寸照片,如几十K,必须小于64K。
#发送
import socket
# 图像文件路径
image_path = 'littel_photos.png'
# UDP接收方的IP和端口
receiver_ip = '127.0.0.1'
receiver_port = 12345
# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 读取图像文件
with open(image_path, 'rb') as file:
image_data = file.read()
# 发送图像数据
sock.sendto(image_data, (receiver_ip, receiver_port))
# 关闭套接字
sock.close()
#接收
import socket
# 本地IP和端口号
local_ip = '127.0.0.1'
local_port = 12345
while 1:
# 创建UDP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 65536)
# 绑定套接字到本地IP和端口号
sock.bind((local_ip, local_port))
# 接收数据并写入图像文件
image_data, addr = sock.recvfrom(65536)
with open('received_image.jpg', 'wb') as file:
file.write(image_data)
# 关闭套接字
sock.close()
TCP实现传输照片
直接使用TCP连接,传输照片,文件大小不限
#发送
import socket
# 图像文件路径
image_path = '999.BMP'
# TCP接收方的IP和端口
receiver_ip = '127.0.0.1'
receiver_port = 12345
# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接到TCP接收方
sock.connect((receiver_ip, receiver_port))
# 读取图像文件
with open(image_path, 'rb') as file:
image_data = file.read()
# 发送图像数据
sock.sendall(image_data)
# 关闭套接字
sock.close()
#接收
import socket
# 本地IP和端口号
local_ip = '127.0.0.1'
local_port = 12345
# 创建TCP套接字
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定套接字到本地IP和端口号
sock.bind((local_ip, local_port))
# 监听连接
sock.listen(1)
# 等待客户端连接
client_sock, client_addr = sock.accept()
# 接收图像数据并写入图像文件
with open('received_image.jpg', 'wb') as file:
while True:
data = client_sock.recv(65536)
if not data:
break
file.write(data)
# 关闭客户端套接字和服务器套接字
client_sock.close()
sock.close()