通过Python实现局域网内文件传输
代码编辑器:Visual Studio 2019
Python版本:3.7.8
如果有的朋友接触过Linux或者UNIX的话,应该听过一句话:“一切皆文件”。在这些系统下,即使是硬件设备、网络上的其它设备,也可以通过像对本机文件的操作一样进行非常方便的操作,笔者想要通过本文讲述的是利用Python语言编写的,能够实现局域网内两台电脑分享文件的简单程序,希望能够对正在学习这个方面的同志提供参考。
对于普通人来讲,网络就是一种打开联网开关,输入账号密码就能够于世界进行交流的平台,但是在计算机底层来说,网络的工作方式可不仅仅是这么简单的。
我们以一个服务器与一个客户端的连接为简单例子进行通俗的说明:服务器端先运行,绑定(bind)好IP和端口后等待客户端连接(listen),客户端运行时通过向服务器端已经绑定好的IP与端口进行连接(Connect),然后就是循环的数据发送与接收,最后断开连接(Close),如图1。
图1.本图是一个简单的服务器端与客户端通信的例子
在Python中,我们使用socket库进行网络连接,在程序中选择是作为发送端(客户端)还是接收端(服务器端),在程序被选择作为接收端时,程序会自动查找上网网卡的IP地址和随机获取一个空闲的端口号,用作文件传输,如图2。
图2.接收端主要代码
虽然通过gethostname()取得计算机名后使用gethostbyname()也可以取得IP,但是如果计算机存在多张网卡,或者安装过虚拟机等使用虚拟网卡的程序,那么这个方式有可能会取到你的虚拟网卡、内网网卡的IP地址,从而使文件传输出现问题。
如何解决这个问题呢?我们知道,在我们可以通过在命令提示符CMD中使用’ipconfig’命令,可以显示本机的TCP/IP配置,我们在这里做文章。我们直接读取这个命令的返回值,使用正则表达式进行筛选,得到上网网卡(这里匹配的网卡只对于使用网线上网的电脑有效,连接无线网络上网的机器在这里会出现问题)的IP地址。而获取端口的方式和获取IP异曲同工,使用’netstat -noa’命令取得所有已使用的网络端口,筛选上网网卡已使用端口,排除掉上网网卡已经使用完的端口即可,如图3。
注意:使用正则表达式需要添加re库。
图3.接收端程序所调用的两个自定义函数
当接收端一切就绪后,接收端打印出自身所绑定的IP和端口,并开始监听,等待发送端与自己的连接。发送端开始运行后,输入接收端的IP和端口,程序会进行连接,当程序连接成功时,两端都会显示请求输入发送/接收的文件的所在/保存位置(实现内容如图4)。当两端都输入完成后,文件开始传输。
图4.发送端的部分代码
在输入IP和端口号时进行判断,用以保证取得正确的IP和端口号。在发送文件时,我们将文件分次传播,每次传送文件的一部分,并判断是否已经将一整个文件传送完,如图5。这样使得文件能够更加稳定的传输。
图5.文件发送完成
由于这里进行的文件复制操作本质上是读取原文件,并重新写一份一摸一样的文件,所以原文件的所有文件属性(例如:文件名称、创建时间、修改时间等)都不会被保存下来。但是通过计算MD5码,我们可以看出文件的MD5值相同,则可以判断两个文件的实际内容是相同的,如图6。
图6.比较MD5
通过本程序,可以实现简单的局域网文件的传输,在缺少可移动介质或无法连接互联网时,使用一条网线(局域网)即可让本程序快捷地传输小文件。如果扩展开来,同样的方法也可以在自己的家里搭建一个私有云盘,远程访问云盘来获取和存储文件,与传统的云盘相比,隐私与数据更加安全,也可通过局域网在几人之间建立一个小聊天室,等等很多应用用途。
文章中软件的下载链接为:
https://pan.baidu.com/s/1B7CNxEHcaiHSDdDc6DD5oQ
提取码:zzcx
或者扫面二维码:
包含源代码和打包成.exe的文件,供大家研究。