HTTP服务器实现长连接的思路(Java语言)

devtools/2024/9/20 7:15:35/ 标签: java, http, 网络协议
http://www.w3.org/2000/svg" style="display: none;">

一、背景

目前的HTTP服务器很多,只要是编程语言支持线程和网络通信,就能开发一个HTTP协议服务器。

市场上常用的是Tomcat、Ngnix、Httpd等技术。


二、本文目的

介绍使用Java语言来开发HTTP服务器的处理逻辑。

这是个人可以参考的HTTP服务器通用逻辑。


三、工作线程的执行逻辑如下

(一)Java.net.Socket的阻塞式处理

java">1、从accept()方法处获取Socket对象。2、获取输入和输出流。3、进入循环处理:
while(true){      3.1 判断是否关闭和失去连接,如果任意满足,退出循环。      // 3.2 调用setSoTimeout()方法设置读取超时。      socket.setSoTimeout(3000);// 3.3 调用readRequest()方法读取请求,获得请求对象request。      // 3.4 调用doResponse(out, request)处理方法,把请求对象传入处理请求。      // 3.5 判断是否为长连接,否则退出循环}// 4、关闭套接字
socket.close()

(二)java.nio.channel.SocketChannel的非阻塞式处理

java">
1、当Selector获取一个通道满足可连接要求。2、处理可连接事件,注册可读取事件。3、当满足可读取事件,开始处理读取事件:
while(True){// 3.1循环读取请求while(True){// 3.1.1读取一次数据到缓冲里int size = chnnel.read(buffer);// 3.1.2如果size为0,退出循环。// 说明当前没有数据可读if(size== 0){break;}//  3.1.3翻转,用来读取buffer.flip();// 3.1.4把缓存数据写入请求对象中,用来构造请求request.addData(buffer);// 3.1.5清除缓冲buffer.clear();}// 3.2结束请求的数据,开始解析// 是否需要判断请求是否读取完整?有没有到读取空行request.end()// 3.3开始处理响应,传入请求对象doResponse(request);// 3.4判断当前连接还存在,失去连接就退出循环if(失去连接 || 已关闭){break;}// 3.5判断是否为长连接,不是则退出循环// 3.6设置读取超时时间,防止长时间保持}// 4、关闭该通道// 5、从Selector中移除通道注册

三、注意
1、上述的一些Request和Response对象是自定义的,内部有一些读写方法和其他方法,按照HTTP协议的格式来处理。


2、readRequest和doResponse方法是用户自定义实现的,作用分别是读取请求,返回请求对象;作出响应。


3、其他的都是系统库提供的方法。
例如Socket的方法,InputStream和OutputStream提供的方法。


4、非阻塞读取请求时,不好判断是否把请求全部读取完成了,因为不会阻塞等待,没有数据读取会返回整型数字0。


5、一些变量都是假设定义的。
例如ByteBuffer类型的buffer变量,Socket的socket对象,SocketChannel的channel变量等等。


6、如果想改成一种Servlet容器,只需要用反射生成Servlet对象,生成官方的请求和响应类,传入后执行服务方法。


http://www.ppmy.cn/devtools/52236.html

相关文章

每日一练 - PIM协议报文类型辨析

01 真题题目 在 PIM 协议中可能存在的报文是: A. JOIN/PRUNE B. ASSERT C. BOOTSTRAP D. REGISTER 02 真题答案 AB 03 答案解析 PIM(Protocol Independent Multicast)协议有两个主要的操作模式:PIM-Dense Mode (PIM-DM) 和 PIM…

两行css 实现瀑布流

html <ul ><li><a href"" ><img src"05094532gc6w.jpg" alt"111" /><p>传奇</p></a></li><li><a href"" ><img src"05094532gc6w.jpg" alt"111"…

泛微开发修炼之旅--13通过Ecology拦截器(注解的方式),拦截后端接口,实现接口执行成功后或执行前操作源码示例

文章链接&#xff1a;泛微开发修炼之旅--13通过Ecology拦截器(注解的方式)&#xff0c;拦截后端接口&#xff0c;实现接口执行成功后或执行前操作源码示例

一文详解选择低代码开发平台的六大理由

在当今快节奏的数字时代&#xff0c;企业需要快速开发和部署应用程序以保持竞争力。传统编程方式耗时较长&#xff0c;且需要大量人力和物力投入。因此&#xff0c;低代码开发平台应运而生&#xff0c;它可以帮助企业快速构建应用程序&#xff0c;提高生产力。本文将为您阐述选…

实验:贪心算法

实验二&#xff1a;贪心算法 【实验目的】 应用贪心算法求解活动安排问题。 【实验性质】 验证性实验。 【实验要求】 活动安排问题是可以用贪心算法有效求解的很好的例子。 问题&#xff1a;有n个活动的集合A{1,2,…,n}&#xff0c;其中每个活动都要求使用同一资源&…

2376.统计特殊整数

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int countSpecialNumbers(int n) {if (n < 0) {return -1;}std::string str to_string(n);std::vector<std::vector&l…

SSH隧道(客户端的数据加密并通过 SSH 服务器转发到目标服务器)

SSH隧道简介 SSH 隧道&#xff08;SSH Tunneling&#xff09;是通过 SSH&#xff08;Secure Shell&#xff09;协议创建的安全通道&#xff0c;用于将流量从一个网络传输到另一个网络。 SSH 隧道可以用来保护网络数据的传输&#xff0c;通常用于穿越防火墙、隐藏流量、访问受…

try catch return语句情况分析

try catch return语句情况分析 try catch无finally语句写在最后 try catch try catch语法是一种对应于异常处理的语句&#xff0c;其中try语句内用于编写有异常存在可能的语句&#xff0c;而catch语句内用于编写捕获到异常的类型以及对异常对象的处理方法&#xff0c;本文主要…

港科夜闻 | 香港科大与香港科大(广州)合推红鸟跨校园学习计划,共享教学资源,促进港穗学生交流学习...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大与香港科大(广州)合推“红鸟跨校园学习计划”&#xff0c;共享教学资源&#xff0c;促进港穗学生交流学习。香港科大与香港科大(广州)6月14日共同宣布推出“红鸟跨校园学习计划”&#xff0c;以进一步加强两校学…

什么是二叉树?二叉搜索树(BST)?什么是平衡二叉树,比如 AVL 树或红黑树?

二叉树及其变体详解 引言 在计算机科学中&#xff0c;树是一种重要的数据结构&#xff0c;用于表示具有层次结构的数据。二叉树作为树结构的一种特殊形式&#xff0c;因其简洁性和易于实现的特点&#xff0c;被广泛应用于各种算法和应用中。本文将详细介绍二叉树、二叉搜索树…

MFC工控项目实例之五CFile类读写系统参数

承接专栏《MFC工控项目实例之四在调试目录下创建指定文件夹》 实时保存输入的iPlotX坐标轴最小值、最大值到CFG.PAR文件&#xff0c;打开界面从CFG.PAR文件中实时读取保存的最小值、最大值在编辑框中显示。 1、SEAL_PRESSURE.h中添加代码 class CSEAL_PRESSUREApp : public CW…

简单了解java中的File类

1、File类 1.1、概述 File对象就表示一个路径&#xff0c;可以是文件路径也可以是文件夹路径&#xff0c;这个路径可以 是存在的&#xff0c;也可以是不存在的。 1.2、常见的构造方法 方法名称说明public File&#xff08;String pathname&#xff09;根据文件路径创建文件…

Fiddler抓包工具介绍

下载 下载:Web Debugging Proxy and Troubleshooting Tools|Fiddler 进去要填一个表 汉化版 百度网盘 请输入提取码 提取码&#xff1a;xq9t 下载过附件之后分别把两个文件 点开fiddler就ok了 配置https fiddler要想抓到https包(解密的),点击tools->options勾选三个对…

示例:WPF中DataGrid简单设置合并列头

一、目的&#xff1a;应用DataGridTemplateColumn列模板&#xff0c;去拆分列头和单元格布局的方式设置列头合并样式 二、实现 效果如下 三、环境 VS2022 四、示例 应用DataGridTemplateColumn自定义列头信息和单元格信息 <DataGrid AutoGenerateColumns"False"…

java算法:插入排序

这里写目录标题 基本使用优缺点尝试优化二分查找插入减少交换操作 基本使用 插入排序是一种简单直观的排序算法&#xff0c;它的工作原理是将待排序的数组分为已排序和未排序两部分&#xff0c;逐步将未排序部分的元素插入到已排序部分中的正确位置&#xff0c;直到整个数组有…

《跟我一起学“网络安全”》——安全设备

安全设备 一、安全设备–IDS IDS入侵检测 (1)什么是入侵检测&#xff1a; 入侵检测系统&#xff08;intrusion detection system&#xff0c;简称“IDS”&#xff09;是一种对网络传输进行即时监视&#xff0c;在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。…

Python:基础爬虫

Python爬虫学习&#xff08;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字…

考试系统提供源码能做什么?

考试系统提供源码&#xff0c;无疑为现代教育领域注入了新的活力。源码&#xff0c;作为软件开发的基石&#xff0c;其开放与共享的特性使得考试系统具备了前所未有的灵活性和可定制性。那么&#xff0c;考试系统提供源码究竟能做什么呢&#xff1f;本文将详细探讨其多重功能与…

kotlin lambda 表达式的原理、语法和详细用法

Kotlin 的 lambda 表达式是一种简洁的函数表达式&#xff0c;用于实现匿名函数。以下是 lambda 表达式的原理、语法和详细用法。 1. Lambda 表达式的原理 Lambda 表达式是一种匿名函数&#xff0c;具有以下特点&#xff1a; 可以作为参数传递给其他函数可以在函数内部定义和…

RabbitMQ消息的可靠传输和防止消息丢失

在Spring Cloud项目中&#xff0c;为了确保RabbitMQ消息的可靠传输和防止消息丢失&#xff0c;需要考虑以下几个方面&#xff1a; 消息持久化&#xff1a;确保消息在RabbitMQ中持久化。队列持久化&#xff1a;确保队列是持久化的。发布确认&#xff1a;使用发布确认机制确保消…