Socket

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()
  1. 这部分判断代码是否作为主程序运行,如果是,则调用socket_service_image()函数启动图像服务端。

这就是整个代码的解析过程,它实现了一个简单的图像文件传输服务端。通过该服务端,可以接收到客户端发送的图像文件,并保存在指定的目录中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值