1.导入模块和库:
import socket
import os
import sys
import struct
这里导入了一些Python的标准库,包括socket、os、sys和struct。
2.定义socket_service_image()
函数:
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(("192.168.43.38", 6666))
s.listen(10)
except socket.error as msg:
print(msg)
sys.exit(1)
print("Wait for Connection..................")
while True:
sock, addr = s.accept()
deal_image(sock, addr)
这个函数用于创建Socket服务端,并监听指定的IP地址和端口号。它使用TCP/IP协议进行通信。在循环中,通过accept()
方法接收客户端的连接请求,并将连接套接字和客户端地址传递给deal_image()
函数进行处理。
3.定义deal_image()
函数:
def deal_image(sock, addr):
print("Accept connection from {0}".format(addr))
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
这个函数用于接收和处理图像文件。首先打印客户端的连接地址。然后,通过recv()
方法接收一个固定长度的数据,其中包含文件名和文件大小信息。使用struct.unpack()
解析这个数据,并将文件名转换为字符串类型。接下来,根据新的文件名创建一个新的文件路径。
然后,通过循环接收图像数据。如果图像文件大小大于1024字节,则每次接收1024字节的数据,直到接收到的数据总量等于文件大小为止。如果文件大小小于等于1024字节,则一次性接收所有数据。将接收到的数据写入文件。最后,关闭文件和套接字连接。
4.主程序入口:
if __name__ == '__main__':
socket_service_image()
-
这部分判断代码是否作为主程序运行,如果是,则调用
socket_service_image()
函数启动图像服务端。
这就是整个代码的解析过程,它实现了一个简单的图像文件传输服务端。通过该服务端,可以接收到客户端发送的图像文件,并保存在指定的目录中。