python 作业-ftp服务器_200行代码搭建python局域网聊天室

4ccc50cd932d48334e67b8bbd1cfeaac.png

一个python实战的小项目,利用socke模块和curses模块写了一个局域网聊天室。

  • 适用人群:熟悉python,对socket与多线程和有一定的了解。
  • socket:实现信息的传递。
  • curses:客户端控制数据显示。

项目的架构如下:

be875dac88140780236e97135be2366b.png

服务器端

c1bf0464b102dfd60c2b9b4c3856917b.png
  • 由于服务器需要同时为多个客户端服务,因此我们需要使用多个线程,每一个线程响应一个客户端。
  • 通过为每个线程赋予不同的socket来使其接收不同客户端传来的数据。

客户端

78a4f34296ce3199a008d04a9c01faea.png
  • 客户端需要同时处理读和写两件事,因此也需要两个线程,分别用于接收服务器传来的数据并显示在curses以及从curses接收数据发送到服务器端。
  • curses库为基于文本的终端提供独立于终端的屏幕绘制和键盘处理设施,可以通过curses模块在控制台指定位置输出和输入文本。

最终效果图

591b099970c758e72c974d50ffb3f288.png

源代码地址:

heucoder/LocalNetChat​github.com
8a99675f46da3f1b4e43170690f4aec1.png

或许你对这些也感兴趣:

超爱学习:半小时搭建简易ftp服务器​zhuanlan.zhihu.com
88ec3bf3eb4de3bb6416635e13919ac8.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python自带了一个ftplib模块,可以用来创建FTP服务器。下面是一个简单的Python脚本,用于创建一个FTP服务器: ```python import os import sys from ftplib import FTP from threading import Thread class FTPHandler(FTP): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.cwd = os.getcwd() def cdup(self): self.cwd = os.path.dirname(self.cwd) super().cwd(self.cwd) def cwd(self, path): self.cwd = os.path.join(self.cwd, path) super().cwd(self.cwd) def handle_client(client_socket): """ 处理客户端请求 """ ftp = FTPHandler() ftp.set_pasv(True) ftp.sock = client_socket print('FTP连接来自:', client_socket.getpeername()) ftp.welcome = 'Welcome to my FTP server.' ftp.login() while True: try: cmd = client_socket.recv(1024).decode() if not cmd: break print(cmd) cmd = cmd.split() if cmd[0] == 'QUIT': ftp.quit() break elif cmd[0] == 'CWD': ftp.cwd(cmd[1]) client_socket.send(b'250 Directory changed.\r\n') elif cmd[0] == 'CDUP': ftp.cdup() client_socket.send(b'200 Directory changed.\r\n') elif cmd[0] == 'PWD': client_socket.send(('257 "%s"\r\n' % ftp.cwd).encode()) elif cmd[0] == 'LIST': data_socket, addr = ftp.transfercmd('LIST') client_socket.send(b'150 Here comes the directory listing.\r\n') data = data_socket.recv(1024) while data: client_socket.send(data) data = data_socket.recv(1024) data_socket.close() client_socket.send(b'226 Directory send OK.\r\n') elif cmd[0] == 'RETR': file = open(os.path.join(ftp.cwd, cmd[1]), 'rb') data_socket, addr = ftp.transfercmd('RETR ' + cmd[1]) client_socket.send(b'150 Opening data connection.\r\n') data = file.read(1024) while data: data_socket.send(data) data = file.read(1024) file.close() data_socket.close() client_socket.send(b'226 Transfer complete.\r\n') else: client_socket.send(('502 Command not implemented.\r\n').encode()) except Exception as e: print(e) break client_socket.close() def main(): """ 启动服务器 """ host = '' port = 21 backlog = 5 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) server_socket.listen(backlog) print('FTP服务器已经启动,监听端口为:', port) while True: try: client_socket, addr = server_socket.accept() Thread(target=handle_client, args=(client_socket,)).start() except KeyboardInterrupt: sys.exit(0) if __name__ == '__main__': main() ``` 该脚本启动一个FTP服务器,监听21端口。在客户端输入命令时,它会响应CWD、CDUP、PWD、LIST和RETR命令。 使用该脚本非常简单,只需要运该脚本即可启动一个FTP服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值