使用Socket实现HttpServer(三)
使用Socket实现HttpServer(三)
这一章继续对我们的服务器进行优化,引入 NIO
package com.fengsir.network.step4;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.*;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
import java.util.Set;
/**
* @Author FengZeng
* @Date 2022-01-24 15:49
* @Description TODO
*/
public class Step4Server {
ServerSocketChannel ssc;
public void listen(int port) throws IOException {
ssc = ServerSocketChannel.open();
ssc.bind(new InetSocketAddress(port));
// No blocking...
ssc.configureBlocking(false);
Selector selector = Selector.open();
ssc.register(selector, ssc.validOps());
ByteBuffer buffer = ByteBuffer.allocate(1024 * 16);
for (; ; ) {
// numOfSelector == selectedKeys.size(),必须执行 selector.select()
int numOfSelector = selector.select();
Set<SelectionKey> selectedKeys = selector.selectedKeys();
// 轮训当前所有的事件
for (SelectionKey key : selectedKeys) {
// 如果事件已就绪
if (key.isAcceptable()) {
SocketChannel channel = ssc.accept();
if (channel == null) {
continue;
}
// Kernel -> mmap(buffer) -> channel -> user(buffer)
channel.configureBlocking(false);
// 将事件注册为读就绪
channel.register(selector, SelectionKey.OP_READ);
// 读事件已就绪
} else if (key.isReadable()){
SocketChannel channel = (SocketChannel) key.channel();
// _ _ _ _ _ _ _
// P(position)
buffer.clear();
channel.read(buffer);
String request = new String(buffer.array());
System.out.println(request);
buffer.clear();
buffer.put("HTTP/1.1 200 ok\n\nHello NIO!".getBytes(StandardCharsets.UTF_8));
// HTTP/1.1 200 OK ... ! _ _ _
// P
// P
buffer.flip();
channel.write(buffer);
channel.close();
}
}
}
}
public static void main(String[] args) throws IOException {
Step4Server step4Server = new Step4Server();
step4Server.listen(8000);
}
}
NIO 翻译成 New IO ,是 JDK1.4 引入的一种新的 IO模型,传统的 IO 只能是阻塞的模型,而 NIO 可以实现非阻塞,也就是代码中的 ssc.configureBlocking(false);这一句,在前面实现的 Http Server 里面,当我们去调用 accept() 的时候,如果没有请求进来,线程是阻塞在这里的。
引入 NIO 最大的亮点就是:IO多路复用,IO多路复用的优势并不是对单个连接处理得更快,而是在于它能处理更多的连接。
使用Socket实现HttpServer(三)的更多相关文章
- Socket 学习(三).4 UDP 穿透 客户端与客户端连接
效果图: 使用方法: 先 修改WinClient\bin\Debug 下面的 ip.ini,写上 服务器 IP地址. 客户端 与 客户端 通讯 之前 ,点击发送打洞消息 按钮,然后过一会再发送消息 ...
- socket通信原理三次握手和四次握手详解
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP?2. Sock ...
- C#高性能大容量SOCKET并发(三):接收、发送
原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...
- Python 基础之socket编程(三)
python 基础之socket编程(三) 前面实现的基于socket通信只能实现什么呢?在tcp协议的通信中就是一个用户说一句,服务端给你回一句,你再给服务端说一句,服务端再给你回一句,就这样一直友 ...
- 使用Socket实现HttpServer(二)
使用Socket实现HttpServer(二) 前面我们使用 Socket 实现了一个简易的 HttpServer,接下来我们将对我们的服务器进行优化: 面向对象的封装 优化线程模型(引入多线程) R ...
- 使用Socket实现HttpServer(一)
使用Socket实现HttpServer(一) Socket 编程 socket 翻译过来叫插槽,一张图你就明白 socket 就插在 TCP 也就是传输层上,对用户的请求和服务器的响应进行处理. 下 ...
- Socket异步通信学习三
接下来是客户端部分,采用同步接收模式,在SocketClient项目中新建了一个SynServer类,用于存放socket服务器代码,和AsynServer类似,主要有4个方法: 有一个全局socke ...
- java Socket Tcp示例三则(服务端处理数据、上传文件)
示例一: package cn.itcast.net.p5.tcptest; import java.io.BufferedReader;import java.io.IOException;impo ...
- php中使用Curl、socket、file_get_contents三种方法POST提交数据
抓取远程内容,之前一直都在用file_get_content函数,其实早就知道有curl这么一个好东西的存在,但是看了一眼后感觉使用颇有些复杂,没有file_get_content那么简单,再就是需求 ...
随机推荐
- 微信小程序下滑时能实现加载更多数据
wxml代码: <view class="scroll"> <!-- 绑订页面上拉触底事件的处理函数onReachBottom事件 --> <scro ...
- MRS IoTDB时序数据库的总体架构设计与实现
MRS IoTDB时序数据库的总体架构设计与实现 MRS IoTDB是华为FusionInsight MRS大数据套件最新推出的时序数据库产品,其领先的设计理念在时序数据库领域展现出越来越强大的竞争力 ...
- 1、mysql数据库的数据目录结构
查看mysql的主要目录结构 通过命名查看mysql的目录结构:find / -name mysql 1.1数据库文件的存放路径 MySQL数据库文件的存放路径:/var/lib/mysql/ 1.2 ...
- Go 1.18 最强代码自测方法!
特别说明:这个真的不是标题党,我写代码20+年,真心认为 go fuzzing 是我见过的最牛逼的代码自测方法.我在用 AC自动机 算法改进关键字过滤效率(提升~50%),改进 mapreduce 对 ...
- Java子类继承父类的执行顺序
父类的静态代码块(static) 子类的静态代码块(static) 父类的非静态代码块(父类成员初始化) 父类的构造方法 子类的非静态代码块(子类成员初始化) 子类的构造方法
- MySQL基础_索引
MySQL 索引(入门): 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些 ...
- [Java编程思想] 第一章 对象导论
第一章 对象导论 "我们之所以将自然界分解,组织成各种概念,并按其含义分类,主要是因为我们是整个口语交流社会共同遵守的协定的参与者,这个协定以语言的形式固定下来--除非赞成这个协定中规定的有 ...
- Objects.equals有坑
前言 最近review别人代码的时候,发现有个同事,在某个业务场景下,使用Objects.equals方法判断两个值相等时,返回了跟预期不一致的结果,引起了我的兴趣. 原本以为判断结果会返回true的 ...
- 面试官:Zookeeper是什么,它有什么特性与使用场景?
哈喽!大家好,我是小奇,一位不靠谱的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 作为一名Java程序员,Zook ...
- Windows 7/8 64位系统 不能注册32位dll 文件的解决方案
这几天碰到一个问题,运行一个易语言开发的软件出现以下错误.我的系统是 Windows7 64 位 专业版.在系统盘 windows/system32 下查找 dm.dll.但是没有这个文件.于是我到 ...