专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

惊呆了!手写4个mini版的tomcat

  写在前面
  ApacheTomcat是JavaServlet,JavaServerPages(JSP),Java表达式语言和Java的WebSocket技术的一个开源实现,通常我们将Tomcat称为Web容器或者Servlet容器。
  今天,我们就来手写tomcat,但是说明一下:咱们不是为了装逼才来写tomcat,而是希望大家能更多的理解和掌握tomcat。
  废话不多说了,直接开干。基本结构tomcat架构图
  我们可以把上面这张架构图做简化,简化后为:
  什么是http协议
  Http是一种网络应用层协议,规定了浏览器与web服务器之间如何通信以及数据包的结构。
  通信大致可以分为四步:先建立连接。发送请求数据包。发送响应数据包。关闭连接。
  优点web服务器可以利用有限的连接为尽可能多的客户请求服务。tomcat中Servlet的运作方式在浏览器地址栏输入http:ip:portservletday01hello浏览器依据IP、port建立连接(即与web服务器之间建立网络连接)。浏览器需要将相关数据打包(即按照http协议要求,制作一个请求数据包,包含了一些数据,比如请求资源路径),并且将请求数据包发送出去。web服务器会将请求数据包中数据解析出来,并且将这些数据添加到request对象,同时,还会创建一个response对象。web服务器创建Servlet对象,然后调用该对象的service方法(会将request和response作为参数)。注:在service方法里面,通过使用request获得请求相关的数据,比如请求参数值,然后将处理结果写到response。web服务器将response中的数据取出来,制作响应数据包,然后发送给浏览器。浏览器解析响应数据包,然后展现。
  可以总结唯一张图:
  什么是Servlet呢?
  Servlet是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能,统一接口。由其他内部厂商如tomcat,jetty内部实现web的功能。如一个http请求到来:容器将请求封装为servlet中的HttpServletRequest对象,调用init(),service()等方法输出response,由容器包装为httpresponse返回给客户端的过程。
  什么是Servlet规范?从Jar包上来说,Servlet规范就是两个Jar文件。servletapi。jar和jspapi。jar,Jsp也是一种Servlet。从package上来说,就是javax。servlet和javax。servlet。http两个包。从接口来说,就是规范了Servlet接口、Filter接口、Listener接口、ServletRequest接口、ServletResponse接口等。类图如下:
  第一版:Socket版
  使用Socket编程,实现简单的客户端和服务端的聊天。
  服务端代码如下:packagecom。tian。v1;importjava。io。;importjava。net。;publicclassServer{publicstaticStringreadlinenull;publicstaticStringinTempnull;publicstaticStringturnLine;publicstaticfinalStringclient客户端:;publicstaticfinalStringserver服务端:;publicstaticfinalintPORT8090;publicstaticvoidmain(String〔〕args)throwsException{ServerSocketserverSocketnewServerSocket(PORT);System。out。println(服务端已经准备好了);SocketsocketserverSocket。accept();BufferedReadersystemInnewBufferedReader(newInputStreamReader(System。in));BufferedReadersocketInnewBufferedReader(newInputStreamReader(socket。getInputStream()));PrintWritersocketOutnewPrintWriter(socket。getOutputStream());while(true){inTempsocketIn。readLine();if(inTemp!nullinTemp。contains(over)){systemIn。close();socketIn。close();socketOut。close();socket。close();serverSocket。close();}System。out。println(clientinTemp);System。out。print(server);readlinesystemIn。readLine();socketOut。println(readline);socketOut。flush();}}}
  客户端代码如下:packagecom。tian。v1;importjava。io。;importjava。net。;publicclassClient{publicstaticvoidmain(String〔〕args)throwsException{Stringreadline;StringinTemp;finalStringclient客户端说:;finalStringserver服务端回复:;intport8090;byte〔〕ipAddressTemp{127,0,0,1};InetAddressipAddressInetAddress。getByAddress(ipAddressTemp);首先直接创建socket,端口号11023为系统保存,一般设在1023之外SocketsocketnewSocket(ipAddress,port);BufferedReadersystemInnewBufferedReader(newInputStreamReader(System。in));BufferedReadersocketInnewBufferedReader(newInputStreamReader(socket。getInputStream()));PrintWritersocketOutnewPrintWriter(socket。getOutputStream());while(true){System。out。print(client);readlinesystemIn。readLine();socketOut。println(readline);socketOut。flush();处理inTempsocketIn。readLine();if(inTemp!nullinTemp。contains(over)){systemIn。close();socketIn。close();socketOut。close();socket。close();}System。out。println(serverinTemp);}}}
  过程如下:
  ,时长00:44第二版:我们直接请求http:localhost:8090
  实现代码如下:packagecom。tian。v2;importjava。io。IOException;importjava。io。OutputStream;importjava。net。ServerSocket;importjava。net。Socket;publicclassMyTomcat{设定启动和监听端口privateintport8090;启动函数throwsIOExceptionpublicvoidstart()throwsIOException{System。out。println(mytomcatstarting。。。);StringresponseData6666666;ServerSocketsocketnewServerSocket(port);while(true){Socketacceptsocket。accept();OutputStreamoutputStreamaccept。getOutputStream();StringresponseTextHttpProtocolUtil。getHttpHeader200(responseData。length())responseData;outputStream。write(responseText。getBytes());accept。close();}}启动入口publicstaticvoidmain(String〔〕args)throwsIOException{MyTomcattomcatnewMyTomcat();tomcat。start();}}
  再写一个工具类,内容如下;ackagecom。tian。v2;publicclassHttpProtocolUtil{200状态码,头信息paramcontentLength响应信息长度return200headerinfopublicstaticStringgetHttpHeader200(longcontentLength){returnHTTP1。1200OKContentType:texthtmlContentLength:contentLengthr;}为响应码404提供请求头信息(此处也包含了数据内容)return404headerinfopublicstaticStringgetHttpHeader404(){Stringstr404h1404notfoundh1;returnHTTP1。1404NOTFoundContentType:texthtmlContentLength:str404。getBytes()。lengthrstr404;}}
  启动main方法:
  使用IDEA访问:
  在浏览器访问:
  自此,我们的第二版本搞定。下面继续第三个版本;第三版:封装请求信息和响应信息
  一个http协议的请求包含三部分:方法URI协议版本请求的头部主体内容
  比如POSTindex。htmlHTTP1。1Accept:textplain;texthtmlAcceptLanguage:engbConnection:KeepAliveHost:localhostUserAgent:Mozilla4。0(compatible;MSIE4。01;Windows98)ContentLength:33ContentType:applicationxwwwformurlencodedAcceptEncoding:gzip,deflatelastNametianfirstNameJohnTian
  简单的解释数据的第一行包括:方法、URI、协议和版本。在这个例子里,方法为POST,URI为index。html,协议为HTTP1。1,协议版本号为1。1。他们之间通过空格来分离。请求头部从第二行开始,使用英文冒号(:)来分离键和值。请求头部和主体内容之间通过空行来分离,例子中的请求体为表单数据。
  类似于http协议的请求,响应也包含三个部分。协议状态状态描述响应的头部主体内容
  比如:HTTP1。1200OKServer:MicrosoftIIS4。0Date:Mon,5Jan200413:13:33GMTContentType:texthtmlLastModified:Mon,5Jan200413:13:12GMTContentLength:112htmlheadtitleHTTPResponseExampletitleheadbodyWelcometoBrainySoftwarebodyhtml
  简单解释第一行,HTTP1。1200OK表示协议、状态和状态描述。之后表示响应头部。响应头部和主体内容之间使用空行来分离。
  代码实现
  创建一个工具类,用来获取静态资源信息。packagecom。tian。v3;importcom。tian。v2。HttpProtocolUtil;importjava。io。IOException;importjava。io。InputStream;importjava。io。OutputStream;提取了一些共用类和函数publicclassResourceUtil{根据请求url获取完整绝对路径publicstaticStringgetPath(Stringurl){StringpathResourceUtil。class。getResource()。getPath();returnpath。replaceAll(,)url;}输出静态资源信息publicstaticvoidoutputResource(InputStreaminput,OutputStreamoutput)throwsIOException{intcount0;while(count0){countinput。available();}intresourceSizecount;output。write(HttpProtocolUtil。getHttpHeader200(resourceSize)。getBytes());longwritten0;intbyteSize1024;byte〔〕bytesnewbyte〔byteSize〕;while(writtenresourceSize){if(writtenbyteSizeresourceSize){byteSize(int)(resourceSizewritten);bytesnewbyte〔byteSize〕;}input。read(bytes);output。write(bytes);output。flush();writtenbyteSize;}}}
  另外HttpProtocolUtil照样用第二版本中。
  再创建Request类,用来解析并存放请求相关参数。packagecom。tian。v3;importjava。io。IOException;importjava。io。InputStream;publicclassRequest{请求方式,eg:GET、POSTprivateStringmethod;请求路径,eg:index。htmlprivateStringurl;请求信息输入流
  示例preGETHTTP1。1Host:localhostConnection:keepalivePragma:nocacheCacheControl:nocacheUpgradeInsecureRequests:1UserAgent:Mozilla5。0(Macintosh;IntelMacOSX10156)AppleWebKit537。36(KHTML,likeGecko)Chrome85。0。4183。83Safari537。36preprivateInputStreaminputStream;publicRequest(){}publicRequest(InputStreaminputStream)throwsIOException{this。inputStreaminputStream;intcount0;while(count0){countinputStream。available();}byte〔〕bytesnewbyte〔count〕;inputStream。read(bytes);requestString参考:this。inputStream示例StringrequestStringnewString(bytes);按换行分隔String〔〕requestStringArrayrequestString。split(n);读取第一行数据,即:GETHTTP1。1StringfirstLinerequestStringArray〔0〕;遍历第一行数据按空格分隔String〔〕firstLineArrayfirstLine。split();this。methodfirstLineArray〔0〕;this。urlfirstLineArray〔1〕;}publicStringgetMethod(){returnmethod;}publicvoidsetMethod(Stringmethod){this。methodmethod;}publicStringgetUrl(){returnurl;}publicvoidsetUrl(Stringurl){this。urlurl;}publicInputStreamgetInputStream(){returninputStream;}publicvoidsetInputStream(InputStreaminputStream){this。inputStreaminputStream;}}
  把第二版的MyTomcat进行小小调整:packagecom。tian。v3;importjava。io。IOException;importjava。io。OutputStream;importjava。net。ServerSocket;importjava。net。Socket;publicclassMyTomcat{privatestaticfinalintPORT8090;publicvoidstart()throwsIOException{System。out。println(mytomcatstarting。。。);ServerSocketsocketnewServerSocket(PORT);while(true){Socketacceptsocket。accept();OutputStreamoutputStreamaccept。getOutputStream();分别封装Request和ResponseRequestrequestnewRequest(accept。getInputStream());ResponseresponsenewResponse(outputStream);根据request中的url,输出response。outputHtml(request。getUrl());accept。close();}}publicstaticvoidmain(String〔〕args)throwsIOException{MyTomcattomcatnewMyTomcat();tomcat。start();}}
  然后再创建一个index。html,内容很简单:!DOCTYPEhtmlhtmllangenheadmetacharsetUTF8titlehelloworldtitleheadbodyh2youalreadysucceed!h2bodyhtml
  这一需要注意,index。html文件的存放路径不放错了,视本地路径来定哈,放在classes文件夹下的。你可以debug试试,看看你应该放在那个目录下。
  启动MyTomcat。
  访问http:localhost:8090index。html
  自此,我们针对于Http请求参数和相应参数做了一个简单的解析以及封装。
  尽管其中还有很多问题,但是字少看起来有那点像样了。我们继续第四版,第四版:实现动态请求资源
  用过servlet的同学都知道,Servlet中有三个很重要的方法init、destroy、service。其中还记得我们自己写LoginServlet的时候,还会重写HttpServlet中的doGet()和doPost()方法。下面们就自己来搞一个:
  Servlet类代码如下:publicinterfaceServlet{voidinit()throwsException;voiddestroy()throwsException;voidservice(Requestrequest,Responseresponse)throwsException;}
  然后再写一个HttpServlet来实现Servlet。
  代码实现如下:packagecom。tian。v4;publicabstractclassHttpServletimplementsServlet{Overridepublicvoidinit()throwsException{}Overridepublicvoiddestroy()throwsException{}Overridepublicvoidservice(Requestrequest,Responseresponse)throwsException{Stringmethodrequest。getMethod();if(GET。equalsIgnoreCase(method)){doGet(request,response);}else{doPost(request,response);}}publicabstractvoiddoGet(Requestrequest,Responseresponse)throwsException;publicabstractvoiddoPost(Requestrequest,Responseresponse)throwsException;}
  下面我们就来写一个自己的Servlet,比如LoginServlet。packagecom。tian。v4;publicclassLoginServletextendsHttpServlet{OverridepublicvoiddoGet(Requestrequest,Responseresponse)throwsException{StringrepTexth1LoginServletbyGETmethodh1;response。output(HttpProtocolUtil。getHttpHeader200(repText。length())repText);}OverridepublicvoiddoPost(Requestrequest,Responseresponse)throwsException{StringrepTexth1LoginServletbyPOSTmethodh1;response。output(HttpProtocolUtil。getHttpHeader200(repText。length())repText);}Overridepublicvoidinit()throwsException{}Overridepublicvoiddestroy()throwsException{}}
  大家是否还记得,我们在学习Servlet的时候,在resources目录下面有个web。xml。我们这个版本也把这个xml文件给引入。lt;?xmlversion1。0encodingutf8?webappservletservletnameloginservletnameservletclasscom。tian。v4。LoginServletservletclassservletservletmappingservletnameloginservletnameurlpatternloginurlpatternservletmappingwebapp
  既然引入了xml文件,那我们就需要去读取这个xml文件,并解析器内容。所以这里我们需要引入两个jar包。dependenciesdependencygroupIddom4jgroupIddom4jartifactIdversion1。6。1versiondependencydependencygroupIdjaxengroupIdjaxenartifactIdversion1。1。6versiondependencydependencies
  万事俱备,只欠东风了。这时候我们来吧MyTomcat这个类做一些调整即可。
  下面有个很重要的initServlet()方法,刚刚是对应下面这张图中的Listservlets,但是我们代码里使用的是Map来存储Servlet的,意思就那么个意思,把Servlet放在集合里。
  这也就是为什么大家都把Tomcat叫做Servlet容器的原因,其实真正的容器还是java集合。packagecom。tian。v4;importcom。tian。v3。RequestV3;importcom。tian。v3。ResponseV3;importorg。dom4j。Document;importorg。dom4j。Element;importorg。dom4j。io。SAXReader;importjava。io。IOException;importjava。io。InputStream;importjava。io。OutputStream;importjava。net。ServerSocket;importjava。net。Socket;importjava。util。HashMap;importjava。util。List;importjava。util。Map;publicclassMyTomcat{设定启动和监听端口privatestaticfinalintPORT8090;存放Servlet信息,url:Servlet实例privateMapString,HttpServletservletMapnewHashMap();publicvoidstart()throwsException{System。out。println(mytomcatstarting。。。);initServlet();ServerSocketsocketnewServerSocket(PORT);while(true){Socketacceptsocket。accept();OutputStreamoutputStreamaccept。getOutputStream();分别封装RequestV3和ResponseV3RequestV4requestV3newRequestV4(accept。getInputStream());ResponseV4responseV3newResponseV4(outputStream);根据url来获取ServletHttpServlethttpServletservletMap。get(requestV3。getUrl());如果Servlet为空,说明是静态资源,不为空即为动态资源,需要执行Servlet里的方法if(httpServletnull){responseV3。outputHtml(requestV3。getUrl());}else{httpServlet。service(requestV3,responseV3);}accept。close();}}publicstaticvoidmain(String〔〕args)throwsException{MyTomcattomcatnewMyTomcat();tomcat。start();}解析web。xml文件,把url和servlet解析出来,并保存到一个java集合里(Map)publicvoidinitServlet()throwsException{InputStreamresourceAsStreamthis。getClass()。getClassLoader()。getResourceAsStream(web。xml);SAXReadersaxReadernewSAXReader();DocumentdocumentsaxReader。read(resourceAsStream);ElementrootElementdocument。getRootElement();ListElementlistrootElement。selectNodes(servlet);for(Elementelement:list){servletnameshowservletnameElementservletnameElement(Element)element。selectSingleNode(servletname);StringservletNameservletnameElement。getStringValue();servletclassserver。ShowServletservletclassElementservletclassElement(Element)element。selectSingleNode(servletclass);StringservletClassservletclassElement。getStringValue();根据servletname的值找到urlpatternElementservletMapping(Element)rootElement。selectSingleNode(webappservletmapping〔servletnameservletName〕);showStringurlPatternservletMapping。selectSingleNode(urlpattern)。getStringValue();servletMap。put(urlPattern,(HttpServlet)Class。forName(servletClass)。getDeclaredConstructor()。newInstance());}}}
  启动,再次访问http:localhost:8090index。html
  同时,我们可以访问http:localhost:8090login
  到此,第四个版本也搞定了。
  但是前面四个版本都有一个共同的问题,全部使用的是BIO。
  BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。
  所以,大家在网上看到的手写tomcat的,也有使用线程池来做的,这里希望大家能get到为什么使用线程池来实现。另外,其实在tomcat高版本中已经没有使用BIO了。
  而HTTP1。1默认使用的就是NIO了。
  但这个只是通信方式,重点是我们要理解和掌握tomcat的整体实现。总结
  另外,发现上面都是讲配置文件解析,并将对应数据保存起来。熟悉这个套路后,大家是不是想到,我们很多配置项都是在server。xml中,还记得否?也是可以通过解析某个目录下的server。xml文件,并把内容赋给java中相应的变量罢了。
  比如:
  1。server。xml中的端口配置,我们是在代码里写死的而已,改成MyTomcat启动的时候去解析并获取不久得了吗?
  2。我们通常是将我们项目的打成war,然后解压到某个目录下,最后还不是可以通过读取这个解压后的某个目录中找到web。xml,然后用回到上面的web。xml解析了。
  本文主要是分享如何从一个塑料版到黄金版、然后铂金版,最后到砖石版。可以把加入线程池的版本称之为星耀版,最后把相关server。xml解析,以及读取我们放入到tomcat中项目解析可以称之为王者版。

