RUN__IT # TCP创建服务器与客户端

创建客户端与服务器,实现客户端能从服务器下载与上传文件

tcp创建套接字(socket)知识总结:
tcp客户端创建

1.创建套接字
tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCKJ_STREAM)
2.链接服务器
tcp_client_socket.connect(("server_ip",server_port))
3.向服务器发送数据
tcp_client_socket.send("data".encode("utf-8"))
4.接收服务器回送数据
recv_data = tcp_client_socket.recv(1024)
5.关闭套接字
tcp_client_socket.close()

tcp服务器创建

1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
2.绑定端口信息
tcp_server_socket.bind(("",8080))
3.监听,主动变被动
tcp_server_socket.listen(128)
4.等待客户端连接,堵塞状态,链接后返回一个新的套接字为客户端服务,以及客户端的ip、port.
new_client_socket,client_addr = tcp_server_socket.accept()
5.等待客户端发送数据
recv_data = tcp_client_socket.recv(1024).decode("utf-8")
6.给客户端回送数据
new_client_socket.send('hello'.encode("utf-8"))
7.为该客户端服务完毕之后关闭套接字
new_client_socket.close()
8.关闭套接字服务器
tcp_server_socket.close()

代码如下,欢迎指点,共同进步!

tcp客户端创建

import socket


def down(tcp_client_socket):
    """从服务器下载"""
    while True:
        # 发送请求
        data = input("输入要下载的文件或按exit退出\n")
        if data == "exit":
            tcp_client_socket.send(data.encode("utf-8"))
            break
        elif data:
            # 发送文件名
            tcp_client_socket.send(data.encode("utf-8"))
            # 接收数据
            print("等待下载")
            recv_data = tcp_client_socket.recv(1024*1024)
            if recv_data == b"msg":
                print("文件不存在或内容为空")
            elif recv_data:
                # 保存文件
                with open("[新]" + data, "wb") as f:
                    f.write(recv_data)
                    print("下载成功")


def up(tcp_client_socket):
    """给服务器上传"""
    while True:
        # 发送请求
        data = input("输入要上传的文件或按exit退出\n")
        if data == "exit":
            tcp_client_socket.send(data.encode("utf-8"))
            break
        elif data:
            tcp_client_socket.send(data.encode("utf-8"))
            msg = None
            flag = True
            try:
                # 打开文件
                f = open(data, "rb")
                msg = f.read(1024*1024)
                f.close()
            except Exception:
                print("文件不存在")
                tcp_client_socket.send(b"msg")
                flag = False
            if msg:
                # 发送数据
                tcp_client_socket.send(msg)
                print("上传完成")
            elif msg == b"" and flag == True:
                print("文件内容为空")
                tcp_client_socket.send(b"msg")


def main():
    """文件操作客户端"""
    # 创建套接字
    tcp_client_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 链接服务器
    server_ip = input("服务器ip\n")
    server_port = int(input("端口\n"))
    tcp_client_socket.connect((server_ip, server_port))
    # tcp_client_socket.connect(("192.168.142.1", 8080))
    while True:
        # 发送选择信息
        choose = input("1(下载),2(上传),3(退出客户端),(输入密码关闭服务器)\n")
        # 给服务器发送操作代号
        tcp_client_socket.send(choose.encode("utf-8"))

        # 下载
        if choose == "1":
            down(tcp_client_socket)
        # 上传
        elif choose == "2":
            up(tcp_client_socket)
        # 退出客户端
        elif choose == "3":
            break
        # 关闭服务器
        elif choose == "123456":
            print("服务器已关闭")
            break
        # 输入有误
        else:
            print("输入有误")
    # 关闭客户端套接字
    tcp_client_socket.close()


if __name__ == '__main__':
    main()

tcp服务器创建

import socket


def down(new_client_socket):
    """下载数据"""
    # 接受数据
    while True:
        data = new_client_socket.recv(1024).decode("utf-8")
        if data == "exit":
            break
        else:
            flag = True
            msg = None
            try:
                # 打开文件
                f = open(data, "rb")
                msg = f.read(1024*1024)
                f.close()
            except Exception:
                print("文件不存在")
                new_client_socket.send(b"msg")
                flag = False
            if msg:
                # 发送数据
                new_client_socket.send(msg)
                print("下载完成")
            elif msg == b"" and flag == True:
                print("文件内容为空")
                new_client_socket.send(b"msg")


def up(new_client_socket):
    """上传"""
    while True:
        print("#"*5)
        data = new_client_socket.recv(1024).decode("utf-8")
        if data == "exit":
            break
        else:
            msg = new_client_socket.recv(1024*1024)
            if msg == b"msg":
                print("客户端没找到文件或文件内容为空")
                continue
            else:
                # 保存文件
                with open("[新]" + data, "wb") as f:
                    f.write(msg)
                    print("保存成功")


def main():
    """文件down up服务器"""
    # 创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # server_ip = input("设置服务器ip\n")
    # server_port = int(input("设置服务器port\n"))
    server_ip = "192.168.142.1"
    server_port = 8080
    # 绑定端口
    tcp_server_socket.bind((server_ip,server_port ))

    while True:
        flag = True
        # 监听
        tcp_server_socket.listen(128)
        print("监听中")

        # 等待连接
        print("等待连接")
        new_client_socket,client_addr = tcp_server_socket.accept()
        print("连接成功")
        print("*"*10)
        while True:
            print("选择中")
            choose = new_client_socket.recv(1024).decode("utf-8")
            if choose == "1":
                # 接受请求/发送数据
                print("准备下载")
                down(new_client_socket)
            elif choose == "2":
                # 上传数据
                print("准备上传")
                up(new_client_socket)
            elif choose == "3":
                # 退出循环
                break
            elif choose == "123456":
                # 关闭服务器
                tcp_server_socket.close()
                flag = False
                break
        # 关闭套接字
        new_client_socket.close()
        if flag == False:
            print("服务器已关闭")
            break


if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/RUN__IT/article/details/89110707
今日推荐