1. 程式人生 > >手寫Tomcat:NIO實現方式

手寫Tomcat:NIO實現方式

 


import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;

public class NIOServer {
	private Selector selector;
	
	public void init() throws IOException {
		//建立一個選擇器
		selector = Selector.open();
		//建立一個ServerSocketChanel
		ServerSocketChannel channel = ServerSocketChannel.open();
		//設定非阻塞
		channel.configureBlocking(false);
		//開啟一個ServerSocket
		ServerSocket serverSocket = channel.socket();
		//地址
		InetSocketAddress address = new InetSocketAddress(8080);
		//繫結
		serverSocket.bind(address);
		//註冊事件
		channel.register(this.selector, SelectionKey.OP_ACCEPT);
	}
	
	public void start() throws IOException {
		while(true) {
			this.selector.select();
			Iterator<SelectionKey> iterator = this.selector.selectedKeys().iterator();
			while(iterator.hasNext()) {
				SelectionKey key = iterator.next();
				iterator.remove();
				if(key.isAcceptable()) {
					//這個請求是客戶端的連線請求事件
					accept(key);
				} else if(key.isReadable()) {
					//如果這個請求是讀事件
					read(key);
				}
			}
		}
	}
	
	private void accept(SelectionKey key) throws IOException {
		//事件中傳過來的,key我們把這個通道拿到
		ServerSocketChannel serverSocketChannel = (ServerSocketChannel) key.channel();
		SocketChannel channel = serverSocketChannel.accept();
		//把這個設定為非阻塞
		channel.configureBlocking(false);
		//註冊讀事件
		channel.register(selector, SelectionKey.OP_READ);
	}
	
	private void read(SelectionKey key) throws IOException {
		//建立一個緩衝區
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		SocketChannel channel = (SocketChannel)key.channel();
		//我們把通道的資料填入緩衝區
		channel.read(buffer);
		String request = new String(buffer.array()).trim();
		System.out.println("客戶端的請求內容" + request);
		//把我們的html內容返回給客戶端
		
		String outString = "HTTP/1.1 200 OK\n"
				+"Content-Type:text/html; charset=UTF-8\n\n"
				+"<html>\n"
					+"<head>\n"
						+"<title>first page</title>\n"
					+"</head>\n"
					+"<body>\n"
						+"hello fomcat\n"
					+"</body>\n"
				+"</html>";
		
		ByteBuffer outbuffer = ByteBuffer.wrap(outString.getBytes());
		channel.write(outbuffer);
		channel.close();
	}
	
