局域网下两个电脑的文件实时传输--python程序

一、保证要传输文件的两个电脑在同一个局域网下(即同一个wifi下)。
二、有两部分程序,分为sender和reciever两部分,sender放在要发送的电脑上,reciever放在要接受文件的电脑上。该程序可以实现某个文件内文件数量变化时,将新增的文件实时传输过去。

1、sender部分:

# coding = utf-8
import socket      # socket库的用法,详细参考浏览器收藏夹
import os
import sys
import struct    # 该库将用户定义的数据类型和文件io关联起来,用二进制模式来写这些数据
import time


def sock_client(file,final):
    try:
        # socket.SOCK_STREAM 表示指定使用面向连接的TCP协议,socket.AF_INET表示指定使用IPv4协议
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        # 需要连接的电脑的IP地址和端口,该函数是发送文件,需要输入接收方电脑的ipv4地址,端口可以找一个空闲的,一般大于5000是空闲的
        s.connect(('192.168.1.180', 45795))
    except socket.error as msg:
        print(msg)
        print(sys.exit(1))    # sys.exit(1)是当程序异常结束时,返回1。程序正常结束时,返回0.

    while True:
        # 传输一张EL图片用时12ms
        origin=os.listdir(file)  # 遍历文件夹,返回文件和文件夹名字
        set1=set(origin)    # 创建一个无序的元素集
        set2=set(final)
        filepath_diff=set1^set2   # 找取两个元素集不一样的元素
        start=time.time()     # 返回当前时刻
        # 定义文件信息,128s表示文件名为128bytes长,l表示一个int或log文件类型
        # struct.pack是对图片字节大小进行一个包装,然后发送(这一步并不是发送图片),,把数据封装成字符串(实际上是类似于c结构体的字节流)
        # struct.pack()、struct.unpack()和struct.calcsize()具体用法找度娘
        for filepath in filepath_diff:
            final.append(filepath)
            filepath=f'{file}{filepath}'    # 拼接路径
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect(('192.168.1.180', 6666))
            fhead = struct.pack(b'128sqs', bytes(os.path.basename(filepath), encoding='utf-8'), os.stat(filepath).st_size,bytes('a', encoding='utf-8'))
            s.send(fhead)
            # print('client filepath: {0}'.format(filepath))
            fp = open(filepath, 'rb')
            while 1:
                data = fp.read(1024)
                if not data:
                    print('{0} file send over...'.format(filepath))
                    break
                s.send(data)
            end=time.time()
            print(end-start)
            s.close()
        # break

if __name__ == '__main__':
    file='图片\\'
    sock_client(file,[])

其中struct.pack()、struct.unpack()的参数问题如下:
在这里插入图片描述
2、reciever部分:

# coding = utf-8
'''
接收端(服务端,用来接受客户端发来的图片)
'''
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(('192.168.1.180',6666))      #IP地址和端口号需要根据自己的来设置
        s.listen(10)                        #开始监听端口,最多能监听10个
    except socket.error as msg:
        print(msg)
        sys.exit(1)
    print("Wait for Connection.....................")
    while True:
        sock,addr=s.accept()        #等待与客户端的连接,addr是连接地址,
        deal_image(sock,addr)

def deal_image(sock,addr):
    while True:
        fileinfo_size=struct.calcsize('128sqs')
        buf=sock.recv(fileinfo_size)        #接收图片名和图片的字节大小
        if buf:
            filename,filesize,computername=struct.unpack('128sqs',buf)     # 按照给定的格式(fmt)解析字节流string,返回解析出来的tuple
            fn=filename.decode().strip('\x00')
            computername = computername.decode().strip('\x00')
            new_filename=os.path.join(computername,'new_'+fn)
            recv_size=0         #用来记录传输的字节数
            if not os.path.isdir(computername):    # 若不存在该文件夹,则创建一个
                os.makedirs(computername)
            fp=open(new_filename,'wb')
            while recv_size!=filesize:
                if filesize-recv_size>1024:
                    data=sock.recv(1024)
                    recv_size+=1024
                else:
                    data=sock.recv(1024)
                    recv_size=filesize
                fp.write(data)          #写入图片数据
            fp.close()
        sock.close()
        break
if __name__ == '__main__':
    socket_service_image()


  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要将Python程序的输出通过局域网传输到另一台电脑并不断更新数据,你可以使用网络套接字编程(socket programming)来实现。 在Python中,可以使用`socket`模块来创建网络套接字。以下是一个简单的示例,演示如何在一个本地网络上创建一个简单的服务器和客户端,以便在两台计算机之间传输数据: 服务器端代码: ```python import socket # 创建TCP/IP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定到本地IP地址和端口 server_address = ('localhost', 10000) sock.bind(server_address) # 监听来自客户端的连接 sock.listen(1) while True: # 等待客户端连接 print('等待连接...') connection, client_address = sock.accept() try: print('客户端连接:', client_address) # 从客户端接收数据,并将其发送回去 while True: data = connection.recv(1024) print('接收到"%s"' % data.decode()) if data: connection.sendall(data) else: break finally: # 清理连接 connection.close() ``` 客户端代码: ```python import socket # 创建TCP/IP套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接到服务器 server_address = ('localhost', 10000) print('连接到%s端口%s' % server_address) sock.connect(server_address) try: # 发送一些数据 message = '这是一条测试消息' print('发送"%s"' % message) sock.sendall(message.encode()) # 等待接收响应 amount_received = 0 amount_expected = len(message) while amount_received < amount_expected: data = sock.recv(1024) amount_received += len(data) print('接收到"%s"' % data.decode()) finally: print('关闭套接字') sock.close() ``` 在这个例子中,我们创建了一个TCP/IP套接字,绑定到本地地址和端口,并在服务器端使用`listen()`方法等待客户端连接。一旦客户端连接,服务器就会接收客户端发送的数据,将其发送回客户端。在客户端代码中,我们连接到服务器并发送一条消息,然后等待接收响应。这个例子只是一个简单的示例,你可以根据需要进行修改。 要实现实时更新数据,你可以使用类似的方法,只需要在服务器端代码中将数据发送到客户端,并在客户端代码中更新显示数据的部分。可以使用循环来定期更新数据,以便客户端始终显示最新的数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值