1.ãtcpãå
³äºtcp socketåºç°çâconnection reset by peerâåâbroken pipeâ
2.å端,å端,åµå
¥å¼ï¼
3.Java程序员必备基础:JDK 5-15都有哪些经典新特性
4.JDK基础概念及目录结构
5.APP测试练手笔记(1)代码保护与应用配置
6.Netty源码探究1:事件驱动原理
ãtcpãå ³äºtcp socketåºç°çâconnection reset by peerâåâbroken pipeâ
å¨socketéä¿¡è¿ç¨ä¸ï¼ç»å¸¸åç°å®¢æ·ç«¯æè æå¡å¨çæ¥å¿ä¸åºç°âbroken pipeâæè âconnection reset by peerâçé误æ示ã
以åä¸ç´ä»¥ä¸ºèªå·±ç解äºè¿ä¸¤ä¸ªé误å¼å¸¸æ示æå å«çæä¹ï¼èå®é ç解å®å ¨é误ã
æçé误ç解åä¸é¢è¿æ®µæ¥èªblogspotç表述差ä¸å¤ï¼
```
Maybe I'm just dumb, but I always thought "broken pipe" meant, "the other end of this socket closed before I finished sending something" and "connection reset by peer" meant, well, roughly the same thing. (As well as indicating some slightly more esoteric problems.)
Turns out though, "broken pipe" actually means "I just tried to send something and the socket was already closed to sending."
So in the following example, if the other end of (TCP) socket "sock" closes or dies before the write method, "connection reset by peer" will be raised. The next write will give a broken-pipe error, since the socket now knows that further sending is invalid.
```
```
try:
sock.write('foo')
except:
pass # connection reset by peer
sock.write('bar') # broken pipe
```
RSTçæ å¿ä½ï¼è¿ä¸ªæ è¯ä¸ºå¨å¦ä¸å ç§æ åµä¸ä¼è¢«è®¾ç½®ï¼ä»¥ä¸æ¯æäºè§£çæ åµï¼å¯è½è¿ææ´å¤çåºæ¯ï¼æ²¡æéªè¯ï¼
1. å½å°è¯åæªå¼æ¾çæå¡å¨ç«¯å£å»ºç«tcpè¿æ¥æ¶ï¼æå¡å¨tcpå°ä¼ç´æ¥å客æ·ç«¯åéresetæ¥æ
2. åæ¹ä¹åå·²ç»æ£å¸¸å»ºç«äºéä¿¡ééï¼ä¹å¯è½è¿è¡è¿äºäº¤äºï¼å½æä¸æ¹å¨äº¤äºçè¿ç¨ä¸åçäºå¼å¸¸ï¼å¦å´©æºçï¼å¼å¸¸çä¸æ¹ä¼å对端åéresetæ¥æï¼éç¥å¯¹æ¹å°è¿æ¥å ³é
3. å½æ¶å°TCPæ¥æï¼ä½æ¯åç°è¯¥æ¥æä¸æ¯å·²å»ºç«çTCPè¿æ¥å表å¯å¤ççï¼åå ¶ç´æ¥å对端åéresetæ¥æ
4. ackæ¥æ丢失ï¼å¹¶ä¸è¶ åºä¸å®çéä¼ æ¬¡æ°ææ¶é´åï¼ä¼ä¸»å¨å对端åéresetæ¥æéæ¾è¯¥TCPè¿æ¥
å ¶å®æ们javaå¼å¸¸éçå°çBroken pipeæè Connection reset by peerä¿¡æ¯ä¸æ¯jdkæè jvméå®ä¹çï¼æçå°è¿äºå ³é®åå¾å¾ä¼é¦å æç´¢ä¸jdkæè hotspotæºç æ¾å°ä½ç½®è¿è¡ä¸ä¸æåæï¼ä½æ¯æ²¡æ¾å°ï¼åé¢ææ³å°åºè¯¥æ¯Linuxæè glibcéå®ä¹çï¼æç¶å¨glibcéçå°äºå¦ä¸çæè¿°åå®ä¹ã
对äºBroken pipeå¨ç®¡éçå¦å¤ä¸ç«¯æ²¡æè¿ç¨å¨è¯»çæ¶åå°±ä¼æåºæ¤å¼å¸¸ï¼Connection reset by peerçæè¿°å ¶å®ä¸æ¯å¾æ£ç¡®ï¼ä»æçå®è·µæ¥çåªæè¿°äºä¸æ¹é¢ï¼å ¶å®å¨æä¸ç«¯æ£å¸¸closeä¹åï¼ä¹æ¯å¯è½ä¼ææ¤å¼å¸¸çã
connection reset by peerâåâbroken pipeâåºç°çåºæ¯ï¼
1ï¼å¾ä¸ä¸ªå¯¹ç«¯å·²ç»closeçééåæ°æ®çæ¶åï¼å¯¹æ¹çtcpä¼æ¶å°è¿ä¸ªæ¥æï¼å¹¶ä¸åé¦ä¸ä¸ªresetæ¥æãå½æ¶å°resetæ¥æçæ¶åï¼ç»§ç»åselect读æ°æ®çæ¶åå°±ä¼æåºConnect reset by peerçå¼å¸¸ï¼ã
2ï¼å½ç¬¬ä¸æ¬¡å¾ä¸ä¸ªå¯¹ç«¯å·²ç»closeçééåæ°æ®çæ¶åä¼åä¸é¢çæ åµä¸æ ·ï¼ä¼æ¶å°resetæ¥æãå½å次å¾è¿ä¸ªsocketåæ°æ®çæ¶åï¼å°±ä¼æåºBroken pipeäº ãæ ¹æ®tcpç约å®ï¼å½æ¶å°resetå çæ¶åï¼ä¸å±å¿ é¡»è¦ååºå¤çï¼è°ç¨å°socketæ件æ述符è¿è¡å ³éï¼å ¶å®ä¹æå³çpipeä¼å ³éï¼å æ¤ä¼æåºè¿ä¸ªé¡¾åæä¹çå¼å¸¸ã
ä»tcpåçè§åº¦ç解Broken pipeåConnection Reset by Peerçåºå«
/blog////tcp-broken-pipe
å ³äºtcp socketåºç°çâconnection reset by peerâåâbroken pipeâ
////%E5%%B3%E4%BA%8Etcp-socket%E5%%BA%E7%8E%B0%E7%9A%connection-reset-by-peer%E5%%8Cbroken-pipe
å端,å端,åµå ¥å¼ï¼
硬件å端å¼åå硬件å端å¼ååªä¸ªå·¥èµé«åµå ¥å¼å¼åå硬件å端å¼åæ¯ä¸åäºåï¼ï¼?
åµå ¥å¼å¼åå硬件å软件å¼åï¼å ¶ä¸ç¡¬ä»¶å软件éé¢è¿è¦ç»åï¼å¾å¤å²ä½åé¢åã说å°åªä¸ªå·¥èµé«ï¼ä¸å¥½è¯´ï¼è¿åä¸åå°åï¼ä¸åå²ä½åä¸åæ°´å¹³æå ³ç³»ï¼æ以ä¸è½ä¸æ¦è论ã建议æ 论åå°åªä¸ªé¢åï¼å å¦å¥½å说ï¼ä¸è¦å¤ªå¨ä¹å·¥èµã
软件å¼åï¼å端å¼åï¼åå端å¼åï¼åªä¸ªæ´ç´¯ï¼åªä¸ªæ´æ£é±ï¼è°¢è°¢æç¹
é¦å ï¼è½¯ä»¶å¼åå ä¹å æ¬äºä¸åï¼ä¸ä» å æ¬å端å端è¿å æ¬åµå ¥å¼é½æ¯è½¯ä»¶å¼åã
å端å¼åè·å端å¼åï¼é½å¾ç´¯ï¼å ¨ç个人ã
å端ç®åæ´èµé±ï¼å 为å端æ£å¨èé£å ¶ä»æ¡é¢é¢åç份é¢ï¼å 为å端ç°å¨ä»»ä½çé¢é½å¯ä»¥è·ï¼LinuxãWinãMacãAndriodãiPhoneï¼ï¼è¿äºé¢åçä»·å¼æ£å¨è¢«è½¬ç§»å°å端ï¼ç¹æç½é¡µå端ï¼ï¼ä¹å°±æ¯è¯´ç®åå端æ¯è½åäºæ æå¤çï¼è³å°æ¯çä¸å»ã
å¾é«çº§ææ¯è®²ï¼å端ä¼æ¯å端è¦é¾ï¼ä¹è¦æ´ç´¯ï¼å·¥èµä¹æ´é«ã
æ以ï¼ç论ä¸ï¼å级ç¨åºåå端工èµé«ï¼é«çº§ç¨åºåå端工èµé«ã
ä½æ¯ï¼å®é ä¸ï¼å级æä¼åååï¼é«çº§ç¨åºåå¥é½è¦ã
å¦javaåºæ¥åï¼åå端è¿æ¯å端好ï¼ä»ææ¯æ¬èº«æ¥è¯´ï¼javaæ¬èº«ä¼ååå端ä¸äºï¼å¦æä½ å¯¹å端æå ´è¶£çè¯ï¼ånode.jsãbootstrapãvue.jsççå端æ¡æ¶çä¸èªå·±æ没æææ¡ï¼ç°å¨ä¸æ¯æç¹Html+cssæè è½åç¹ajaxå°±å¯ä»¥åå端äºãå½ç¶ï¼åå端çè¯ï¼é¤æ¤ä»¥å¤ï¼å¯¹ç½ç«çé è²ã页é¢çå¸å±ï¼å æ¬ä¸äºå®¡ç¾ççè¿æ¯æç¹å°è¦æ±çï¼å¦æä½ è½è¾¾å°çè¯ï¼ä½ å¯ä»¥å°è¯å»åå端ã
å°±ç®åæ¥è¯´ï¼éçåå端å离ï¼å端åå端çèªèµå¾ éè¿åå¿é½å·®ä¸å¤äºãéæ©å端è¿æ¯å端å¾å¤æ¶åç个人ææ¿å§ï¼æè æ¯è§å¾èªå·±å端强ç¹å¿è¿æ¯å端强ç¹å¿ï¼ä¸è¿ï¼ä»ä¸ªäººå»ºè®®ä¸æ¥è¯´è¿æ¯å端ä¼æ´å¥½äºï¼å 为å端ç¸å¯¹æ¥è¯´æ¯è¾ç®åï¼åäºä¸æ®µæ¶é´çå端è¿å¯ä»¥è½¬å»åå端ãå¦å¤çè¯ï¼å°±æ¯å¾å¤æ¶åå 个项ç®å¯ä»¥ç¨åä¸å¥å端æ¡æ¶ï¼éè¦çè¯æ¹æ¹å°±å¥½ï¼é¤é对å端è¦æ±è¾é«ï¼ä¸ä¸ªé¡¹ç®ä¸å¥å端ï¼ä¸è¬åè¿ç§æ åµè¿æ¯æ¯è¾å°çã
å¦ç¼ç¨è½åä»ä¹å·¥ä½ï¼çä½ å¦åªæ¹é¢çï¼å¦ç¼ç¨å¯ä»¥åå端å¼åï¼å端å¼åï¼åµå ¥å¼å¼åï¼è¿æè¿ç»´çå·¥ä½ï¼åå端è¦å¦htmlãcssãjsåpsï¼å端çè¯è¿è¦å¤å¦ä¸é¨å端è¯è¨javaãpythonçï¼è¿ç»´å¦linuxãshellçã
ç½é¡µè®¾è®¡å端åå端çåºå«ï¼è¶è¯¦ç»è¶å¥½ã详ç»ç解éä¸ä¸webåå端çåºå«
1ã
åå°ï¼åç°ç»ç¨æ·çè§è§ååºæ¬çæä½ã
åå°ï¼ç¨æ·æµè§ç½é¡µæ¶ï¼æ们çä¸è§çåå°æ°æ®è·å¨ãåå°å æ¬å端ãå端ã
å端ï¼å¯¹åºæ们åçhtmlãcssãjavascriptçç½é¡µè¯è¨ä½ç¨å¨å端ç½é¡µã
å端ï¼å¯¹åºjspãjavaBeanãdaoå±ãactionå±åserviceå±çä¸å¡é»è¾ä»£ç ãï¼å æ¬æ°æ®åºï¼
为ä»ä¹jspæ¯å端å¢ï¼ä¸»è¦æ¯jspçè¿è¡åçæ¯å¨tomcatæå¡å¨è¿è¡çã
2ã
(1)javawebæ¯javaå¼åä¸çä¸ä¸ªæ¹åjavaææå®åçï¼æwebçï¼æåµå ¥å¼ççãjavawebå°±æ¯ææwebæ¹åçï¼javawebå两åï¼ä¸åæ¯æå¡å¨ç«¯å«å端ï¼å¦ä¸åå«å端ï¼ä¹å°±æ¯webå端ãå端就æ¯ç¨æ·è½çå°çé¨åï¼æ¯å¦æ·å®ç½ï¼qq空é´ï¼ç½é¡µä¸ä½ è½çå°çé½æ¯webå端åçãå端åçå°±æ¯ä¸ºå端çå±ç¤ºä¸å¡é»è¾åè½åå¤çã
(2)javawebå æ¬äºjspï¼servelt以åä¸äºæ¡æ¶æ¯å¦springï¼structs以åä¸æ°æ®åºäº¤äºçç¥è¯ï¼å½ç¶ä¹æ¶åå°äºhtmlï¼cssçå端ææ¯ï¼ä½æ¯æ´ä¾§éäºå端çå¼åãwebå端主è¦æ¯htmlï¼cssï¼javascriptä¹ç±»çææ¯ã
jawebæ¯javaeeçä¸ä¸ªæ¹åï¼Javawebï¼ç±å端ãJava代ç ãåæ°æ®åºä¸ä¸ªå¤§æ¹é¢ç»æï¼å端åªæ¯å ¶ä¸ä¹ä¸ã
(3)å¨æ们çæºåä¸çå°ççé¢ï¼å®è£ çç¨åºï¼ç»ç¨æ·ççï¼æä½çå°±æ¯å端ï¼èä½ çä¸å°çï¼å¸®ä½ ä¿åç½ç»æ¸¸ææ°æ®ï¼ä¿ååºç¨æ°æ®ï¼å¤çæ°æ®çå°±æ¯å端ï¼æå¡å¨ï¼ãæ¯å¦è¯´ï¼æ们å¨ç¨çç¥ä¹å°±æ¯å端ï¼èä¿åè¿ä¸ªé®é¢ï¼è¿ææè¿ä¸ªé®é¢æ¨éç»ä½ çå°±æ¯å端ã
äºãå®ä¹ä¸å
ä¸è¬æ¥è¯´ï¼æ们å°ç½ç«å为å端åå端ãå端主è¦è´è´£é¡µé¢çå±ç¤ºï¼å端åæ¯ä¸å¡é»è¾çå®ç°ã
1ãWebå端:
顾åæä¹æ¯æ¥åWebçå端çãè¿éæ说çå端æ³æWebå端ï¼ä¹å°±æ¯å¨Webåºç¨ä¸ç¨æ·å¯ä»¥çå¾è§ç¢°å¾ççä¸è¥¿ãå æ¬Web页é¢çç»æãWebçå¤è§è§è§è¡¨ç°ä»¥åWebå±é¢ç交äºå®ç°ã
2ãWebå端ï¼
å端æ´å¤çæ¯ä¸æ°æ®åºè¿è¡äº¤äºä»¥å¤çç¸åºçä¸å¡é»è¾ãéè¦èèçæ¯å¦ä½å®ç°åè½ãæ°æ®çååãå¹³å°ç稳å®æ§ä¸æ§è½çã
ä¸ãéè¦ææ¡çææ¯ä¸å
1ãWebå端ï¼
ç²¾éJSï¼è½çç»åºç¨JQueryï¼æCSSï¼è½çç»è¿ç¨è¿äºç¥è¯ï¼è¿è¡äº¤äºææçå¼åã
(1)ç²¾éHTMLï¼è½å¤ä¹¦åè¯ä¹åçï¼ç»ææ¸ æ°ï¼æç»´æ¤çHTMLç»æï¼
(2)ç²¾éCSSï¼è½å¤è¿åè§è§è®¾è®¡ï¼å¹¶å ¼å®¹ä¸çæ¿è®¤ç主æµæµè§å¨ï¼
(3)çæJavaScriptï¼äºè§£ECMAScriptåºç¡å 容ï¼ææ¡1-2ç§jsæ¡æ¶ï¼å¦JQueryï¼
(4)对常è§çæµè§å¨å ¼å®¹é®é¢ææ¸ æ°çç解ï¼å¹¶æå¯é ç解å³æ¹æ¡ï¼
(5)对æ§è½æä¸å®çè¦æ±ï¼äºè§£yahooçæ§è½ä¼å建议ï¼å¹¶å¯ä»¥å¨é¡¹ç®ä¸ææå®æ½ã
2ãWebå端ï¼
å端å¼å人åï¼ä¼åJava代ç ï¼ä¼åSQLè¯å¥ï¼è½åç®åçæ°æ®åºè®¾è®¡ï¼ä¼SpringåiBatisï¼æä¸äºè®¾è®¡æ¨¡å¼çã
(1)ç²¾éjspï¼servletï¼javabeanï¼JMSï¼EJBï¼Jdbcï¼Flexå¼åï¼æè 对ç¸å ³çå·¥å ·ãç±»åºä»¥åæ¡æ¶é常çæï¼å¦Velocityï¼Springï¼Hibernateï¼iBatisï¼OSGIçï¼å¯¹Webå¼åç模å¼æè¾æ·±çç解ï¼
(2)ç»ä½¿ç¨oracleãsqlserverãmysqlç常ç¨çæ°æ®åºç³»ç»ï¼å¯¹æ°æ®åºæè¾å¼ºç设计è½åï¼
(3)çæmaven项ç®é 置管çå·¥å ·ï¼çætomcatãjbossçåºç¨æå¡å¨ï¼åæ¶å¯¹å¨é«å¹¶åå¤çæ åµä¸çè´è½½è°ä¼æç¸å ³ç»éªè ä¼å èèï¼
(4)ç²¾éé¢å对象åæå设计ææ¯ï¼å æ¬è®¾è®¡æ¨¡å¼ãUML建模çï¼
(5)çæç½ç»ç¼ç¨ï¼å ·æ设计åå¼å对å¤APIæ¥å£ç»éªåè½åï¼åæ¶å ·å¤è·¨å¹³å°çAPIè§è设计以åAPIé«æè°ç¨è®¾è®¡è½åã
åãwebå端åå端æ¯æä¹è¿æ¥çï¼
1ãwebæå¡å¨ï¼apacheãtomcatçï¼ï¼ç½ç»åè®®ï¼æè phpçé½å¯è½ï¼ä½javawebå¯ä»¥ç¡®å®å端就æ¯javaï¼webåç«¯å ¶å®é½ä¸æ ·ã
å端åJavawebçåºå«æ´å¤çå¨äºä¸ä¸ªä¸»è¦è´è´£å端ç设计åææï¼èJavawebæ´ä¸æ³¨äºå端çå 容ã
3ãåå¼å§ä»äºwebå¼åæ¶ï¼é¦å è¦éåå¦ä¹ æ¹åï¼çæ¯æ³ä»äºå端é¨åè¿æ¯å端ç¨åºé¨åãå½ç¶å¨å·¥ä½çåæï¼å°±ä¸ä¼åçé£ä¹ç»è´äºãåå端å°åæä¹ä¼æä¸äºå端çææ¯ï¼åä¹ï¼å端ä¹æ¯ã
å ãå¦ä¹ Webå端å¼åé½éè¦ææ¡åªäºæè½ï¼
1ãå¦ä¹ htmlãè¿ä¸ªæ¯æç®åç,ä¹æ¯æåºç¡ç.è¦çç»ææ¡divãformtableãulliãpãspanãfontè¿äºæ ç¾,è¿äºé½æ¯æ常ç¨ç,ç¹å«æ¯divåtable,divç¨äºå¸å±ãtableä¹å¯ä»¥ç¨äºå¸å±,ä½æ¯ä¸çµæ´»,åºæ¬tableæ¯ç¨æ¥åæ°æ®æ交éã
2ãå¦ä¹ cssãè¿é说çcssä¸å æ¬css3,ä¸è¬æ们çå°webå端å¼åå·¥ç¨å¸çè¦æ±éé¢,æä¸ä¸ªä¼ä½¿ç¨css+htmlæè css+divæ¥è¿è¡çé¢å¸å±,æ以cssæ¯ç¨äºè¾ å©htmlæ¥å¸å±åå±ç¤ºç,æ们称ä¹ä¸ºâcssæ ·å¼â,为ä»ä¹ä¼è¯´css+divå¢?å 为æä¸é¢è¯´äºdivå°±æ¯html主è¦ç¨äºå¸å±çä¸è¥¿,æ以divå°±æ¯æ ¸å¿ææ¡çä¸è¥¿!é£ä¹cssè¯å®å¿ é¡»è¦é ådivæ¥ä½¿ç¨æ好.cssè¦çç»ææ¡floatãpositionãwidthãheightï¼ä»¥å对äºçæ大æå°ãä¼ä½¿ç¨ç¾åç¾ãoverflowãmarginãpaddingçç,è¿äºé½æ¯è·å¸å±æå ³ç³»çæ ·å¼,ä¸ç¹è¦ææ¡ã
3ãå¦ä¹ jsãå¯è½å两个大家è§å¾è¿è¿çå»,çå°jså°±å»ç¼äº,å ¶å®å§,jså ¥é¨å¾ç®åç,ä¸éè¦ä¼å¾å¤ä¸è¥¿ç,åªè¦ä¼æ ¹æ®æ个idãæè nameæ¿å°ç½é¡µdomæè æ ·å¼ãæè å¼,ç¶åä¼ç»æ个idæè nameçå ç´ æ ç¾èµå¼ãæè 追å æ°æ®ã追html,è¿ä¸ªæ¯è·æ°æ®æå ³ç³»çæä½,ç¶åæ°æ®é»è¾å¤æ,æææ¹é¢ç,æ éå°±æ¯è·³è½¬ãå¼¹æ¡ãéèä»ä¹ç,æè¿äºå ¨é¨ç»åå ¶ä»å°±æ¯å®é ç¨éäº,代ç ä¸ç¹é½ä¸é¾,ä¼äºè¿äºåºç¡js,å ¶ä»çç´æ¥ç¾åº¦å°±å¥½äº.ç¶åçå¤äº,ç¨å¤äº,å°±ä»ä¹é½ä¸æ¯é®é¢äºã
4ãå¦ä¹ jqueryãjqueryæ¯ç¸å½äºæjså°è£ äºä¸å¥çä¸ä¸ªjsæ件,ç®çå°±æ¯æä½èµ·æ¥æ´æ¹ä¾¿,代ç åçæ´å°,jqueryå ¥é¨ä¹å¾ç®å,é£äºæ¯å ¥é¨éè¦å¦çåjsä¸æ ·,åªæ¯æ¢æäºjqç代ç .å ¶ä»çä¸æ ·ç¾åº¦å°±å¤äºã
5ãæ好ä¼ç¹åå°è¯è¨,æ¯å¦javaãphp,为ä»ä¹å¢?å 为åå°çé¢çæ°æ®é½æ¯ä»åå°æ¥ç,å¦æä¼ç¹åå°ä»£ç ,å°±ç¥éæä¹è·åå°äº¤äºæ°æ®æ¯æ好ç,è¿æ ·è约æ¶é´,ä¹å¯ä»¥è®©å端代ç æ´è§è.ä¸ç¶å¯è½å ä¸ºä½ çåæ³åå端ç»æ¥çæ°æ®ä¸è½ç»åä¸,é£ä¹å端代ç åå¾éæ°å,é£å°±æ´å 麻ç¦äºã
6ãå¦ä¹ css3+html5,å¯è½è¿ä¸ªå¯¹äºæ´æ¥æçæ°äººæ¥è¯´æç¹å°é¾ï¼éè¦è¾å¼ºç代ç ç¥è¯ä¸ç»éªï¼ä½æ¯å¦æä½ ä»¬æ¯åå¤ä¸é¨æå端,é£ä¹æ好è¿æ¯å¦ä¸ä¸ï¼è¿æ ·å¯¹äºå°æ¥çå·¥ä½ä¼ææ´å¤§ç帮å©ã
ä¸ãä»äºJavaå端å¼åé½éè¦ææ¡åªäºæè½ï¼
对äºåå¦Java并ä¸æå¿äºå端å¼åçåå¦æ¥è¯´ï¼éè¦éç¹å ³æ³¨ä»¥ä¸å 个é¨åï¼
1ãåºç¡ï¼æ¯å¦è®¡ç®æºç³»ç»ãç®æ³ãç¼è¯åççç
2ãWebå¼åï¼ä¸»è¦æ¯Webå¼åç¸å ³çå 容ï¼å æ¬HTML/CSS/jsï¼å端页é¢ï¼ãServlet/JSPï¼J2EEï¼ä»¥åMySQLï¼æ°æ®åºï¼ç¸å ³çç¥è¯ãå®ä»¬çå¦ä¹ 顺åºåºè¯¥æ¯ä»åå°åï¼å æ¤æå å¦ä¹ çåºè¯¥æ¯HTML/CSS/JSï¼å端页é¢ï¼ãè¿æä¸äºå段æ¡æ¶æ¯å¦easyui,è¿æjs,jqueryçææ¯ã
3ãJ2EEï¼ä½ éè¦å¦ä¹ çæ¯Servlet/JSPï¼J2EEï¼é¨åï¼è¿é¨åæ¯Javaå端å¼åå¿ é¡»é常精éçé¨åï¼å æ¤è¿é¨åæ¯è¿ä¸é¨åä¸æéè¦è±ç²¾åçãå ³äºServlet/Jspé¨åè§é¢çéæ©ï¼ä¸çæ¯è¾è®¤å¯é©¬å£«å µçè§é¢ã4ãæ°æ®åºï¼ä½ éè¦å¦ä¼ä½¿ç¨æ°æ®åºï¼mysqlæ¯ä¸ªä¸éçå ¥é¨éæ©ï¼èä¸Javaé¢åé主æµçå ³ç³»åæ°æ®åºå°±æ¯mysqlãè¿é¨åä¸è¬å¨ä½ å¦ä¹ Servlet/Jspçæ¶åï¼å°±ä¼æ¥è§¦å°çï¼å ¶ä¸çJDBCé¨åå°±æ¯æ°æ®åºç¸å ³çé¨åãä½ ä¸ä» è¦å¦ä¼ä½¿ç¨JDBCæä½æ°æ®åºï¼è¿è¦å¦ä¼ä½¿ç¨æ°æ®åºå®¢æ·ç«¯å·¥å ·ï¼æ¯å¦navicatï¼sqlyogï¼äºéä¸å³å¯ã
5ãå¼åæ¡æ¶ï¼ç®åæ¯è¾ä¸»æµçæ¯SSMæ¡æ¶ï¼å³springãspringmvcãmybatisãä½ éè¦å¦ä¼è¿ä¸ä¸ªæ¡æ¶çæ建ï¼å¹¶ç¨å®ä»¬ååºä¸ä¸ªç®åçå¢å æ¹æ¥çWeb项ç®ãä½ å¯ä»¥ä¸ç解é£äºé ç½®é½æ¯ä»ä¹å«ä¹ï¼ä»¥å为ä»ä¹è¦è¿ä¹åï¼è¿äºççåé¢ä½ å»äºè§£ãä½ä½ ä¸å®è¦å¯ä»¥å¿«éçå©ç¨å®ä»¬ä¸ä¸ªæ建åºä¸ä¸ªWebæ¡æ¶ï¼ä½ å¨æ建SSMçè¿ç¨ä¸ï¼å¯è½ä¼ç»å¸¸æ¥è§¦å°ä¸ä¸ªå«mavençå·¥å ·ãè¿ä¸ªå·¥å ·ä¹æ¯ä½ 以åå·¥ä½å½ä¸å ä¹æ¯å¿ é¡»è¦ä½¿ç¨çå·¥å ·ï¼æä»¥ä½ å¨æ建SSMçè¿ç¨ä¸ï¼ä¹å¯ä»¥é¡ºä¾¿äºè§£ä¸ä¸mavençç¥è¯ãå¨ä½ ç®åè¿ä¸ªé¶æ®µï¼ä½ åªéè¦å¨ç½ç»ä¸äºè§£ä¸ä¸mavenåºæ¬ç使ç¨æ¹æ³å³å¯ï¼ä¸äºé«ç«¯çç¨æ³éçä½ å·¥ä½ç»éªçå¢å ï¼ä¼éæ¸æ¥è§¦å°çã
6ãä½ éè¦å»çä¸äºJDKä¸çç±»çæºç ï¼ä¹å æ¬ä½ æ使ç¨çæ¡æ¶çæºç ãè¿äºæºç è½çæçåææ¯ï¼ä½ å¿ é¡»å¯¹è®¾è®¡æ¨¡å¼é常äºè§£ãå¦åçè¯ï¼ä½ çæºç çè¿ç¨ä¸ï¼æ°¸è¿ä¼æè¿æ ·é£æ ·ççé®ï¼è¿æ®µä»£ç 为ä»ä¹è¦è¿ä¹åï¼ä¸ºä»ä¹è¦å®ä¹è¿ä¸ªæ¥å£ï¼å®çèµ·æ¥å¥½åå¾å¤ä½ï¼ç±æ¤ä¹å¯ä»¥çåºï¼è¿äºå¦ä¹ çè¿ç¨æ¯ç¯ç¯ç¸æ£çï¼å¦æä½ ä»»ä½ä¸ä¸ªé¶æ®µæä¸æ¥äºï¼é£ä¹ä½ å°±ççè·ä¸ä¸äºï¼æè 说æ¯ä¸æ¥æ ¢æ¥æ¥æ ¢ãæ»èè¨ä¹ï¼è¿ä¸ªé¶æ®µï¼ä½ éè¦åçæ¯æ·±å ¥äºè§£Javaåºå±åJavaç±»åºï¼æ¯å¦å¹¶åé£æ¬ä¹¦å°±æ¯Java并åå java.concurrentçå 容ï¼ï¼ä¹å°±æ¯JVMåJDKçç¸å ³å 容ãèä¸è¿è¦æ´æ·±å ¥çå»äºè§£ä½ æ使ç¨çæ¡æ¶ï¼æ¹å¼æ¯è¾æ¨èçæºç æè çå®æ¹ææ¡£ã
å¸æ对æ¨ææ帮å©ï¼~
å¹´ï¼å端ï¼ç§»å¨å¼åï¼å端ï¼æ该éåªä¸ªï¼è¯·å ç»åºæç¡®çå¤ï¼æ¨èéå端å¼åï¼webå端å¯ä»¥è¯´åéä¸å¯ééï¼
解éåå ï¼
ç°å¨çWebå端ææ¯å¯ä»¥è¯´æ¯è¶æ¥è¶æçäºï¼Webå端å¸åºä¹é常çç«çï¼Webå端人æä¹æ¯å¼å¸¸ç紧缺ãåè ï¼ç±äºäºèç½çå´èµ·ï¼Webå端ææ¯çä¸æåå±ï¼ä¹å æ®äºäºèç½çä¸å¸ä¹å°ã
é£ä¸ºä»ä¹è¯´Webå端æ å¯ééå¢ï¼å½å¤èåçèªåªä½å¹³å°facebookï¼ç¸ä¿¡å¤§å®¶å¤å¤å°å°ç¥éä¸ç¹ï¼ä¹ç¨è¿ä¸ç¹ï¼å®å°±æ¯Webå端ææ¯ç产ç©ï¼å®å ¨åºäºå端æ¡æ¶æé åºæ¥çå¹³å°ãåè ï¼å¤§å®¶å¸¸ç¨çå¤åå¹³å°é¥¿äºä¹ï¼å®æä¸çé¨å产åå°±æ¯åºäºWebå端ææ¯çãåæ·å®ï¼ç¾åº¦ï¼é¿éççï¼é½å·²ç»å°Webå端ææ¯æå ¥å°äºèªå·±ç产åä¸ã
å端å¼åè¡ä¸èªèµæ°´å¹³åä¸æ¶¨è¶å¿ï¼Webå端å¼åæ©å·²ä¸æ¯å带å¨ç»çä¸æèåçæ¶ä»£äºï¼ä»ä»¬å·²æ为äºèç½ä¸»å®°è ï¼åè¡ä¸é½ç¨å ¶å¼åäºèç½åºç¨ãä½ç®åæ´äºèç½è¡ä¸çWebå端å¼åå·¥ç¨å¸ç´§ä¿ï¼ä¼ä¸æ£é«èªæ±æï¼èªèµå¾ éä¸æ¶¨å涨ï¼
Webå端ææ¯å¯ä»¥è¯´æ¯è¶æ¥è¶æçäºï¼Webå端å¸åºä¹é常çç«çï¼Webå端人æä¹æ¯å¼å¸¸ç紧缺ãåè ï¼Webå端è¡ä¸ä¹æ¯æ å¯ééãç±äºäºèç½çå´èµ·ï¼Webå端ææ¯çä¸æåå±ï¼ä¹å æ®äºäºèç½çä¸å¸ä¹å°ã
Webå端å¼åå·¥ç¨å¸å·²ç»æ为åå±ä¸çèä¸é¦é¦é¦ãå ä¹æ´ä¸ªäºèç½è¡ä¸é½ç¼ºWebå端工ç¨å¸ï¼æ 论æ¯åèµ·æ¥çåä¸å ¬å¸ï¼è¿æ¯ä¸å¸å ¬å¸ä¹è³å·¨å¤´ï¼ç©ºç¼ºä¸æ ·åå¨ãä¼ç§çWebå端工ç¨å¸ç®ç´æ¯å¤§çç«è¿ç¨å°ã
ææ 解å³åæ³ï¼æ以ï¼è¿æ¯å¾æ¨èä½ å¦ä¹ webå端çï¼å¦æççæ³å¦ä¹ ï¼å¯ä»¥äºè§£ä¸ä¸å京å°å¦å ï¼æ们æ¯ä¸é¨åç¼ç¨å¹è®çï¼æ¥ææå ¶ä¸°åçå¸èµåéï¼å¸¦ç»ä½ ä¸ä¸æ ·çå¦ä¹ ä½éªãå享ä¸ä¸å端çç¥è¯æ¡æ¶ï¼å¸æå¯¹ä½ ææ帮å©ï¼
Java程序员必备基础:JDK 5-都有哪些经典新特性
JDK 发布啦~ 我们一起回顾JDK 5- 的新特性吧,大家一起学习哈~
Java 5 新特性
1. 泛型:本质是参数化类型,解决不确定具体对象类型的问题。
2. 增强循环(for-each):简化了集合的遍历。
3. 自动封箱拆箱:包装类型有:Integer,Double,Float,Long,Short,Character和Boolean
4. 枚举:关键字enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的随机排序页面 源码值可以作为常规的程序组件使用,这就是枚举类型。
5. 可变参数:我们在定义方法参数的时候不确定定义多少个,就可以定义为「可变参数」,它本质上是一个「数组」。
6. 注解:可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。
7. 静态导入:通过import static类,就可以使用类里的静态变量或方法。
8. 线程并发库(JUC):JDK5 丰富了线程处理功能,java.util.concurrent包提供了以下的类、接口:
Java 6 新特性
1. Desktop类和SystemTray类:JDK 6在java.awt包下,新增了两个类。
2. 使用JAXB2来实现对象与XML之间的映射:JAXB,即Java Architecture for XML Binding,可以实现对象与XML之间的映射。
3. 轻量级 Http Server API:JDK 6中提供了简单的Http Server API,可以构建嵌入式Http服务器。
4. 插入式注解处理API:JDK 6提供了插入式注解处理API,可以让我们定义的注解在编译期而不是运行期生效。
5. STAX:STAX,是源码时代讲师JDK6中一种处理XML文档的API。
6. Common Annotations:Common annotations原本是Java EE 5.0(JSR )规范的一部分。
7. Compiler API:javac编译器可以把.java的源文件编译为.class文件。
8. 对脚本语言的支持(如: ruby, groovy, javascript):JDK6增加了对脚本语言的支持。
Java 7 新特性
1. switch 支持String字符串类型。
2. try-with-resources,资源自动关闭
3. 整数类型如(byte,short,int,long)能够用二进制来表示
4. 数字常量支持下划线
5. 泛型实例化类型自动推断,即”<>”
6. 一个catch中捕获多个异常类型,用(|)分隔开
7. 增强的文件系统
8. Fork/join 框架
Java 8 新特性
1. lambada表达式
2. 函数式接口
3. 方法引用
4. 默认方法
5. Stream API
6. Optional
7. Date Time API
8. 重复注解
9. Base
. JVM的新特性
Java 9 新特性
1. java模块系统
2. 不可变集合工厂方法
3. 接口支持私有方法
4. 钻石操作符升级
5. Optional 类改进
6. 多版本兼容Jar包
7. JShell工具
8. try-with-resources的改进
9. Stream API的改进
Java 新特性
1. 局部变量类型推断
2. 不可变集合的改进
3. 并行全垃圾回收器 G1
4. 线程本地握手
5. Optional新增orElseThrow()方法
6. 其他新特性
Java 新特性
1. 字符串操作
2. 用于 Lambda 参数的局部变量语法
3. 标准化HTTP Client
4. 单个命令编译运行源代码
5. ZGC:可伸缩低延迟垃圾收集器
6. 其他一些特性
Java 新特性
1. Switch 表达式扩展(预览功能)
2. 紧凑的数据格式
3. 字符串支持transform、indent操作
4. Files.mismatch(Path, Path)
5. Teeing Collector
6. 其他特性
Java 新特性
1. Switch 表达式扩展(引入 yield 关键字)
2. 文本块升级
3. SocketAPI 重构
4. FileSystems.newFileSystem新方法
5. 增强 ZGC 释放未使用内存
6. 其他特性
Java 新特性
1. instanceof模式匹配
2. Record 类型(预览功能)
3. Switch 表达式-标准化
4. 改进 NullPointerExceptions提示信息
5. 其他特性
Java 新特性
1. EdDSA 数字签名算法
2. Sealed Classes(封闭类,预览)
3. Hidden Classes(隐藏类)
4. Remove the Nashorn JavaScript Engine
5. Reimplement the Legacy DatagramSocket API(重新实现DatagramSocket API)
6. 其他参考与感谢
JDK基础概念及目录结构
JDK、JRE和JVM等基础概念
我们平时所说的JDK,实际上是指Java开发包,它包含了用于Java开发的工具集。具体来说,JDK(Java Development ToolKit)包含Java运行环境(JRE)和一系列开发工具,如编译器、调试器、javadoc等。我们依赖JDK来开发和运行Java程序。JDK的编译器Javac会将Java代码编译成字节码(.class文件)。由于编译出的字节码在任何平台上都相同,因此Java语言被誉为跨平台语言,即“一次编写,到处运行”。JRE(Java Runtime Environment)为Java提供了运行环境,xp 源码 下载其中JVM(Java Virtual Machine,即Java虚拟机)是关键部分,它负责将字节码解释成可执行的机器码。JRE由JVM、Java运行时类库、动态链接库等组成。JVM可以视为一台抽象化的计算机,拥有完整的体系架构,包括处理器、堆栈、寄存器等。在运行时环境,JVM会将Java字节码解释成机器码。由于机器码与平台相关,因此JVM在不同平台有不同的实现。目前,JDK默认使用的实现是Hotspot VM。
OpenJDK介绍
我们通常所说的JDK是指SUN公司(现在是Oracle公司的)的官方JDK,由于历史遗留问题,其本身采用的并非开源协议。因此,后来出现了OpenJDK,即JDK的开源版本。OpenJDK与JDK有以下几点不同:
(以上摘自知乎中的高票答案。)我们有时会在Java源码中看到标记为native的方法,这说明该方法是用C代码实现的。我们可以通过OpenJDK查看其具体实现方式。libnids源码分析例如,Object类的getClass方法:
相应的,在OpenJDK/jdk/src/share/native目录下,找到Object.c文件,可以看到具体的实现代码:
JDK目录结构
那么,上述提到的JRE和JVM具体是什么样子呢?我们可以通过查看JDK的目录结构来了解其真容。以下以centos7系统下的JDK1.8版本为例,对JDK目录结构进行说明。
JDK1.8目录结构:
以下是一些比较重要的目录或文件的含义:
dt.jar和tools.jar文件作用
dt.jar包含了Swing包,是运行环境的类库。目前的发展趋势是Java越来越少用于GUI开发,因此这个类库基本不会用到。
tools.jar是工具类库,bin目录下的可执行程序,很多都会用到这个类库。例如,javac[.exe]、javadoc[.exe]等。
平时我们经常会将这两个文件配置到CLASSPATH的当前目录(.)后面。原因是有一些可执行程序在运行时依赖于这些类库,例如javac[.exe]就依赖于tools.jar类库的javac包。
jre目录结构
bin目录包含了运行Java程序所需的可执行文件,例如java[.exe]。
lib目录包含了运行时依赖的Java类库和动态链接库(.so或.dll或.dylib)。
jre/lib目录结构:
amd目录下包含了程序运行所需的动态链接库,在amd/server目录下,可以找到JVM库:libjvm.so。京东点选源码rt.jar文件是Java运行时类库,是我们用到最多的基础类库,包括java.lang、java.io、java.net、java.util等。
java.lang:Java语言包,该包下的文件不需要显式import。包括:Object类、数据类型相关的类(String、Long、Byte)、Class类、线程相关类Thread、异常类Throwable等。
java.io:I/O操作相关的类。包括:文件类File、FileReader、FileWriter、输入输出流InputStream/OutputStream等。
java.net:网络相关类。包括:http连接类HttpURLConnection、socket类等。
java.util:工具类。包括:数据结构相关的类ArrayList、HashMap、日期类Date、随机数类Random等。
我们平时在配置好JDK HOME后,IDE会默认将JDK的类库全部引用进来,供开发使用。以mac下的Itellij IDEA为例,看一下都有哪些类:
后记
本文首先介绍了JDK相关的一些基础概念;之后通过分析JDK的目录结构,加深对这些概念的理解。Java体系博大精深,像Java类库、JVM等每个部分都值得深入研究一番。阅读源代码是最直接、见效最快的方法,强烈推荐用这种方法来学习Java。
APP测试练手笔记(1)代码保护与应用配置
深入探讨移动应用安全测试的关键步骤与关注点,以确保用户的隐私与数据安全。当前,移动应用的普及使得我们的日常活动与之紧密相连,从约会到支付,一个应用往往承载着大量的用户数据。因此,评估应用的安全性变得至关重要。本文旨在提供一个清晰的框架,指导如何在移动应用中进行安全测试,以识别潜在的安全漏洞并采取相应的预防措施。 移动应用安全测试关注点包括敏感数据暴露、鉴权机制缺陷、钓鱼劫持风险、代码层面保护不足、应用配置错误、XcodeGhost病毒以及开发者证书不规范等问题。这些关注点构成了一个全面的安全测试流程,帮助开发者识别并修复潜在的安全隐患。 ### 代码与应用配置方面的问题 代码保护不足,可重新编译打包:通过使用ApkTool进行反编译,修改源代码,重新编译和签名,来测试应用的完整性。若发现可以注入恶意代码或绕过鉴权,应修改程序安装后 classes.dex 文件的 Hash 值,以判断软件是否被重新打包并进行提示。 allowbackup权限数据泄露风险:检查AndroidManifest.xml文件中allowBackup属性是否设置为true,若存在,可能导致数据泄露。建议将android:allowBackup属性设置为false,防止数据泄漏。 Debuggable属性应用信息篡改泄露风险:检查Debuggable属性是否设置为true,允许设置断点控制程序执行。若开启,应关闭此属性以防止应用信息被篡改。 信任所有证书漏洞:检查SDK是否存在安全问题,如直接选择信任所有证书,可能导致中间人攻击和劫持。应升级SDK或使用SSLSocketFactory.STRICT_HOSTNAME_VERIFIER进行验证。 开发者证书规范测试:确保证书满足规范性要求,检查是否过期。使用JEB CA查看页面或java JDK自带的keytool工具进行验证。 ### 应用配置错误 关键页面钓鱼劫持风险:确保敏感界面如登录、支付等是否受到钓鱼劫持保护,如提示用户等。在关键类的onpause中实现钓鱼劫持防护功能。 ### WebView漏洞 WebView接口函数addJavascriptInterface可能导致本地JS与Java交互漏洞,需检查版本限制和过滤措施。对于Android 4.2及之后版本,使用@JavascriptInterface注解代替addjavascriptInterface。 ### 不安全的本地存储 检查Shared Preferences、SQLite数据库和SD卡目录,确保敏感数据经过加密处理,防止数据泄露。 ### 边信道信息泄露 通过日志文件分析,加密存储密码等敏感信息,并对敏感信息的缓存进行加密,防止通过边信道被攻击者利用。 本文以诱导充钱的约炮APP为例,详细介绍了在代码保护与应用配置方面进行安全测试的关键步骤与关注点。通过实施上述测试流程,可以有效识别并修复移动应用中的安全漏洞,增强应用的安全性和用户信任度。Netty源码探究1:事件驱动原理
Netty源码探究1:事件驱动原理
Netty借鉴了Reactor设计模式,这是一种事件处理模式,用于管理并发服务请求。在模式中,服务处理器对请求进行I/O多路复用,并同步分发给相应的请求处理器。Netty的核心内容是Reactor,因此深入分析其在Netty中的应用至关重要。Netty吸收了前人优秀经验,构建出这款优秀的技术框架。
在Reactor设计模式中,Demultiplexer和Dispatcher是关键概念。Netty中的Demultiplexer是如何实现的?答案在于其Server端的架构设计。Netty通过Bootstrap(ServerBootstrap也适用)来构建Server,其中bind方法是启动Reactor运行的关键。在bind方法中,Netty创建并注册Channel到EventLoopGroup,从而实现Demultiplexer的功能。
Netty中的Channel与JDK中的Channel有何不同?Netty通过NioServerSocketChannel构建Server,其内部封装了Java NIO的Channel,但Netty的Channel与JDK中的Channel在注册到Selector时有所不同。Netty中的Channel注册到NioEventLoop中的Selector上,只关注OP_ACCEPT事件。当客户端连接时,事件被触发,Server响应客户端连接。这涉及NioServerSocketChannel的构造过程和Selector的创建。
Dispatcher在Java NIO中负责事件分发,Netty中如何实现这一功能?在NioEventLoop中,Selector.select()方法配合run()函数,共同实现事件监听循环。run函数中包含事件状态机和事件分派逻辑。当有事件到来时,状态机触发processSelectedKeys()方法,根据事件类型调用相应处理器进行处理。
Netty中的事件驱动原理最终如何与自定义handler关联?在NioEventLoop的processSelectedKey()方法中,事件处理逻辑与Channel.Unsafe接口相关联。Channel.Unsafe接口用于封装Socket的最终操作,Netty通过此接口与业务层Handler建立关联。通过调用handler的read方法,Netty将事件与业务处理逻辑关联起来。
总之,Netty通过Reactor设计模式实现了事件驱动原理,借助Demultiplexer和Dispatcher的机制,实现了对并发请求的高效处理。理解Netty的源码结构和事件驱动原理,对于深入掌握Netty技术框架至关重要。