Python学习笔记-基于socket基础的http服务端程序

通过HTTP协议可以进行通信可以规范化的进行网络间通信。下面技术第一个http服务器小程序。简单的记录第一个试手程序。

1.http通信的基本流程

整个流程对应四层网络架构:应用层、传输层、网络层、链路层。有的部分已经封装,不需要我们再行处理。

2.服务器程序设置

2.1 创建一个socket对象

self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

第一个参数是指定IP协议,第二个参数用于指定通信方式。

官方构造函数解释如下:

    def __init__(self, family=-1, type=-1, proto=-1, fileno=None):# For user code address family and type values are IntEnum members, but# for the underlying _socket.socket they're just integers. The# constructor of _socket.socket converts the given argument to an# integer automatically.if fileno is None:if family == -1:family = AF_INETif type == -1:type = SOCK_STREAMif proto == -1:proto = 0_socket.socket.__init__(self, family, type, proto, fileno)self._io_refs = 0self._closed = False

基本参数信息如下:

AF_INET = AddressFamily.AF_INET

IPv4地址

AF_INET6 = AddressFamily.AF_INET6

IPv6地址

SOCK_STREAM = SocketKind.SOCK_STREAM

基于TCP传输

SOCK_DGRAM = SocketKind.SOCK_DGRAM

基于UDP传输

2.2 绑定IP和端口

def bind(self, __address: _Address) -> None: ..._Address: TypeAlias = tuple[Any, ...] | str | ReadableBuffer

指定一个地址进行绑定。

通过元组的形式指定IP地址和端口号:

self.server_socket.bind(("", port))

注意,需要使用元组型号的数据,第一个参数是IP地址,第二个参数是端口号,使用空字符串”“默认为本地IP地址:127.0.0.1。

2.3 启动监听

def listen(self, __backlog: int = ...) -> None: ...

设置监听数量,即允许同时连接的最大客户端数量。

2.4 接收请求

    def accept(self):"""accept() -> (socket object, address info)Wait for an incoming connection.  Return a new socketrepresenting the connection, and the address of the client.For IP sockets, the address info is a pair (hostaddr, port)."""fd, addr = self._accept()sock = socket(self.family, self.type, self.proto, fileno=fd)# Issue #7995: if no default timeout is set and the listening# socket had a (non-zero) timeout, force the new socket in blocking# mode to override platform-specific socket flags inheritance.if getdefaulttimeout() is None and self.gettimeout():sock.setblocking(True)return sock, addr

通过accept函数返回请求对象,返回两个参数,一个是请求的socket,一个是请求的地址信息。

client_socket, client_address = self.server_socket.accept()

2.5 处理请求

处理请求就相当于字符串处理,解析报文,进行对应处理。

2.6 应答

def send(self, __data: ReadableBuffer, __flags: int = ...) -> int: ...

通过send函数将bytes数据返回给客户端。

client_socket.send(bytes(response, "utf-8"))

2.7 关闭socket

client_socket.close()

关闭客户端的socket。

注意:此处关闭的是获取到的客户端socket,不是服务器的socket。

3. 示例代码

3.1 服务端代码

# _*_ coding:utf-8 _*_import socket
import re
import os
from multiprocessing import ProcessHTML_ROOT_DIR = "./zero.staticserver/views"class HTTPServer(object):"""HTTP server"""def __init__(self) -> None:"""init"""self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)"""初始化socket,IPV4,TCP协议"""def bind(self, port):"""Binding port"""self.server_socket.bind(("", port))def start(self):"""Start server"""self.server_socket.listen(20)   # 设置最大连接数20print("Server started.Waitting to connect...")while True:# 接收的客户端连接信息client_socket, client_address = self.server_socket.accept()print("Client Connected. IP:{0},Port:{1}",client_address[0], client_address[1])process_client = Process(target=self.handle_client, args=(client_socket,))process_client.start()client_socket.close()def handle_client(self, client_socket: socket.socket):"""handle of client"""request_data = client_socket.recv(1024)print("Request Data:", request_data)print("********逐行输出请求数据*********")request_lines = request_data.splitlines()for line in request_lines:print(line)print("********解析报文*********")request_start_line = request_lines[0]str_request_start_line = request_start_line.decode("utf-8")print(str_request_start_line)filename = re.match(r"\w+ +(/[^ ]*) ", str_request_start_line).group(1)print("File Name : {0}".format(filename))if filename == "/":filename = "index.html"print("root path : {0}".format(os.getcwd()))try:filepath = f"{HTML_ROOT_DIR}/{filename}"file = open(filepath, "rb")except IOError:# 返回异常response_start_line = "HTTP/1.1 404 Not Found"response_headers = "Server:First server"response_body = "The file is not found."else:# Read file data.filedata = file.read()file.close()response_start_line = "HTTP/1.1 200 OK"response_headers = "Server:First server"response_body = filedata.decode("utf-8")print("\r\n")response = f"{response_start_line}\r\n{response_headers}\r\n\r\n{response_body}"print("Response:\r\n{0}".format(response))client_socket.send(bytes(response, "utf-8"))# Close socket.client_socket.close()

