服务端(server.py):
#encoding:utf-8
import socket
from fileTransmission import fileRW
# 服务器本地数据保存路径
path = r'/home/oliver/Desktop/nettest'
# 服务器主函数
def main():
# 服务器标识,客户端访问的服务器ip,相对服务器自己来说是自己的ip可以空置
host = ''
# 服务器开放端口号
port = 8000
# socket套接字,socket.AF_INET为ip4标识,socket.SOCK_STREAM为tcp/ip协议标识
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定服务器自身ip和端口
s.bind((host, port))
# 监听
s.listen(1)
# 等待客户端连接
conn, addr = s.accept()
# 创建文件读写对象
file = fileRW.FileRW(path)
# 判断服务器是否接收该文件
if 'y' == input("不接受文件,按(y)结束,其他任意键继续:"):
return 0
# 循环次数标识初始化
size = 1
# 文件传输主循环
while size:
# 数据接收,每次1024b = 1k
data = conn.recv(1024)
try:
# 判断是否可解码,可解码,判断为文件名数据,不可解码判断为非文本文件
rawData = data.decode()
# 拆离客户端与服务器自定义传输协议,获得文件名和文件大小数据
dataProcess = rawData.split("file")
# 文件名
fileName = dataProcess[0]
# 文件大小
size = int(dataProcess[1])
try:
# 写入文件名到服务器存储区
file.fileW('', fileName)
except:
print(fileName, "文件名写入失败!")
break
else:
print(fileName, "写入成功!")
# 发送给客户端服务器接收到文件名信息,并成功写入的标识
conn.sendall("filesucess".encode())
except:
try:
# 写入文件主体信息到服务器存储区
file.fileWb(data, fileName)
except:
print(fileName, "内容写入失败!")
else:
print("正在写入内容。。。。")
# 循环标识符数值大小控制
size -= 1
# 发送给客户端文件主体写入成功
conn.sendall("success".encode())
print("写入完毕!")
# 客户端连接关闭
conn.close()
# 套接字部分关闭
s.close()
# 程序执行
if __name__ == "__main__":
main()
客户端(client.py):
#encoding:utf-8
import socket
import fileRW
import os
# 客户端文件所在目录
path = r"/home/oliver/Desktop/"
host = "127.0.0.1" # 这里设置成服务器ip地址或域名
port = 8000 # 服务器开放端口号
def main():
# 套接字与ip地址类型及传输协议
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
s.connect((host, port))
while True:
# 输入需要传输的文件名称
fileName = input("Input fileName:")
try:
# 获取文件的内存大小
fileSize = os.path.getsize(os.path.join(path, fileName))/1024
except:
print("文件不存在,请确认!")
else:
break
# 对文件的大小整数化,过0进1
if fileSize % 1 != 0:
fileSize = int(fileSize + 1)
# 与服务器自定义的传输协议
dataSort = fileName + 'file' + str(fileSize)
# 传送文件名数据
s.sendall(dataSort.encode())
# 创建文件读写对象
file = fileRW.FileRW(path)
while True:
# 接收服务器返回的写入成功标识
returnFlag = s.recv(1024).decode()
# 判断服务器返回的标识,True则执行提示,和发送文件主体部分
if returnFlag == 'filesucess':
print("文件名写入服务器成功!")
# 发送文件主体部分
s.sendall(file.fileRb(fileName))
# 判断服务器返回的标识,True则执行提示,表示成功完成文件传送,并退出
elif returnFlag == 'success':
print("文件内容写入成功!")
break
else:
print("文件写入服务器失败!")
break
s.close()
# 主程序执行
if __name__ == '__main__':
main()
文件类代码(fileRW.py):
#encoding:utf-8
import os
class FileRW(object):
def __init__(self, path):
self.path = path
def fileRb(self, fileName):
try:
with open(os.path.join(self.path, fileName), "rb") as f:
bData = f.read()
except:
print(fileName, "文件读取错误!")
else:
return bData
def fileWb(self, message, fileName):
with open(os.path.join(self.path, fileName), 'ab+') as f:
f.write(message)
def fileW(self, message, fileName):
with open(os.path.join(self.path, fileName), 'w+') as f:
f.write(message)
代码实现功能:
在客户端传送给服务器端非文本文件,只是较为粗糙的终端程序,利用tkinter、递归算法等,可实现广域网暴露主机的文件传输,和局域网的文件传输功能。稍微修改亦可传输文本,作为实现与网站的沟通,终端更新网站网页、文件等功能的插件。
注意:
包的导入路径要与实际情况相关。
代码未精简,先这样吧!