Ubuntutouch安装宝塔面板搭建网站写了两期关于Ubuntutouch的文章了,这也将是完结篇。因为找到了比手机搭建服务器更简单的方法。玩转旧手机红米刷入Linux(Ubuntutouch)系统详细教程这些手机都支持耳鸣在左侧还是在右侧?有什么区别?耳鸣是肝不好还是心不好?得看你是哪边耳鸣我接诊过许多生气后出现单侧耳鸣的患者,对于这类患者,我一开始就会问是哪边耳鸣,因为人的情绪和心还有肝这两个器官是密切相关的,想要治好这两耳鸣意有所指?本泽马晒自拍照,配文我不感兴趣今天早些时候,皇马球员本泽马更新了自己的Ins,晒出了一张自己留着浓郁胡子戴帽子的自拍照片,配文写道我不感兴趣。这条Ins发布后,引起了不少球迷的热议,有人认为本泽马此举是在回应他干货满满vivo欧阳伟峰讲述S16系列颜如玉背后的故事手机中国新闻12月22日,vivoS16系列新品将正式发布,目前官方已经开启预热,其中颜如玉的新配色成为了本次最大亮点。近日,vivo产品副总裁欧阳伟峰也给网友们讲述了vivoS1若中国把足球纳入高考,中国足球会变成什么样子?如果足球变成高考中的必考项目,中国足球会变成什么样子?高考对中国学生的重要程度不言而喻,那一场考试的结果代表着一个孩子过去十余年辛勤的成果。把足球单独这一项运动加入高考从现实层面来当代散文活着文王春华我又读完了一本书,是余华老师的活着。说来挺惭愧的,这本书是三十年前写就的,我现在才刚系统地读了一遍。余华老师是用平实的语言写的,用第一人称娓娓道来。掩卷沉思,我的心并无多大墨菲定律换位思考定律将心比心,换位思考我是未城朝雨,用文字表达我对生活的态度。己所不欲,勿施于人。曾经有位因不会与人交往而处处遭人白眼的年轻人,非常苦恼地去找智者,希望智者能告诉他与人交往的秘诀。结果,那智者只送了他4雪我会用余生的美还你的梦云衡微语散文诗总有些能见度,让我们浮想联翩总有些人让我们刻骨铭心,不只是雪的纷纷扬扬,就是雪的凝固后晶莹剔透,让有情人在一呼一吸里两眉冰霜两眼泪汪汪。倾听冬天的声音那一年小雪花给我再也牵不到你的手故乡往事二人生总会有些冥冥之中的不期而遇和错位的安排,让你得不可得,无可奈何。也许是缘该如此!许是在错的时间,遇到对的那个人,那刚刚燃起的一点烛火就黯然无声的熄灭。但,却在我心底却1499元OPPOK10,天玑8000MAX,5000毫安电池,8256GB说到千元机,就不得不提一嘴今年3月份发布的OPPOK10,该款手机搭载了天玑8000MAX处理器,与骁龙888不相上下,并采用台积电5nm制程工艺,使得其在软件上很抗打。目前在电商你想升级iOS16。2吗?有4部iPhone表现意外,但这2部暂时先等等iOS的系统体验,给苹果带来了不少忠实的粉丝。同时每次iOS的系统更新,也备受消费者的关注。苹果发布了全新的iOS16。2,这个系统版本对于电池的续航和性能表现,和上一个系统版本相
AI赛道娘子军!中科曙光国际综合保障团队荣获崂山区三八红旗集体称号鲁网3月17日讯近日,青岛市崂山区三八红旗手称号与崂山区三八红旗集体称号名单公布,中科曙光国际信息产业有限公司的综合保障组荣获三八红旗集体荣誉称号。作为中科曙光在青岛注册成立的全资Nature科学家开发了新的铌酸锂激光技术长三角G60激光联盟导读据悉,洛桑联邦理工学院(EPFL)和IBM的科学家开发了一种新型激光器,相关研究成果以UltrafasttunablelasersusinglithiumnTCL85Q10G和TCL85C11哪个好?导购人员力荐线下款,你很纠结吗?记住一句话线下导购首要原则,即优先向客户推荐提成高的产品TCLC11其实已经是比较老款的电视了,毕竟TCLC11G都在开卖了。不过今天之所以要说这个问题,主要是因为有朋友私信说自己王者荣耀都在讨论曜超标,为什么他的登场率还是这么低?哈喽,大家好,我是栗原游戏解说,每天都会带来不同的游戏资讯和攻略。前言最近,曜的机制超标这个话题争议非常大,大部分玩家都希望策划能适当的削弱,作为一个战士英雄,拥有坦克的身板确实有关于儿童青少年道路安全,你需要知道这些青少年道路安全在全球范围内,青少年道路交通安全问题一直是各国政府部门十分重视的健康问题,据世界卫生组织统计,道路交通伤害成为儿童青少年死亡的头号杀手。图片来源摄图网儿童青少年的身体女儿的叹息昨天吃饭的时候,女儿长长地叹气,我问她不开心吗,是不是学习压力太大了?她说不是。追问下去,她不好意思地笑我也想成为妈宝女!忽然汗颜,女儿是我的宝,但是我们已经好久没有正常沟通过了。知识屋识字篇王王者荣耀教育传承播报关于王,说文解字天下所归往也。董仲舒曰古之造文者,三画而连其中谓之王。三者,天地人也,而参通之者王也。孔子曰一贯三為王。凡王之属皆从王。古文王。李阳冰曰中画近上。王者,神秘的三星堆文化是否有外星文明造访地球呢?未解之谜令人遐想三星堆自1934年发现并开始大规模挖掘以来,三星堆总共被发掘面积不到2万平方米,而其遗址总占地面积却高达12平方公里!也就是说,我们几十年的考古工作才仅仅揭开了它神秘面纱的千分之二OPPO带头降价,ViVO紧随其后,这五款优质手机价格大跳水OPPO和ViVO作为国内有名的手机厂商之一,每年都会推出数十款机型,覆盖高中低档位,可供选择的手机有很多。如果你是OV手机的用户,眼下有四款优质手机值得考虑。vivoX80不得不演员梅婷的成名往事,以及他背后的三个男人前段时间,梅婷上了热搜,颠覆了大家对她的印象。20年前,不要和陌生人说话里的梅湘南,遭遇家暴,让人心疼了几十年。父母爱情里的安杰,知书达理贤良淑德,成了无数人理想中的伴侣。而在回来何为神经网络卷积层本文分享自华为云社区神经网络基础部件卷积层详解云社区华为云,作者嵌入式视觉。前言在全连接层构成的多层感知机网络中,我们要通过将图像数据展平成一维向量来送入模型,但这会忽略了每个图像
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网