15分钟学 Python 第27天 : 网络编程基础-简易银行系统

Day 27: 网络编程基础-简易银行系统

课程目标

在本课程中,我们将学习如何利用Python进行网络编程,通过构建一个简易的银行系统来实践网络应用开发。我们将涵盖以下内容:

  1. 网络编程基础
  2. TCP/IP协议概述
  3. 客户端-服务器模型
  4. 简易银行系统的设计
  5. 代码实现
  6. 运行流程图
  7. 练习题与总结

1. 网络编程基础

网络编程是指通过计算机网络进行应用程序开发的过程。在Python中,网络编程主要通过 socket 模块来实现。

1.1 Socket概述

Socket是网络通讯的一种基础形式,它提供了一个在网络中进行数据发送和接收的双向通道。常见的Socket类型有:

  • 流式Socket(TCP):面向连接的,可靠的数据传输。
  • 数据报Socket(UDP):无连接,不保证数据传输的可靠性。

2. TCP/IP协议概述

TCP/IP协议簇是互联网的基础,主要包括以下协议:

  • TCP(传输控制协议): 确保数据的准确和完整传输。
  • IP(互联网协议): 负责在网络中传输数据包,并找到目标位置。

2.1 TCP/IP工作原理

TCP/IP协议确保了数据包的顺序和完整性,工作流程如下:

  1. 连接建立:客户端向服务器发起连接请求。
  2. 数据传输:双方根据需要进行数据的发送和接收。
  3. 连接关闭:数据传输完成后,断开连接。

3. 客户端-服务器模型

在网络编程中,通常采用客户端-服务器模型。其基本职责是:

  • 服务器: 监听客户端请求,处理并返回结果。
  • 客户端: 发起请求并接收服务的结果。

3.1 简易银行系统架构

我们将设计一个简易银行系统,包含以下功能:

  • 用户注册
  • 查询余额
  • 存款
  • 取款

3.2 数据存储

我们将使用字典来模拟用户账户数据,其结构如下:

用户名密码余额
user1pwd11000.0
user2pwd2500.0

4. 简易银行系统的设计

4.1 系统功能模块

  • 用户注册模块
  • 账户管理模块
  • 交易处理模块

4.2 交互流程

系统与用户的交互流程如下:

  1. 用户连接到服务器。
  2. 选择操作:注册、查询余额、存款、取款。
  3. 输入必要的参数。
  4. 服务器处理请求,返回结果。

5. 代码实现

接下来我们将实现简易银行系统的客户端和服务器端代码。

5.1 服务器端代码

import socket
import threading

# 用户账户信息(模拟数据库)
users = {
    'user1': {'password': 'pwd1', 'balance': 1000.0},
    'user2': {'password': 'pwd2', 'balance': 500.0},
}

def handle_client(client_socket):
    while True:
        request = client_socket.recv(1024).decode()
        if not request:
            break
        print(f"Received: {request}")
        
        command, *args = request.split()
        
        if command == 'REGISTER':
            username, password = args
            if username in users:
                response = 'Username already exists.'
            else:
                users[username] = {'password': password, 'balance': 0.0}
                response = 'User registered successfully.'
        
        elif command == 'BALANCE':
            username, password = args
            if username in users and users[username]['password'] == password:
                balance = users[username]['balance']
                response = f'Your balance is: {balance}'
            else:
                response = 'Invalid username or password.'
        
        elif command == 'DEPOSIT':
            username, password, amount = args
            amount = float(amount)
            if username in users and users[username]['password'] == password:
                users[username]['balance'] += amount
                response = 'Deposit successful.'
            else:
                response = 'Invalid username or password.'
        
        elif command == 'WITHDRAW':
            username, password, amount = args
            amount = float(amount)
            if username in users and users[username]['password'] == password:
                if users[username]['balance'] >= amount:
                    users[username]['balance'] -= amount
                    response = 'Withdrawal successful.'
                else:
                    response = 'Insufficient funds.'
            else:
                response = 'Invalid username or password.'
        
        else:
            response = 'Invalid command.'
        
        client_socket.send(response.encode())
    
    client_socket.close()

def start_server():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.bind(("0.0.0.0", 9999))
    server.listen(5)
    print("Server listening on port 9999...")
    
    while True:
        client_socket, addr = server.accept()
        print(f"Accepted connection from {addr}")
        client_handler = threading.Thread(target=handle_client, args=(client_socket,))
        client_handler.start()

if __name__ == "__main__":
    start_server()

5.2 客户端代码

import socket

def send_request(request):
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(("127.0.0.1", 9999))
    client.send(request.encode())
    response = client.recv(4096).decode()
    client.close()
    return response

def main():
    while True:
        print("Welcome to the Simple Bank System")
        print("1. Register")
        print("2. Check Balance")
        print("3. Deposit")
        print("4. Withdraw")
        print("5. Exit")
        
        choice = input("Select an operation: ")
        
        if choice == '1':
            username = input("Enter username: ")
            password = input("Enter password: ")
            request = f"REGISTER {username} {password}"
        
        elif choice == '2':
            username = input("Enter username: ")
            password = input("Enter password: ")
            request = f"BALANCE {username} {password}"
        
        elif choice == '3':
            username = input("Enter username: ")
            password = input("Enter password: ")
            amount = input("Enter deposit amount: ")
            request = f"DEPOSIT {username} {password} {amount}"
        
        elif choice == '4':
            username = input("Enter username: ")
            password = input("Enter password: ")
            amount = input("Enter withdrawal amount: ")
            request = f"WITHDRAW {username} {password} {amount}"
        
        elif choice == '5':
            break
        
        else:
            print("Invalid choice. Try again.")
            continue
        
        response = send_request(request)
        print(response)

if __name__ == "__main__":
    main()

6. 运行流程图

flowchart TD
    A[用户启动客户端] --> B{选择操作}
    B -->|注册| C[输入用户名和密码] --> D[发送注册请求]
    B -->|查询余额| E[输入用户名和密码] --> F[发送查询请求]
    B -->|存款| G[输入用户名、密码、存款金额] --> H[发送存款请求]
    B -->|取款| I[输入用户名、密码、取款金额] --> J[发送取款请求]
    B -->|退出| K[关闭客户端]
    
    D --> L[服务器处理请求] --> M[返回结果给客户端]
    F --> L
    H --> L
    J --> L

7. 练习题

  1. 修改代码,允许用户进行多次存款和取款操作,而不需要重新输入用户名和密码。
  2. 添加功能:查看历史交易记录(需要模拟)。
  3. 增加用户账户删除功能。

总结

本课程通过构建一个简易银行系统,实践了Python网络编程的基本概念,包括Socket的使用、客户端-服务器模型及数据处理。在实现过程中,我们模拟了账户管理和基本交易功能,为学习者提供了一个可以扩展和深入的项目基础。


怎么样今天的内容还满意吗?再次感谢观众老爷的观看。
最后,祝您早日实现财务自由,还请给个赞,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值