	public static void main(String[] args) {
		NIOServer server = new NIOServer();
		try {
			server.init();
			server.start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

相關推薦

TomcatNIO實現方式

  import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java

TF之RNN(TF自帶函式下載MNIST55000訓練集圖片)基於順序的RNN分類案例數字圖片識別實現高精度99%準確率

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('MNIST_data', one_hot

帶你springIOC與DI

前言 依稀記得在2016年剛畢業的時候,在京面試某公司的時候技術總監和我聊到了spring,我比較欣賞一個音樂人Rod Johnson以一人之力造就了spring。當時的個人水平僅僅是知道spring,會簡單使用。當面試官問到我對原始碼的閱讀時,問我大概多久的時間能吃懂spring原始碼,我給了一個答案是1

tomcat+servlet

寫程式一定要有思路,思路很重要! 一、我們分兩步第一步先實現手寫tomcat,第二部寫servlet  所用技術:   1、soket通訊 IO流   2、http請求與相應    3、解析xml   4、java反

基於KNN分類演算法數字識別的實現(二)——構建KD樹

上一篇已經簡單粗暴的建立了一個KNN模型對手寫圖片進行了識別,所以本篇文章採用構造KD樹的方法實現手寫數字的識別。 (一)構造KD樹 構造KD樹的基本原理網上都有介紹,所以廢話不多說,直接上程式碼。 #Knn KD_Tree演算法 import math from

教你如何使用Java一個基於陣列實現的佇列

  一、概述   佇列,又稱為佇列(queue),是先進先出(FIFO, First-In-First-Out)的線性表。在具體應用中通常用連結串列或者陣列來實現。佇列只允許在後端(稱為rear)進行插入操作,在前端(稱為front)進行刪除操作。佇列的操作方式和堆疊類似,唯一的區別在於佇列只允許新資料在後端

Tomcat(ServerSocket、HTTP協議)

Tomcat本質上就一個請求+響應請求的JAVA程式,當我們從瀏覽器輸入一個url時,我們將傳送請求到Tomcat上,tomcat對該請求進行解析,並將響應的內容返回瀏覽器。 Tomcat通過Socket+HTTP協議進行實現,這裡做了一個簡單的流程圖。 下面簡單介紹下HTTP協議:

跨站請求資料jsonp原生js程式碼實現

JSONP --來自百度百科JSONP(JSON with Padding)是JSON的一種“使用模式”,可用於解決主流瀏覽器的跨域資料訪問的問題。由於同源策略,一般來說位於 server1.example.com 的網頁無法與不是 server1.example.com的伺

IO // NIO 實現方式比較

69、Java 中有幾種型別的流? 答:位元組流,字元流。位元組流繼承於InputStream、OutputStream,字元流繼承於Reader、Writer。在java.io 包中還有許多其他的流,主要是為了提高效能和使用方便。 補充:關於Java的IO需要注意的

Android 電子簽名,簽名案列實現方法,並上傳網頁顯示(base64)!

最近說專案可能會用到一個電子簽名,不需要識別的那種,只是一個單純手寫簽名,然後以base64的格式提供給前端web頁面。其實挺簡單的,自定義一個手寫view就上線了。Android 電子簽名,手寫簽名案列實現方法! 先上圖: 按鈕說明:第一個按鈕是清除手寫板,第二個是將手寫板的

spring框架,實現簡單的ioc功能

 最近重新鞏固了基礎, 把spring框架重新學習了一遍。現在用自己的理解將spring框架寫一遍。這次先簡單實現,以後會慢慢拓展,暫時定的計劃是spirngmvc和mybatis的整合。整體思路是使用dom4j解析xml檔案,然後反射注入到Person類中。簡單明瞭,不做過

機器學習與資料探勘-logistic迴歸及識別例項的實現

本文主要介紹logistic迴歸相關知識點和一個手寫識別的例子實現 一、logistic迴歸介紹: logistic迴歸演算法很簡單,這裡簡單介紹一下: 1、和線性迴歸做一個簡單的對比 下圖就是一個簡單的線性迴歸例項,簡單一點就是一個線性方程表示 (就是用來描述自變數和因

pythonbp神經網路實現人臉性別識別1.0

寫在前面:本實驗用到的圖片均來自google圖片,侵刪! 實驗介紹 用python手寫一個簡單bp神經網路,實現人臉的性別識別。由於本人的機器配置比較差,所以無法使用網上很紅的人臉大資料資料集(如lfw資料集等等),所以我從google圖片下載了一些

C++面試中經常會讓String類的實現

主要是完成String類的建構函式、拷貝建構函式、賦值建構函式和解構函式。這個類中包括了指標類成員變數m_data,當類中包括指標類成員變數時,一定要過載建構函式、賦值函式、解構函式; 下面是具體的實

基於感知機的數字識別java實現

多層感知機的手寫數字識別,迭代10次對訓練集的正確率97 Main函式,在繪製完數字後,要點下確定按鈕再去識別,重繪按鈕自然是再次繪圖    訓練自己的網路結構會替換之前訓練的網路結構,沒有寫儲存或者另存新網路模型。結果對訓練集變現很好,對繪圖的識別結果仍不

多執行緒的讀鎖分離的實現方式

在我們一般的操作中,難免會遇到讀和寫的操作,但是如果多個執行緒去讀的話它是可以並行去讀的,因為共享資料沒有發生什麼改變, 如果多個執行緒讀寫的話那就會很麻煩,或者一個執行緒讀著一個執行緒正在寫,這樣資料也可能不正確, read  read 並行化 yes read  wr

Deep Learning-TensorFlow (1) CNN卷積神經網路_MNIST數字識別程式碼實現詳解

import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import time # 計算開始時間   start = time.clock()

通過反編譯的方式分析阿里淘小蜜的實現方式

為什麼要分析手淘的小蜜 因為可能需要做一款類似的產品. 如何分析 反編譯手淘 檢視UI佈局 分析步驟 1. 反編譯手淘檢視反編譯後的原始碼分析實現框架 2. 反編譯資原始檔檢視資源資訊(沒有得逞) 3.

神經網路 識別例子 matlab實現

Model representation 作為例子模型,神經網路有三層,一個輸入層,一個隱藏層和一個輸出層。 在手寫數字識別中,輸入是20*20的圖片畫素值,因此輸入層除偏差單元1外,有400個單元。 第二層有25個單元;輸出層有10單元,對

SpringBoot框架之註解方式啟動SpringMVC容器

使用Java語言建立Tomcat容器,並且通過Tomcat執行Servlet,接下來,將會使用Java語言在SpringBoot建