使用Socket实现HttpServer(一)

Socket 编程

socket 翻译过来叫插槽,一张图你就明白

socket 就插在 TCP 也就是传输层上,对用户的请求和服务器的响应进行处理。

下面我使用 socket 实现一个简易的 HttpServer

package com.fengsir.network;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket; /**
* @Author FengZeng
* @Date 2022-01-24 11:45
* @Description HttpServer v1.0
*/
public class RawHttpServer {
public static void main(String[] args) throws IOException {
ServerSocket socketServer = new ServerSocket(8000); // 轮询 8000 端口的请求
while (true) {
// 如果有请求,通过 accept 拿到 socket
// 调用服务器的accept()进行阻塞(程序会在这等待,不会向下执行),当有请求进来才会打开阻塞并返回一个socket
Socket socket = socketServer.accept();
System.out.println("a socket created"); // 拿到 socket 的请求内容,也就是 inputStream,封装成 bufferedReader,方便读取
InputStream inputStream = socket.getInputStream();
BufferedReader bfReader = new BufferedReader(new InputStreamReader(inputStream)); // 按行读取,把内容放到 stringBuilder 中
StringBuilder requestBuilder = new StringBuilder();
String line = "";
while (!(line = bfReader.readLine()).isBlank()) {
requestBuilder.append(line);
}
// 打印请求内容
String request = requestBuilder.toString();
System.out.println(request); // 封装 response
BufferedWriter bfWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bfWriter.write("HTTP/1.1 200 ok\n\nHello world!\n");
// flush() 把响应立即返回回去
bfWriter.flush();
socket.close();
}
}
}

运行程序,我们直接访问 localhost:8000

可以看到我们在 socket 中写入的 Hello world! 已经返回了。

为了方便小伙伴理解,我画了一张 Http 服务器的处理流程。

使用Socket实现HttpServer(一)的更多相关文章

  1. 使用Socket实现HttpServer(三)

    使用Socket实现HttpServer(三) 这一章继续对我们的服务器进行优化,引入 NIO package com.fengsir.network.step4; import java.io.IO ...

  2. 使用Socket实现HttpServer(二)

    使用Socket实现HttpServer(二) 前面我们使用 Socket 实现了一个简易的 HttpServer,接下来我们将对我们的服务器进行优化: 面向对象的封装 优化线程模型(引入多线程) R ...

  3. Socket HttpListen

    HttpListener sSocket = new HttpListener(); sSocket.Prefixes.Add("http://127.0.0.1:8080/"); ...

  4. Socket.io详解

    socket.io是一个跨浏览器支持WebSocket的实时通讯的JS. http://socket.io/docs/ 由于HTTP是无状态的协议,要实现即时通讯非常困难.因为当对方发送一条消息时,服 ...

  5. Node.js高级编程读书笔记 - 4 构建Web应用程序

    Outline 5 构建Web应用程序 5.1 构建和使用HTTP中间件 5.2 用Express.js创建Web应用程序 5.3 使用Socket.IO创建通用的实时Web应用程序 5 构建Web应 ...

  6. tcpServer 浅显的发一代码

    接下来发出来的一段代码也是我从网上找的一个例子,具体的来源已经找不到了,跟作者说声抱歉 ,现在公司做机票,出于性能的原因,就重写一个底层的tcp请求(不是我写的) 下面测试的是个控制台应用程序 Htt ...

  7. HttpListener 实现web服务端

    1. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syste ...

  8. webserver

    1. 控制台,浏览器输入http://localhost:8080/ using System; using System.Collections; using System.IO; using Sy ...

  9. 简易非阻塞http服务器

    说明         需要理解阻塞和非阻塞的区别,特别要注意非阻塞和异步不是一个概念,这个很容易弄错.云盘里面netty的书会讲这几个方面的区别,nodejs深入浅出关于异步编程章节里面       ...

随机推荐

  1. phpstrom2019版永久破解

    前言 : 首先进入软件,如果软件需要激活才能进入,可以在idea.medeming.com/jets,中下载激活码,以方便进入 然后按照下面的步骤操作 1.下载补丁 链接:https://pan.ba ...

  2. 【漏洞复现】Paraluni 安全事件分析及复现

    Paraluni 被黑分析 前言 Paraluni (平行宇宙)是新加坡 Parallel Universe 基金会发布的一个 基于币安智能链的 DeFi 项目,更多相关内容见此处.在 2022 年 ...

  3. Three.js 火焰效果实现艾尔登法环动态logo 🔥

    声明:本文涉及图文和模型素材仅用于个人学习.研究和欣赏,请勿二次修改.非法传播.转载.出版.商用.及进行其他获利行为. 背景 <艾尔登法环>是最近比较火的一款游戏,观察可以发现它的 Log ...

  4. pycharm远程调试、开发(详细操作)

    如果仅是远程开发,新建 ssh Interpreter 并 apply tools -> deployment -> browser remote host 即可 1.服务器侧准备 准备调 ...

  5. [SHA2017](web) writeup

    [SHA2017](web) writeup Bon Appétit (100) 打开页面查看源代码,发现如下 自然而然想到php伪协议,有个坑,看不了index.php,只能看 .htaccess ...

  6. Go 语言 切片的使用(增删改查)

    Go 语言 切片的使用(增删改查) 引言Golang 的数组是固定长度,可以容纳相同数据类型的元素的集合.但是当长度固定了,在使用的时候肯定是会带来一些限制,比如说:申请的长度太大会浪费内存,太小又不 ...

  7. 使用 JWT 来保护你的 SpringBoot 应用

    关键词 写在前面 Spring Boot 创建Spring Boot应用 创建一个Web 应用 使用JWT保护你的Spring Boot应用 添加Spring Security 本文代码 关键词 Sp ...

  8. windows 访问 CentOS 的防火墙及其 网关开放

    1.防火墙开放端口 firewall-cmd --zone=public --add-port=8848/tcp --permanent firewall-cmd --list-ports 开放cen ...

  9. Java 中用到的线程调度算法是什么?

    计算机通常只有一个 CPU,在任意时刻只能执行一条机器指令,每个线程只有获得 CPU 的使用权才能执行指令.所谓多线程的并发运行,其实是指从宏观上看,各个线 程轮流获得 CPU 的使用权,分别执行各自 ...

  10. Mybatis是如何将sql执行结果封装为目标对象并返回的? 都有哪些映射形式?

    第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映 射关系. 第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名. 有了列名与属性名的映射关系后,M ...