基于Java实现简单Http服务器之一

5G核心网Framed Routing功能解析:基于PFCP的帧路由机制与多终端互联实践 阅读详情

        本文将详细介绍如何基于java语言实现一个简单的Http服务器,文中将主要介绍三个方面的内容:1)Http协议的基本知识、2)java.net.Socket类、3)java.net.ServerSocket类,读完本文后你可以把这个服务器用多线程的技术重新编写一个更好的服务器。

         由于Web服务器使用Http协议通信的因此也把它叫做Http服务器,Http使用可靠的TCP连接来工作,它是面向连接的通信方式,这意味着客户端和服务器每次通信都建立自己的连接,它又是无状态的连接,当数据传输完毕后客户端和服务器端的连接立刻关闭,这样可以节省服务器的资源,当然如果需要传输大量的数据,你可以在Request的头设置Connection=keep-alive使得可以复用这一个连接通道。在HTTP协议中非常重要的两个概念就是:请求(Request)和(响应)这也是我在这里要讲述的如果你想了解Http更多的内容那么请参考http://www.w3.org/Protocols/HTTP/1.1/rfc2616.pdf。

         一个Http请求包括三个重要的部分:
Method-URI-Protocol/Version
Request headers
Entity body
下面是一个Http请求的例子:
POST /servlet/default.jsp HTTP/1.1
Accept: text/plain; text/html
Accept-Language: en-gb
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/ch8/SendDetails.htm
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)
Content-Length: 33
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate

LastName=Franks&FirstName=Michael
其中第一行是Method-URI-Protocol/Version ,这是非常重要的部分,你需要从中读取客户端数据传输的方式,URI以及协议和版本,在这里分别是POST / servlet/default.jsp http/1.1,我们的简单的服务器的思路就是从request中得到URI后在你的服务器上找到这个资源,比如是一个静态的html页面,然后把它发送给浏览器。记住URI是相对于你的HTTP服务器的根目录的,所以以/来开头。接下来的部分是请求头信息它们都是以name:value这样的方式构成的,这里不再多介绍了。在Header和Entity body之间有一空行叫做CRLF,这用来标记Entity body的开始的,意思是下面的是传输的数据了。

         HTTP响应和请求非常相似,同样包括三个部分:
Protocol-Status code-Description
Response headers
Entity body
下面是一个具体的例子:
HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Date: Mon, 3 Jan 1998 13:13:33 GMT
Content-Type: text/html
Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT
Content-Length: 112

something  in html style......................

通常在J2ME联网中我们需要判断响应的状态码来决定下一步的操作,比如200代表连接成功。现在你应该清楚为什么这么做了吧。同样在Header和Entity body中有一个CRLF分割。

        现在我们来看看java中的Socket类,socket其实是对编程语言的一种抽象,它提供了在网络上端对端访问的可能,但是它并不依赖于编程语言,你完全可以使用java和c语言通过socket来进行通信,在java中是通过java.net.Socket来实现的,当你要构建一个socket的时候,你只是需要调用它的构造器
public Socket(String host,int port),其中host代表目标主机的地址或名字,port代表端口,比如80。当我们创建了一个Socket的实例后我们就可以进行通信了,如果你要基于字节来通信,那么你可以通过调用getOutputStream()和getInputStream()来得到OutputStream和InputStream的对象,如果你是基于字符通信的话那么你可以用PrintWriter和BufferedReader进行二次包装,例如PrintWriter pw = new PrintWriter(socket.getOutputStream(),true)。下面是简单的使用socket通信的代码片断,实现了向127.0.0.1:8080发送Http请求的功能

Socket socket = new Socket("127.0.0.1", "8080");
OutputStream os = socket.getOutputStream();
boolean autoflush = true;
PrintWriter out = new PrintWriter( socket.getOutputStream(), autoflush );
BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream() ));

// send an HTTP request to the web server
out.println("GET /index.jsp HTTP/1.1");
out.println("Host: localhost:8080");
out.println("Connection: Close");
out.println();

// read the response
boolean loop = true;
StringBuffer sb = new StringBuffer(8096);

while (loop) {
 if ( in.ready() ) {
 int i=0;
 while (i!=-1) {
        i = in.read();
       sb.append((char) i);
 }
loop = false;
 }
 Thread.currentThread().sleep(50);
}