3.2 访问结果

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15268.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAR ADC version2 ——ADC背景介绍

目录: ADC常用指标分类 静态性能:微分非线性:DNL 积分非线性:INL 仿真测试DNL:(码密度法)(code density&…

1.Git使用技巧-常用命令1

Git使用技巧-常用命令 文章目录 Git使用技巧-常用命令一、git 创建仓库demo 二、本地仓库常用命令提交详解git commitgit commit --amend 三、 推送到远程分支git push 总结参考 一、git 创建仓库 创建远端仓库: git init – bare // 创建远端裸仓库; 远…

哈工大计算网络课程数据链路层详解之:数据链路层服务

哈工大计算网络课程数据链路层详解之:数据链路层服务 在介绍完网络层的实现功能和协议之后,接下来我们继续介绍网络层的下一层:数据链路层。 本节首先对数据链路层的功能和所提供的服务进行概述。 如下图示例网络所示,标红色的部…

18.Lucas-Kanade光流及OpenCV中的calcOpticalFlowPyrLK

文章目录 光流法介绍OpenCV中calcOpticalFlowPyrLK函数补充reference 欢迎访问个人网络日志🌹🌹知行空间🌹🌹 光流法介绍 光流描述了像素在图像中的运动,就像彗星☄划过天空中流动图像。同一个像素,随着时…

【三】部署zabbix-proxy代理服务器和高可用,以及监控windows系统和java应用

zabbix代理服务器和高可用 1.部署zabbix代理服务器1.1 代理端zabbix-proxy配置1.2 客户端zabbix-agent配置1.3 zabbix-proxy总结 2. 部署Zabbix高可用集群2.1 主节点zabbix-server配置2.2 备节点zabbix-server配置2.3 客户端zabbix_agent配置2.4 Zabbix高可用集群总结 3.Zabbix…

【uniapp开发小程序】实现读取手机剪切板第一条,识别并以姓名/手机号/收货地址格式输出

效果图&#xff1a; 完整代码&#xff1a; <template><view class""><text>测试</text><view click"pasteContent()" class"content">点击此处可快速识别 您的收货信息</view></view> </templat…

WAIC2023记录

汤晓鸥 学生与工作&#xff1a; 微软布局大模型方向

Linux高频常用指令汇总

目录 认识 Linux 目录结构 绝对路径&#xff1a;以根目录开头的, 称为绝对路径 相对路径&#xff1a;不是根目录开头的,称为相对路径 ls pwd cd mkdir touch cat echo rm cp mv vim编辑器 1、进入文件 2、进行编辑模式 3、保存退出 重要的几个热键[Tab],[ct…

如何利用Spine制作简单的2D骨骼动画

在2D游戏中&#xff0c;我们经常看到各种各样的角色动画。动画能给游戏带来生机和灵气。创作一段美妙的动画&#xff0c;不仅需要强大的软件工具&#xff0c;更需要一套完善的工作流程。 Spine就是一款针对游戏开发的2D骨骼动画编辑工具。Spine 可以提供更高效和简洁 的工作流…

【电子学会】2023年05月图形化四级 -- 还原轨迹

还原轨迹 1. 准备工作 &#xff08;1&#xff09;删除小猫&#xff1b; &#xff08;2&#xff09;从角色库添加“Butterfly 1”角色&#xff1b; &#xff08;3&#xff09;保留白色背景。 2. 功能实现 &#xff08;1&#xff09;点击绿旗&#xff0c;清除舞台&#xff…

【Kafka】Kafka的Broker概述

【Kafka】Kafka的Broker概述 文章目录 【Kafka】Kafka的Broker概述1. Broker的工作流程1.1 Zookeeper存储的Kafka信息1.2 Broker 总体工作流程1.3 Broker重要参数 2. 节点服役和退役2.1 服役新节点2.2 退役旧节点 3. Kafka副本3.1 副本信息3.2 Leader选举流程3.3 Leader 和 Fol…

2023全新UI 哈希玛特HashMart全开源盲盒系统源码下载

ashMart&#xff08;哈希玛特&#xff09;是首款开源的面向生产的高性能、易开发的盲盒系统。它包含&#xff1a;首页看板、商品管理、订单管理、盲盒管理、系统管理、会员管理、权限管理、记录管理&#xff0c;并且拥有完善的搭建使用手册和接口文档。是帮助您快速落地盲盒商城…