import socket
import os
import sys
import struct
这些是导入所需的 Python 模块。socket
用于创建网络套接字,os
提供了与操作系统交互的功能,sys
提供了对 Python 解释器的访问和控制,struct
用于处理二进制数据的打包和解包。
def sock_client_image():
while True:
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.8.183', 6666))
except socket.error as msg:
print(msg)
print(sys.exit(1))
这是定义了一个名为 sock_client_image
的函数,用于发送图片到服务器。在函数内部,它使用 socket.socket
创建了一个 TCP 套接字对象 s
,然后使用 s.connect
方法连接到指定的服务器 IP 地址和端口号。如果连接失败,将打印错误消息并退出程序。
filepath = input('input the file:')
fhead = struct.pack(b'128sq', bytes(os.path.basename(filepath), encoding='utf-8'),
os.stat(filepath).st_size)
s.send(fhead)
这部分代码用于获取要发送的图片文件的路径,并将文件名和文件大小打包成一个结构体 fhead
。os.path.basename
函数用于获取文件名,os.stat
函数用于获取文件大小。然后,使用 struct.pack
将文件名和文件大小打包成二进制数据,并使用 s.send
方法将结构体发送给服务器。
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()
这部分代码打开要发送的图片文件,并使用循环逐块读取图片文件的数据。每次读取 1024 字节的数据,并使用 s.send
方法将数据发送给服务器。循环会一直执行,直到读取完整个文件。最后,关闭套接字连接。
请注意,这段代码是一个简单的示例,仅涵盖了图片文件的发送部分。您需要在服务器端实现对应的接收代码来接收并保存传输的图片文件
了解struct内置库
struct
是 Python 内置的一个模块,它提供了用于处理二进制数据的打包和解包的功能。在图片上传的过程中,struct
的作用是将文件名和文件大小打包成一个二进制数据结构,以便在网络中传输。
具体来说,这段代码中的 struct.pack
函数用于将文件名和文件大小打包成一个二进制数据。它的第一个参数是格式字符串,指定了要打包的数据的类型和顺序。在这里,'128sq'
是格式字符串,它表示要打包的数据有两部分,第一部分是一个长度为 128 字节的字符串,第二部分是一个长整型数。
第二个参数是一个元组,包含了要打包的数据。在这里,bytes(os.path.basename(filepath), encoding='utf-8')
是文件名的字节表示,os.path.basename(filepath)
用于获取文件名,并通过 bytes
函数将其转换为字节类型。os.stat(filepath).st_size
是文件大小。
打包后的二进制数据可以通过网络发送到服务器,然后在服务器端使用相应的解包操作来提取文件名和文件大小。
总而言之,struct
在图片上传的过程中的作用是将相关的文件信息打包成二进制数据,以便在网络中传输,并在接收端进行解包操作以获取文件信息