使用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那么简单,再就是需求 ...
随机推荐
- ArcMap操作随记(11)
1.直方图 在[Spatial Analyst]工具条中 2.分辨率变换 [重采样] :①最近邻法 ②双线性 ③三次卷积 重采样过程中要注意Nodata值 3.用ArcGIS进行监督分类 [影像分类] ...
- 基于python 实现KNN 算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/11/7 14:50 # @Author : gylhaut # @Site ...
- 防止入侵 两步修改XP远程管理默认端口
自Windows 2000开始,微软就提供一项终端服务(Terminal Server)这项服务可以将远程的桌面传递到本地.通过该服务,可视化的远程管理可以非常方便的实现.继Windows 2000之 ...
- [C++] C++socket套接字网络通讯实例
//服务器端:#include "winsock2.h" #include <string>#pragma comment(lib, "ws2_32.lib ...
- 算法 | Java 常见排序算法(纯代码)
目录 汇总 1. 冒泡排序 2. 选择排序 3. 插入排序 4. 快速排序 5. 归并排序 6. 希尔排序 6.1 希尔-冒泡排序(慢) 6.2 希尔-插入排序(快) 7. 堆排序 8. 计数排序 9 ...
- NoSQL:Redis缓存、雪崩、击穿、穿透
Redis介绍 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库 ...
- DDOS攻击应用
0x01 环境 包含3台主机 attact 作为攻击方,使用Centos7.2,安装slowhttptest server 作为被攻击服务器,安装有apached windows,用于访问 serve ...
- struts-032利用工具 PythonGUI
# -*- coding: utf-8 -*- import requests from Tkinter import * class App: def __init__(self, master): ...
- JavaScript 函数 (一 JavaScript 函数的声明与使用)
函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. JavaScript 函数的声明与使用 实例 <!DOCTYPE html> <html> <head> ...
- 恢复训练(学不动了摸会鱼) Pt. 1
本来下午想把pre稿子写了,咕咕咕. 群论是啥也不会了,写个polya试试(手动doge)为什么博客媛没有emoji,以后万一自己搭博客一定要加上这个小东西 polya淼题:poj1286 先复吸一下 ...