// display the response to the out console
System.out.println(sb.toString());
socket.close();

       接下来介绍与Socket类对应的ServerSocket类的使用,与Socket代表客户端不同的是,ServerSocket是代表服务器端的,因为它必须在某个端口不停的监视是否有客户端连接进来。通过调用ServerSocket的构造器我们可以建立起监听特定端口的Server。例如
new ServerSocket(8080, 1, InetAddress.getByName("127.0.0.1"));
这样我们在本机的8080端口建立起来了ServerSocket。当你调用ServerSocket的accept()方法后,只有有连接进来的时候,这个方法才会返回一个Socket的对象,这样你就可以使用这个实例来接受或者发送数据了。记住当我们传输数据结束后要记得调用clos()方法来释放资源。

       本文主要为Http服务器的实现做铺垫,在后面的文章内将主要讲述如何实现并运行我们基于Java实现的Http服务器。

零基础实战:用 Docker 和 vLLM 本地部署 bge-reranker-v2-m3 重排序模型 本文介绍了如何利用Docker容器和vLLM推理框架在本地部署BAAI开发的bge-reranker-v2-m3文本排序模型。 阅读详情

相关推荐

手把手教你用Github提交CVE漏洞(附完整截图流程)

本文提供了在GitHub平台提交CVE漏洞的完整实战指南。从前期准备、目标搜寻与漏洞验证,到撰写规范的GitHub Issue进行披露,最后通过官方渠道完成CVE提交,手把手教你如何将安全研究成果转化为获得国际认可的CVE编号。

weixin_28309571的博客 320

Java实现http服务器

前言 有个需求,需要内嵌http服务,要求体积尽可能小,http并发很小,那么就自行实现一个http服务。其实http只是一种应用层协议:超文本传输协议。传输层协议为TCP。 1. http协议 http协议的内容通过抓包如下: 可以看见Hypertext Transfer Protocol下 标红的是http协议的核心,http header是说明协议,协议mime-type;body才是返回的内容。 2. BIO HTTP demo ...

fenglllle的博客 8489

别再为3D抓取发愁了!Halcon手眼标定保姆级教程(Eye-to-Hand模式,含完整代码)

本文提供Halcon手眼标定的保姆级教程,详细讲解Eye-to-Hand模式下的3D抓取实现方法。从硬件配置、坐标系系统到标定流程和核心算法,涵盖完整代码和实战经验,帮助用户快速掌握工业自动化中的精准抓取技术。

weixin_42523711的博客 269

Java 实现简单的Http服务器

Java 实现简单的Http服务器       首先需要说明的是,这个HTTP服务器真的超级简单,简单到只有一个Java类,它只能返回一个特定的HTML文本。写这个HTTP服务器程序是为了探究Web服务器到底是如何提供HTTP服务的。       要搞清这个问题,你最好先简单了解一下HTTP协议,起码要知道HTTP请求和HTTP响应是什么,HTTP报文格式是怎样的。HTTP报文有两种:请求报文

Cloud-Future的博客 9999

STM32F103开发实战:如何用CubeMX+CLion调整Flash起始地址(附完整CMake配置)

本文详细介绍了在STM32F103开发中如何使用CubeMX和CLion工具链调整Flash起始地址,包括链接脚本修改、系统文件配置和CMake工程适配。通过实战步骤和完整配置示例,帮助开发者实现固件双备份、OTA升级等高级功能,提升嵌入式开发效率。

5b6n7m8的博客 209

软件项目成本控制实战:从COCOMO模型到挣值分析的5个关键步骤

本文详细介绍了软件项目成本控制的5个关键步骤,从COCOMO模型估算到挣值分析预警,帮助中小型团队精准管理预算。通过简化COCOMO II的有机模式、动态建立成本基准、轻量化挣值分析等方法,项目经理可以有效应对预算超支和进度延误问题,提升项目成功率。

weixin_30733003的博客 227

Java 网络编程 —— 创建非阻塞的 HTTP 服务器

HTTP 客户程序必须先发出一个 HTTP 请求,然后才能接收到来自 HTTP 服器的响应,浏览器就是最常见的 HTTP 客户程序。HTTP 客户程序和 HTTP 服务器分别由不同的软件开发商提供,它们都可以用任意的编程语言编写。HTTP 严格规定了 HTTP 请求和 HTTP 响应的数据格式,只要 HTTP 服务器与客户程序都遵守 HTTP,就能彼此看得懂对方发送的消息。

低吟不作语的博客 1791

用V E S C 6-M K V I 第六代调速控制器给VESC电调刷固件

