服务器编程/ftp

软件服务器:编写的服务端应用程序, 在硬件服务器上运行, 一般依托于操作系统,给用户提供一套完整的服务

httpserver 处理Http请求
webserver 网站的后端应用服务器程序
邮箱服务器 邮件处理
ftp文件服务器 文件的上传下载

功能:网络连接 逻辑处理 数据交互 数据传输 协议的实现

结构:
c/s 客户端服务器模型
b/s 浏览器服务器模型

服务器目标:处理速度更快,并发量更高,安全性更强
硬件:更高的配置,更好的集成分布技术,更好的网络优化和网络安全技术
软件:占用资源更少,运行更稳定,算法更优良,安全性更好,并发性更高,更容易扩展

基础服务模型


  1. 循环模型:循环接收客户端请求,处理请求。同一时刻只能处理一个请求,处理完毕后再处理下一个
    优点:实现简单,占用资源少
    缺点:无法同时处理多个客户端任务
    适用情况:处理的任务可以短时间完成,不需要建立并发,更适合udp使用

  2. 并发模型:能够同时处理多个客户端请求
    • IO并发:IO多路复用
      优点:资源消耗少,IO处理速度快
      缺点:不能适用cpu密集型程序
    • 多进程/多线程并发:为每个客户端创建单独的进程线程,执行请求
      优点:每个客户端可以长期占有服务器运行程序,能够使用多核资源 ,可以处理IO或者cpu运算
      缺点:消耗系统资源高

多进程并发模型

使用fork实现进程并发

  1. 创建套接字,绑定,监听
  2. 等待接收客户请求
  3. 创建新的进程处理客户端请求
  4. 原有进程继续等待接收新的客户端连接
  5. 如果客户端退出则关闭子进程
# fork_server.py
from socket import *
import os
import sys
import signal

# 客户端处理函数


def client_handler():
    print('处理子进程的请求:', c.getpeername())
    try:
        while True:
            data = c.recv(1024)
            if not data:
                break
            print(data)
            c.send('收到客户端请求'.encode())
    except (KeyboardInterrupt, SystemError):
        sys.exit('客户端退出')
    except Exception as e:
        print(e)
    c.close()
    sys.exit(0)


# 创建套接字
HOST = ""  # '0.0.0.0'
PORT = 8888
ADDR = (HOST, PORT)

s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(ADDR)
s.listen(5)

print('进程%d等待客户端连接' % os.getpid())

# 在父进程中忽略子进程状态改变,子进程退出自动由系统处理
signal.signal(signal.SIGCHLD, signal.SIG_IGN)

while True:
    try:
        c, addr = s.accept()
    except KeyboardInterrupt:
        sys.exit('服务器退出')
    except Excepton as e:
        print('Error:', e)
        continue
    # 为客户端创建新的进程,处理请求
    pid = os.fork()

    # 子进程处理具体请求
    if pid == 0:
        s.close()
        client_handler()

    # 父进程或者创建失败都继续等待下个客户端连接
    else:
        c.close()
        continue

cookie:
在父进程中忽略子进程状态改变,子进程退出自动由系统处理
signal.signal(signal.SIGCHLD, signal.SIG_IGN)

ftp文件服务器

项目功能

  • 服务端和客户端两部分,要求启动一个服务端,可以同时处理多个客户端请求
  • 功能:
    1. 可以查看服务端文件库中所有的普通文件
    2. 从客户端可以下载文件库的文件到本地
    3. 可以将本地文件上传的服务端文件库
    4. 退出
  • 客户端使用print在终端打印简单的命令提示,通过命令提示发起请求
  1. 技术分析(fork, tcp, 并发)
  2. 每个功能要单独封装,整体功能写在一个类中
  3. 如何搭建整体架构,完成网络通讯

cookie
os.listdir(path)
os.path.isfile()
os.path.isdir()

转载于:https://www.cnblogs.com/ravener/p/9645418.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自己写的ftp服务端程序代码,支持{"USER", do_user }, {"PASS", do_pass }, {"CWD", do_cwd }, {"XCWD", do_cwd }, {"CDUP", do_cdup }, {"REIN", do_rein },//重新初始化,此命令终止USER,重置所有参数,控制连接仍然打开,用户可以再次使用USER命令 {"QUIT", do_quit }, /*------------传输参数命令------------*/ {"PORT", do_port },//数据端口,主要向服务器发送客户数据连接的端口 //格式为PORT h1,h2,h3,h4,p1,p2,其中32位的IP地址用h1,h2,h3,h4表示,16位的TCP端口号用p1,p2表示 {"PASV", do_pasv },//此命令要求服务器数据传输进程在指定的数据端口侦听,进入被动接收请求的状态 {"TYPE", do_type },//文件类型,可指定ASCII码、EBCDIC码、Image、本地类型文件等参数 /*------------服务命令----------------*/ {"RETR", do_retr },//下载文件 {"STOR", do_stor },//上传 {"APPE", do_appe },//上传,如文件已存在,数据附加到尾部 {"REST", do_rest },//重新开始 {"RNFR", do_rnfr }, {"RNTO", do_rnto },//重命名文件或目录 {"ABOR", do_abor },//异常终止 {"DELE", do_dele },//删除文件 {"RMD", do_rmd },//删除目录 {"XRMD", do_rmd }, {"MKD", do_mkd },//新建目录 {"XMKD", do_mkd }, {"PWD", do_pwd },//打印当前目录 {"XPWD", do_pwd }, {"LIST", do_list },//列目录详细清单 {"NLST", do_nlst },//列目录短清单 {"SYST", do_syst },//获取系统信息 {"STAT", do_stat },//返回服务器状态 {"SIZE", do_size },//获得文件大小 {"HELP", do_help }, {"NOOP", do_noop }, {"SITE", do_site }, }等命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值