手寫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(); } } }
相關推薦
手寫Tomcat:NIO實現方式
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
帶你手寫spring:IOC與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、和線性迴歸做一個簡單的對比 下圖就是一個簡單的線性迴歸例項,簡單一點就是一個線性方程表示 (就是用來描述自變數和因
python手寫bp神經網路實現人臉性別識別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建