1.服务端目录
pan
|----main.py 文件,程序的主文件
|----config 包,放配置文件
|----__init__.py
|----settings.py
|----db 文件夹,存放用户信息数据,放user.xlsx
|----files 文件夹,存放文件
|----src 包,业务处理的代码
|----handlers
|----__init__.py
|----pan.py 文件,实现注册,登录,上传,下载功能
|----__init__.py
|----select_server.py 文件,IO多路复用+非阻塞
|----server.py 文件,普通服务端
|----utils 包,公共功能
|----__init__.py
|----req.py 文件,发送接收数据,发送接收文件,解决粘包问题
settings.py
HOST = "127.0.0.1"
PORT = 8000
server.py
import socket
from config import settings
class Server(object):
def __init__(self):
self.host = settings.HOST
self.port = settings.PORT
def run(self, handler):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind((self.host, self.port))
sock.listen(5)
while True:
conn, addr = sock.accept()
print("有客户端来连接了")
instance = handler(conn)
while True:
result = instance.execute()
if not result:
print("客户端断开连接")
break
conn.close()
socket. Close()
pan.py
from utils import req
class PanHandler(object):
def __init__(self, conn):
self.username = None
self.conn = conn
def execute(self):
"""
每次客户端发来请求,触发此方法。
:return: 返回False 关闭连接; 返回True 继续执行
"""
conn = self.conn
cmd, *args = req.recv_data(conn).decode("utf-8")
if cmd.upper == "Q":
print("客户端退出")
return False
req.py
import struct
def send_data(conn, content):
data = content.encode("utf-8")
header = struct.pack("i", len(data))
conn.sendall(header)
conn.sendall(data)
def recv_data(conn, chunk_size=1024):
has_read_size = 0
bytes_list = []
while has_read_size < 4:
chunk = conn.recv(4 - has_read_size)
has_read_size += len(chunk)
bytes_list.append(chunk)
header = b"".join(bytes_list)
data_length = struct.unpack("i", header)[0]
has_read_data_size = 0
data_list = []
while has_read_data_size < data_length:
size = chunk_size if (data_length - has_read_data_size) > chunk_size else data_length - has_read_data_size
chunk = conn.recv(size)
has_read_data_size += len(chunk)
data_list.append(chunk)
data = b"".join(data_list)
return data
main.py
from src.handler.pan import PanHandler
from src.server import Server
if __name__ == "__main__":
server = Server()
server. Run(PanHandler)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。