文章摘要:本文介绍了一款先进的电机控制器,具备多项创新技术。核心亮点包括三相电流/电压检测、四象限无缝运行、多模式兼容等先进电机控制技术,以及智能感知与安全保护、高效能电源管理、多样化连接与扩展功能。此外,该控制器支持实时数据监测与用户交互,具备开源生态和工业级可靠性,适用于电动载具、机器人及工业领域。用户需注意散热要求和兼容性提示,可通过VESC-Tool软件进行灵活配置。产品可在常竹科技淘宝店购买,并加入技术交流群获取支持。

2403_89422757的博客 1364

java代码构建简单http服务器和客户端

好了,至此完全可以由HttpClient客户端类——>HttpServer服务类上请求及响应,可以由浏览器——>HttpServer发送请求(上面已经测试了),HttpClient——>tomcat来相应请求(有兴趣的可以自己来,tcp协议只能监听一个端口的主机服务,开启tomcat,关闭HttpServer测试类)第一行:请求方式(get、post、put、delete)+“空格”+URI+“空格”+http协议版本(0.9、1.0、1.1) eg:GET /hello.html HTTP/1.1。

matinal 當冬夜漸暖 。公众号:matinal 2732

LoRaWAN数据包分析工具

前言:LoRaWAN的射频数据包是加密的,而且有些字段是某个字节的某几位,看着不是那么直观,因此在某些情况下需要借助工具来分析数据包。 1、安装npm 这个工具是用JavaScript写的,其中用到了一些依赖库,而npm就可以一次性把这些依赖库下载下来,因此我们先要下载安装npm这个工具。 安装:sudo apt install npm 输入y,等待安装完成: 检查是否安装成功:npm -v 说明安装完成。 2、安装LoRa数据包分析工具lora-packet 安装:npm i.

freemote的博客 4629

软件设计师---UML

软件设计师---UML

我从不打没有准备的仗! 1万+

java实现http服务器

1、使用socket简单实现http协议: //参考链接:http://blog.youkuaiyun.com/sunxing007/article/details/4305956 import java.io.*; import java.net.*; /** * MyHttpServer 实现一个简单的HTTP服务器端,可以获取用户提交的内容 * 并给用户一个response * 因为时间的关

云守护的专栏 1万+

STM32 cubeMX配置串口重定向

这篇文章主要讲解什么是串口重定向,为什么要串口串口重定向。使用printf函数和上位机通信是非常的方便的。希望大家都能够掌握。

m0_49476241的博客 4571

Java 简单实现HTTP服务器

HTTP服务器   解释: 个人理解,http服务器就是解析http请求信息,并解析信息;然后根据信息做后续事情。   Http请求格式与响应格式      核心代码     package com_2.Httpserver; import java.io.BufferedReader; import java.io.IOException; import java.i...

Dachuan 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java实现http服务器_JAVA实现简单HTTP服务器

学习用Java模拟完成一个简单的HTTP服务器,加深对HTTP服务过程的理解。Socket客户端套接字(也可以就叫“套接字”),套接字是两台机器之间的通信端点,是源IP地址和目的IP地址以及源端口号和目的端口号的组合,一般用于标识客户端请求的服务器和服务,是支持TCP/IP的网络通信的基本操作单元。一个Socket由一个IP地址和一个端口号唯一确定。在Java环境下,Socket编程主要是指基于T...

weixin_34596480的博客 997

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

用Java实现一个简单的HTTP服务器(一)HTTP

用Java实现一个简单的HTTP服务器(一)一、HTTP协议简介二、HTTP工作原理三、HTTP请求方法四、HTTP状态码五、URL六、HTTP请求协议七、HTTP响应协议总结 简介:这学期报了计网创新的创新实验,在机房做基于交换机和路由器的计网实验。最近正在学Java,想用Java实现一个简单的HTTP服务器,接下来就是我的心路历程. 一、HTTP协议简介 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP) 是一种用于分布式、协作式和超媒体信息系统的应用层协议。

MrsYoutiao的博客 2555

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

用JAVA实现一个简单地Http服务器

SimpleHttpServer.java import java.io.FileInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.nio.ByteBuffer; import java.nio.CharBuffer; im

杜甲同学的专栏 3665

Java NIO的简单HTTP服务器实现

用JAVA NIO实现一个最简单的HTTP服务器。 不管浏览器请求什么,都展示Hello, world在浏览器中。 注意点: (1).在处理ACCEPT事件后,只需要往Selector中注册READ操作。不需要注册WRITE操作,因为WRITE操作是随时都可用的。 (2).处理完响应操作,才能关掉客户端的SocketChannel。 OP_WRITE is almost always ready. It rarely if ever makes sense to register for O..

