使用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那么简单,再就是需求 ...
随机推荐
- 小程序WXS 模块
WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构 WXS中定义的函数可以在wxml文件中使用,可以用它来当过滤器使用 WXS以.wxs扩展名结尾,文件中 ...
- mysql全量备份与增量备份
mysql全量备份与增量备份 1.全量备份 全量备份就是把数据库中所有的数据进行备份. 备份所有库: mysqldump -uroot -p456 -S /data/3306/mysql.sock ...
- vue-cli实现异步请求返回mock模拟数据
在前后端分离开发的过程中,前端开发过程中,页面的数据显示一般都是写死的静态数据,也就是没有经过接口,直接写死在代码中的,在后端给出接口后,再替换为接口数据,为了减少对接成本,mock就出现了.通过预先 ...
- 【1024打卡】C++字符串的输出((c语言风格)
c++字符串输出(c语言风格) 文章目录 c++字符串输出(c语言风格) 杂记 代码 杂记 今天程序设计竞赛白给了,果然还是太弱了,y总带带我TAT ┭┮﹏┭┮1024快乐 代码 c语言学习 #inc ...
- Java实例变量、局部变量、静态变量
实例变量(成员变量) 成员变量定义在类中,在整个类中都可以被访问,但在方法.构造方法和语句块之外 当一个对象被实例化之后,每个实例变量的值就跟着确定 实例变量在对象创建的时候创建,在对象被销毁时销毁 ...
- Vmware安装Ubuntu16.4的过程及出现问题的解决
镜像下载.域名解析.时间同步请点击 阿里云开源镜像站 1.下载Ubuntu镜像文件 Ubuntu16.4镜像文件下载地址:https://mirrors.aliyun.com/ubuntu-relea ...
- # kubernetes节点不可调度
查看node [root@k8s-masterb ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-mastera Ready maste ...
- vim设置自动添加头部注释
#自己改了改vim开头文件,如下图# 友友们可以直接修改·SetTitle() if v:lang =~ "utf8$" || v:lang =~ "UTF-8$&quo ...
- P3956 [NOIP2017 普及组] 棋盘
P3956 [NOIP2017 普及组] 棋盘 题目 题目描述 有一个 m×m 的棋盘,棋盘上每一个格子可能是红色.黄色或没有任何颜色的.你现在要从棋盘的最左上角走到棋盘的最右下角. 任何一个时刻,你 ...
- Mybatis入门实例解析
写在前面:本文全程根据Mybatis官网进行入门讲解.毫无疑问,官方文档是学习这门技术最权威的资料,与此同时我们也知道官方文档对待入门小白基本上不太友好,没有入门demo.开篇就是小白们不懂的内容.有 ...