Python3 TCP/IP编程实现不同计算机间的非文本文件传输

服务端(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、递归算法等,可实现广域网暴露主机的文件传输,和局域网的文件传输功能。稍微修改亦可传输文本,作为实现与网站的沟通,终端更新网站网页、文件等功能的插件。
注意:
包的导入路径要与实际情况相关。

代码未精简,先这样吧!

猜你喜欢

转载自blog.csdn.net/weixin_43690548/article/details/88048308
今日推荐