Elivs的博客 1154

基于 Java NIO 实现简单的 HTTP 服务器

1.简介 本文是上一篇文章实践篇,在上一篇文章中,我分析了选择器 Selector 的原理。本篇文章,我们来说说 Selector 的应用,如标题所示,这里我基于 Java NIO 实现了一个简单的 HTTP 服务器。在接下来的章节中,我会详细讲解 HTTP 服务器实现的过程。另外,本文所对应的代码已经上传到 GitHub 上了,需要的自取,仓库地址为 toyhttpd。好了,废话不多说...

dishitu6229的博客 464

用Java实现简单的HTTP服务器(二)

用Java实现简单的HTTP服务器(二) 上次我们讲了一些关于HTTP报文的基础知识,接下来我们就讲用Java如何实现 1. 内容分析: ​ 实现一个对于HTTP协议的解析程序,对于HTTP的GET/POST请求进行分析,并给出回应。通过监听端口,实现对本地数据的获取。 2. 需要学习的主要知识 ​ Java的ServerSocket库,Socket库的基本应用。Java基本用法,Java字符串解析。Jframe的简单使用。 3. 实验方案 ​ 1. 首先我们建立一个服务端,来监听端口,并接受HTTP请求

MrsYoutiao的博客 776

java实现http服务器_Java实现简单的HTTP服务器详解

Java实现简单的HTTP服务器Java实现简单的HTTP服务器import java.net.*;import java.nio.ByteBuffer;import java.nio.channels.*;import java.nio.charset.*;import java.util.concurrent.*;import java.io.*;public class SimpleHttp...

weixin_42494160的博客 243

基于Java实现简单Http服务器(转)

本文将详细介绍如何基于java语言实现一个简单的Http服务器,文中将主要介绍三个方面的内容:1)Http协议的基本知识、2)java.net.Socket类、3)java.net.ServerSocket类,读完本文后你可以把这个服务器用多线程的技术重新编写一个更好的服务器。 由于Web服务器使用Http协议通信的因此也把它叫做Http服务器,Http使用可靠的TCP连接来...

hnlixm的博客 501

简单HTTP服务器的Java实现

在web的最初阶段是不支持web服务器与用户的交互的.也就是说web服务器不能动态的生成用户要访问的页面,web服务器提供给用户的页面都是提前生成好的.所以也说这种页面是静态页面. 比如说用户请求访问http://localhost:8088/hello1.htm, 那么web服务器从自己的想要目录下获取hello1.htm(已经存在).然后通过HTTP协议返回给用户.下面我们来模拟一下这个过程.

Ydoing的专栏 6336

JAVA 实现 简单的 HTTP服务器

http://www.cnblogs.com/walle2014/p/3815490.html 关于JAVA的HTTP服务器的简单实现,还望大家给出宝贵建议,谢谢。1、首先来说下HTTP所有的状态碼,相信对于网页开发的博友们,肯定不陌生。 状态码 状态码英文名称 中文描述 100 Continue 继续。客户端应继续

业精于勤荒于嬉;行成于思,毁于随。 2077

JAVA编写的一个简单的Socket实现的HTTP响应服务器

JAVA编写的一个简单的Socket实现的HTTP响应服务器,看后就很容易理解Web服务器的原理了。 package test.io; import java.net.*; import java.io.*; /** * 一个简单的Socket实现的HTTP响应服务器。 * 只用于熟悉HTTP协议的目的,可以看到浏览器发过来的数据格式。 * * @author */ publ

雷霄骅(leixiaohua1020)的专栏 7946

java 服务器 http请求_HTTP请求和响应报文与简单实现Java Http服务器

报文结构HTTP 报文包含以下三个部分:起始行报文的第一行是起始行,在请求报文中用来说明要做什么,而在响应报文中用来说明出现了什么情况。首部起始行后面有零个或多个首部字段。每个首部字段都包含一个名字和一个值,为了便于解析,两者之间用冒号(:)来分隔。首部以一个空行结束。添加一个首部字段和添加新行一样简单。主体空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给 Web ...

weixin_29807369的博客 863
上一篇: 介绍J2ME可选包的概念
下一篇: 基于Java实现Http服务器之二
mingjava
博客等级 码龄24年 68粉丝 114原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值