http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/
一,網(wǎng)絡(luò)編程中兩個(gè)主要的問題
一個(gè)是如何準(zhǔn)確的定位網(wǎng)絡(luò)上一臺(tái)或多臺(tái)主機(jī),另一個(gè)就是找到主機(jī)后如何可靠高效的進(jìn)行數(shù)據(jù)傳輸。
在TCP/IP協(xié)議中IP層主要負(fù)責(zé)網(wǎng)絡(luò)主機(jī)的定位,數(shù)據(jù)傳輸?shù)穆酚桑蒊P地址可以唯一地確定Internet上的一臺(tái)主機(jī)。
而TCP層則提供面向應(yīng)用的可靠(tcp)的或非可靠(UDP)的數(shù)據(jù)傳輸機(jī)制,這是網(wǎng)絡(luò)編程的主要對象,一般不需要關(guān)心IP層是如何處理數(shù)據(jù)的。
目前較為流行的網(wǎng)絡(luò)編程模型是客戶機(jī)/服務(wù)器(C/S)結(jié)構(gòu)。即通信雙方一方作為服務(wù)器等待客戶提出請求并予以響應(yīng)??蛻魟t在需要服務(wù)時(shí)向服務(wù)器提 出申請。服務(wù)器一般作為守護(hù)進(jìn)程始終運(yùn)行,監(jiān)聽網(wǎng)絡(luò)端口,一旦有客戶請求,就會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程來響應(yīng)該客戶,同時(shí)自己繼續(xù)監(jiān)聽服務(wù)端口,使后來的客戶也 能及時(shí)得到服務(wù)。
二,兩類傳輸協(xié)議:TCP;UDP
TCP是Tranfer Control Protocol的 簡稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過TCP協(xié)議傳輸,得到的是一個(gè)順序的無差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方的成對的兩個(gè)socket之間必須建 立連接,以便在TCP協(xié)議的基礎(chǔ)上進(jìn)行通信,當(dāng)一個(gè)socket(通常都是server socket)等待建立連接時(shí),另一個(gè)socket可以要求進(jìn)行連接,一旦這兩個(gè)socket連接起來,它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送 或接收操作。
UDP是User Datagram Protocol的簡稱,是一種無連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。
比較:
UDP:1,每個(gè)數(shù)據(jù)報(bào)中都給出了完整的地址信息,因此無需要建立發(fā)送方和接收方的連接。
2,UDP傳輸數(shù)據(jù)時(shí)是有大小限制的,每個(gè)被傳輸?shù)臄?shù)據(jù)報(bào)必須限定在64KB之內(nèi)。
3,UDP是一個(gè)不可靠的協(xié)議,發(fā)送方所發(fā)送的數(shù)據(jù)報(bào)并不一定以相同的次序到達(dá)接收方
TCP:1,面向連接的協(xié)議,在socket之間進(jìn)行數(shù)據(jù)傳輸之前必然要建立連接,所以在TCP中需要連接
時(shí)間。
2,TCP傳輸數(shù)據(jù)大小限制,一旦連接建立起來,雙方的socket就可以按統(tǒng)一的格式傳輸大的
數(shù)據(jù)。
3,TCP是一個(gè)可靠的協(xié)議,它確保接收方完全正確地獲取發(fā)送方所發(fā)送的全部數(shù)據(jù)。
應(yīng)用:
1,TCP在網(wǎng)絡(luò)通信上有極強(qiáng)的生命力,例如遠(yuǎn)程連接(Telnet)和文件傳輸(FTP)都需要不定長度的數(shù)據(jù)被可靠地傳輸。但是可靠的傳輸是要付出代價(jià)的,對數(shù)據(jù)內(nèi)容正確性的檢驗(yàn)必然占用計(jì)算機(jī)的處理時(shí)間和網(wǎng)絡(luò)的帶寬,因此TCP傳輸?shù)男什蝗鏤DP高。
2,UDP操作簡單,而且僅需要較少的監(jiān)護(hù),因此通常用于局域網(wǎng)高可靠性的分散系統(tǒng)中client/server應(yīng)用程序。例如視頻會(huì)議系統(tǒng),并不要求音頻視頻數(shù)據(jù)絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會(huì)更合理一些。
三,基于Socket的java網(wǎng)絡(luò)編程
1,什么是Socket
網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。Socket通常用來實(shí)現(xiàn)客戶方和服務(wù)方的連接。Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面,一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號唯一確定。
但是,Socket所支持的協(xié)議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯(lián)系的。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。
2,Socket通訊的過程
Server端Listen(監(jiān)聽)某個(gè)端口是否有連接請求,Client端向Server 端發(fā)出Connect(連接)請求,Server端向Client端發(fā)回Accept(接受)消息。一個(gè)連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。
對于一個(gè)功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過程包含以下四個(gè)基本的步驟:
(1) 創(chuàng)建Socket;
?。?) 打開連接到Socket的輸入/出流;
(3) 按照一定的協(xié)議對Socket進(jìn)行讀/寫操作;
(4) 關(guān)閉Socket.(在實(shí)際應(yīng)用中,并未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因?yàn)槌绦虮旧肀容^簡單,要求不高,所以并未造成什么影響。)
3,創(chuàng)建Socket
創(chuàng)建Socket
java在包java.net中提供了兩個(gè)類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務(wù)端。這是兩個(gè)封裝得非常好的類,使用很方便。其構(gòu)造方法如下:
Socket(InetAddress address, int port);
Socket(InetAddress address, int port, boolean stream);
Socket(String host, int prot);
Socket(String host, int prot, boolean stream);
Socket(SocketImpl impl)
Socket(String host, int port, InetAddress localAddr, int localPort)
Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
ServerSocket(int port);
ServerSocket(int port, int backlog);
ServerSocket(int port, int backlog, InetAddress bindAddr)
其中address、host和port分別是雙向連接中另一方的IP地址、主機(jī)名和端 口號,stream指明socket是流socket還是數(shù)據(jù)報(bào)socket,localPort表示本地主機(jī)的端口號,localAddr和 bindAddr是本地機(jī)器的地址(ServerSocket的主機(jī)地址),impl是socket的父類,既可以用來創(chuàng)建serverSocket又可 以用來創(chuàng)建Socket。count則表示服務(wù)端所能支持的最大連接數(shù)。例如:學(xué)習(xí)視頻網(wǎng) http://www.xxspw.com
Socket client = new Socket("127.0.01.", 80);
ServerSocket server = new ServerSocket(80);
注意,在選擇端口時(shí),必須小心。每一個(gè)端口提供一種特定的服務(wù),只有給出正確的端口,才 能獲得相應(yīng)的服務(wù)。0~1023的端口號為系統(tǒng)所保留,例如http服務(wù)的端口號為80,telnet服務(wù)的端口號為21,ftp服務(wù)的端口號為23, 所以我們在選擇端口號時(shí),最好選擇一個(gè)大于1023的數(shù)以防止發(fā)生沖突。
在創(chuàng)建socket時(shí)如果發(fā)生錯(cuò)誤,將產(chǎn)生IOException,在程序中必須對之作出處理。所以在創(chuàng)建Socket或ServerSocket是必須捕獲或拋出例外。
4,簡單的Client/Server程序
1. 客戶端程序
import java.io.*;
import java.net.*;
public class TalkClient {
public static void main(String args[]) {
try{
Socket socket=new Socket("127.0.0.1",4700);
//向本機(jī)的4700端口發(fā)出客戶請求
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象
PrintWriter os=new PrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象
String readline;
readline=sin.readLine(); //從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串
while(!readline.equals("bye")){
//若從標(biāo)準(zhǔn)輸入讀入的字符串為 "bye"則停止循環(huán)
os.println(readline);
//將從系統(tǒng)標(biāo)準(zhǔn)輸入讀入的字符串輸出到Server
os.flush();
//刷新輸出流,使Server馬上收到該字符串
System.out.println("Client:"+readline);
//在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串
System.out.println("Server:"+is.readLine());
//從Server讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上
readline=sin.readLine(); //從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串
} //繼續(xù)循環(huán)
os.close(); //關(guān)閉Socket輸出流
is.close(); //關(guān)閉Socket輸入流
socket.close(); //關(guān)閉Socket
}catch(Exception e) {
System.out.println("Error"+e); //出錯(cuò),則打印出錯(cuò)信息
}
}
}
2. 服務(wù)器端程序
import java.io.*;
import java.net.*;
import java.applet.Applet;
public class TalkServer{
public static void main(String args[]) {
try{
ServerSocket server=null;
try{
server=new ServerSocket(4700);
//創(chuàng)建一個(gè)ServerSocket在端口4700監(jiān)聽客戶請求
}catch(Exception e) {
System.out.println("can not listen to:"+e);
//出錯(cuò),打印出錯(cuò)信息
}
Socket socket=null;
try{
socket=server.accept();
//使用accept()阻塞等待客戶請求,有客戶
//請求到來則產(chǎn)生一個(gè)Socket對象,并繼續(xù)執(zhí)行
}catch(Exception e) {
System.out.println("Error."+e);
//出錯(cuò),打印出錯(cuò)信息
}
String line;
BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象
PrintWriter os=newPrintWriter(socket.getOutputStream());
//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象
BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
//由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象
System.out.println("Client:"+is.readLine());
//在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串
line=sin.readLine();
//從標(biāo)準(zhǔn)輸入讀入一字符串
while(!line.equals("bye")){
//如果該字符串為 "bye",則停止循環(huán)
os.println(line);
//向客戶端輸出該字符串
os.flush();
//刷新輸出流,使Client馬上收到該字符串
System.out.println("Server:"+line);
//在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串
System.out.println("Client:"+is.readLine());
//從Client讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上
line=sin.readLine();
//從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串
} //繼續(xù)循環(huán)
os.close(); //關(guān)閉Socket輸出流
is.close(); //關(guān)閉Socket輸入流
socket.close(); //關(guān)閉Socket
server.close(); //關(guān)閉ServerSocket
}catch(Exception e){
System.out.println("Error:"+e);
//出錯(cuò),打印出錯(cuò)信息
}
}
}
5,支持多客戶的client/server程序
前面的Client/Server程序只能實(shí)現(xiàn)Server和一個(gè)客戶的對話。在實(shí)際應(yīng)用 中,往往是在服務(wù)器上運(yùn)行一個(gè)永久的程序,它可以接收來自其他多個(gè)客戶端的請求,提供相應(yīng)的服務(wù)。為了實(shí)現(xiàn)在服務(wù)器方給多個(gè)客戶提供服務(wù)的功能,需要對上 面的程序進(jìn)行改造,利用多線程實(shí)現(xiàn)多客戶機(jī)制。服務(wù)器總是在指定的端口上監(jiān)聽是否有客戶請求,一旦監(jiān)聽到客戶請求,服務(wù)器就會(huì)啟動(dòng)一個(gè)專門的服務(wù)線程來響 應(yīng)該客戶的請求,而服務(wù)器本身在啟動(dòng)完線程之后馬上又進(jìn)入監(jiān)聽狀態(tài),等待下一個(gè)客戶的到來。
http://greemranqq.iteye.com/blog/1774258
http://www.cnblogs.com/-lpf/p/4317281.html
我在項(xiàng)目開發(fā)過程中,經(jīng)常要改動(dòng)JAVA/JSP 文件,但是又不想從新啟動(dòng)服務(wù)器(服務(wù)器從新啟動(dòng)花時(shí)間),想直接獲得(debug)結(jié)果.有兩種方式熱部署 和熱加載:
1.熱加載:在server.xml -> context 屬性中 設(shè)置 reloadable="true"
Java代碼

- <Context docBase="xxx" path="/xxx" reloadable="true"/>
2. 熱部署:在server.xml -> context 屬性中 設(shè)置 autoDeploy="true"
Java代碼

- <Context docBase="xxx" path="/xxx" autoDeploy="true"/>
3.區(qū)別:
熱加載:服務(wù)器會(huì)監(jiān)聽 class 文件改變,局部進(jìn)行加載,不清空session ,不釋放內(nèi)存。開發(fā)中用的多,但是要考慮內(nèi)存溢出的情況。
熱部署: 整個(gè)項(xiàng)目從新部署,包括你從新打上.war 文件。 會(huì)清空session ,釋放內(nèi)存。項(xiàng)目打包的時(shí)候用的多。
也可以通過Eclipse上設(shè)置實(shí)現(xiàn)上述配置文件的修改
Eclipse的工程名右鍵: properties->Tomcat->General->Make this context as reloadable(reloadable="true")不要選中 Eclipse的工程名右鍵:Tomcat project->Update Context Definition
注意:source 屬性有些版本不支持,容易出錯(cuò),去掉就行
二。
不重啟Tomcat有兩種方式:熱部署、熱加載
熱部署:容器狀況在運(yùn)行時(shí)重新部署整個(gè)項(xiàng)目。這類環(huán)境下一般整個(gè)內(nèi)存會(huì)清空,重新加載,這類方式
有可能會(huì)造成sessin丟失等環(huán)境。tomcat 6確實(shí)可以熱部署了,而且對話也沒丟.
熱加載:最好是在調(diào)試過程中使用,免患上整個(gè)項(xiàng)目加載,Debug標(biāo)準(zhǔn)樣式支持熱加載。容器狀況在運(yùn)行時(shí)重
新加載轉(zhuǎn)變編譯后的類。在這類環(huán)境下內(nèi)存不會(huì)清空,sessin不會(huì)丟失,但容易造成內(nèi)存溢出,或者找不到方
法。一般轉(zhuǎn)變類的布局和模型就會(huì)有異常,在已經(jīng)有的變量和方法中轉(zhuǎn)變是不會(huì)出問題的(Eclipse、
MyEclipse8、JBuilder、IntelliJ IDEA…)。
常用的一定第二種:熱加載了,設(shè)置如下!
在tomcat的conf中的server.xml中的host設(shè)置中添加<Context path="/test"
docBase="D:/develop/test"
debug="0" privileged="true" reloadable="true"/>
reloadable="true" !最重要
它內(nèi)里有很多屬性,意義如下:
1>path:指定拜候該web應(yīng)用的URL進(jìn)口;
2>docBase:指定web應(yīng)用的文件路徑,可以給定絕對路徑,也可以給定相對于<Host>的appBase屬性【默認(rèn)
指向tomcat的webapps】的相對于徑;要是Web應(yīng)用是個(gè)war文件,則指定war文件的路徑。
3>className:指定使成為事實(shí)Context組件的Java類的名字,這個(gè)Java類必須使成為事實(shí)org.apache.catalina.Context
接口,該屬性的默認(rèn)值為org.apache.catalina.StandardContext。
4>reloadable:要是這個(gè)屬性設(shè)置為true,Tomcat服務(wù)器在運(yùn)行狀況下會(huì)監(jiān)視在WEB-INF/classess和WEB-
INF/lib目次下的class文件的改動(dòng),以及監(jiān)視web應(yīng)用的WEB-INF/web.xml文件的改動(dòng)。要是檢測到的class
文件或者web.xml文件被更新,服務(wù)器會(huì)自動(dòng)加載Web應(yīng)用。該屬性的默認(rèn)值為false.在web應(yīng)用的開發(fā)和調(diào)
試階段,把reloadable設(shè)為true,可以方便對web應(yīng)用的調(diào)試。在web應(yīng)用正式發(fā)布階段,把reloadable設(shè)為
false,可以減低tomcat的運(yùn)行負(fù)荷,提高Tomcat的運(yùn)行性能。
5>cachingAllowed:要是為true,標(biāo)示允許啟用靜態(tài)資源的緩存。使用緩存能提高拜候靜態(tài)資源的效率。
tomcat把那一些時(shí)常被客戶端拜候的靜態(tài)資源(如:HTML文檔、圖片文件和聲響文件等)放在緩存中,當(dāng)客戶再
次拜候有關(guān)靜態(tài)資源時(shí),Tomcat只需直接從緩存中讀取相關(guān)數(shù)據(jù),無須反復(fù)讀取文件系統(tǒng)中的文件。該屬
性的默認(rèn)值為true.
6>cacheMaxSize:設(shè)定靜態(tài)資源的緩存的最大容量,以K為單元。要是,要是該屬性為100,表示100K,默認(rèn)
為10240(即10M)。
7>workDir:指定web應(yīng)用的工作目次。Tomcat在運(yùn)行時(shí)會(huì)把與這個(gè)web應(yīng)用相關(guān)的臨應(yīng)試文章件放在此目次下。
8>uppackWar:要是此項(xiàng)設(shè)為true,表示將把web應(yīng)用的war文件睜開為開放目次布局后再運(yùn)行。要是設(shè)為
false,則直接運(yùn)行war文件。該屬性的默認(rèn)值為true。
同志們,使用tomcat6.0的注意了啊。當(dāng)你使用我的方法設(shè)置tomcat后,你的myeclipse報(bào)如下錯(cuò)誤時(shí),不要驚慌,這是正確的,且聽我解釋。
console報(bào)錯(cuò):
警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ' debug' to '0' did not find a matching property. 這是由于你使用的是tomcat6.0,由于它路程經(jīng)過過程其他途徑對debug="0"這個(gè)屬性進(jìn)行了使成為事實(shí),所以這搭不能再有此屬性。你只要將它去掉,就能夠沒事了啟動(dòng)了。 也就是說去掉debug="0“,萬事OK,呵呵。
(轉(zhuǎn))
-------------------------------------------------------------
針對需要重新啟動(dòng)tomcat的服務(wù),重新啟動(dòng)方式為:
安裝版:tomcat/bin/shotdown.bat 關(guān)閉tomcat服務(wù)
tomcat/bin/startup.bat 開啟tomcat服務(wù)
或者-->我的電腦-->管理-->服務(wù)和應(yīng)用程序/服務(wù)-->找到Apache Tomcat重啟
http://blog.sina.com.cn/s/blog_3c9872d00102w00y.html
Apache與Tomcat整合應(yīng)用是一個(gè)老話題,不算新技能,但對非運(yùn)維人員在配置過程中或許也會(huì)遇到一些問題。這里只是把自己多回配置的過程做一個(gè)摘錄,供自己翻閱并望對過路的人有用。
Apache是當(dāng)下在Windows、Unix、Linux 等操作系統(tǒng)中最流行的Web服務(wù)器軟件之一,其反應(yīng)速度快、運(yùn)行效率高,不僅支持HTML等靜態(tài)頁面,在加載插件后也可支持 PHP 頁面等。Tomcat是Apache軟件基金協(xié)會(huì)與Sun公司聯(lián)合開發(fā)的Web服務(wù)器,除支持HTML靜態(tài)頁面外,還是JSP、Servlet等JAVA WEB應(yīng)用的服務(wù)器。在相同運(yùn)行環(huán)境下,Tomcat對靜態(tài)頁面的反應(yīng)速度沒有Apache靈敏,整合 Apache與Tomcat能使系統(tǒng)運(yùn)行于一個(gè)良好環(huán)境下,實(shí)現(xiàn)JAVA的動(dòng)態(tài)與靜態(tài)頁面分離,不僅讓系統(tǒng)更安全,同時(shí)也可提高系統(tǒng)效率。
一、JAVA應(yīng)用基礎(chǔ)架構(gòu)
通用的JAVA應(yīng)用架構(gòu)如下,包括WEB Server、APP Server和DB Server三個(gè)部分:
1、WEB Server
WEB Server置于企業(yè)防火墻外,這個(gè)防火墻也可以認(rèn)為是一個(gè)CISCO路由器,在CISCO路由器上開放兩個(gè)端口為:80和443,其中:
80端口:用于正常的http訪問
443端口:用于https訪問,即如果你在ie里打入https://xxx.xxx.xx這樣的地址,默認(rèn)走的是443這個(gè)端口
WebServer專門用于解析HTML、JS(JavaScript)、CSS、JPG/GIF等圖片格式文件、TXT、VBSCRIPT、PHP等“靜態(tài)”網(wǎng)頁內(nèi)容。
2、APP Server
APP Server置于企業(yè)防火墻內(nèi),它和Web Server之間的連接必須且一定為內(nèi)部IP連接。App Server用于解析我們的任何需要Java編譯器才能解析的“動(dòng)態(tài)”網(wǎng)頁,其實(shí)App Server本身也能解析任何靜態(tài)網(wǎng)頁的。在應(yīng)用中我們這樣來想一下:我們讓負(fù)責(zé)專門解析靜態(tài)網(wǎng)頁的Web Server來解析html等內(nèi)容,而讓App Server專門用于解析任何需要Java編譯器才能解析的東西,讓它們各司其職。這樣作的好處:
1)為App Server“減壓”,同時(shí)也提高了性能;
2)不用再把8080這個(gè)端口暴露在internet上,也很安全,畢竟我們的App Server上是有我們的代碼的,就算是編譯過的代碼也容易被“反編譯”,這是很不安全的;
3)為將來進(jìn)一步的“集群擴(kuò)展”打好了基礎(chǔ)。
3、DB Server
比方說我們用MySQL,它需要通過3306與App Server進(jìn)行連接,那么這個(gè)1521我們稱為數(shù)據(jù)庫連接端口,如果把它暴露在Internet上就比較危險(xiǎn),就算密碼很復(fù)雜,但 對于高明的黑客來說,要攻破你的口令也只是時(shí)間上的問題而己。因此我們把我們的DB Server也和App Server一樣,置于內(nèi)網(wǎng)的防火墻,任何的DB連接與管理只能通過內(nèi)網(wǎng)來訪問。
二、系統(tǒng)安裝與配置
系統(tǒng)安裝包括MySQL的安裝,WEB Server即Apache的安裝,App Server即Tomcat的安裝。關(guān)于這三個(gè)系統(tǒng)安裝網(wǎng)上相關(guān)的文檔很多,此處略去。以下主要摘錄需要重點(diǎn)配置的內(nèi)容。
1、Apache的配置
做技術(shù)的人應(yīng)該都會(huì)Apache的基礎(chǔ)配置,如果不會(huì)確實(shí)需要學(xué)一學(xué)。
Apache的配置主要集中在httpd.conf文件中,它位于Apache的安裝目錄下,比如我的是在“C:\webserver\apache\apache22\conf”目錄下。用Ultraedit或Notepad++編輯器打開文件,通常需要修改的內(nèi)容包括ServerName、DocumentRoot、VirtualHost內(nèi)容等。此處我修改的內(nèi)容包括:
1)DocumentRoot原目錄為C:/webserver/apache/apache22/htdocs,修改為D:/WWW/apache/htdocs,將網(wǎng)站發(fā)布路徑與Apache安裝路徑分開;
2)找到如下紅色標(biāo)示內(nèi)容:
Options FollowSymLinks
AllowOverride None
Order deny,allow
deny from all
把這個(gè)”deny from all”改成”allow fromall’。
Options FollowSymLinks
AllowOverride None
Order deny,allow
allow from all
以免訪問Apache根目錄下的文件時(shí)出現(xiàn)以下錯(cuò)誤提示:
3)再找到下面這樣的行
Options FollowSymLinks indexes
把它注掉改成下面這樣
#Options FollowSymLinks indexes
Options None
以免在訪問Apache目錄時(shí)出現(xiàn)直接列表顯示子目錄或目錄下文件的不安全情況,如下圖樣子:
以上配置修改完成后重啟Apache服務(wù),保證要能正常運(yùn)行。
三、Apache與Tomcat的整合配置
Apache(Web Server)負(fù)責(zé)處理HTML靜態(tài)內(nèi)容,Tomcat(App Server)負(fù)責(zé)處理動(dòng)態(tài)內(nèi)容;原理圖如下:
上述架構(gòu)的原理是: 在Apache中裝載一個(gè)模塊,這個(gè)模塊叫mod_jk; Apache通過80端口負(fù)責(zé)解析任何靜態(tài)web內(nèi)容; 任何不能解析的內(nèi)容,用表達(dá)式告訴mod_jk,讓mod_jk派發(fā)給相關(guān)的App Server去解釋。
因此,首先把 mod_jk-1.2.31-httpd-2.2.3(可從網(wǎng)上搜索下載該模塊,如http://download.csdn.net/detail/shangkaikuo/4494837)拷貝到 "/Apache2.2/modules" 目錄下。接下來:
1、添加workers.properties文件
在 “/Tomcat 8.0/conf ” 文件夾下(也可以是其它目錄下)增加 workers.properties 文件,輸入以下內(nèi)容。(將其中相應(yīng)目錄替換成自己本地tomcat或jre安裝目錄)
#讓mod_jk模塊認(rèn)識(shí)Tomcat
workers.tomcat_home=d:/webserver/tomcat/tomcat8
#讓mod_jk模塊認(rèn)識(shí)JRE
workers.java_home=C:/java/jdk1.8.0_45/jre
#指定文件路徑分割符
ps=/
##
#工作端口,此端口應(yīng)該與server.xml中Connector元素的AJP/1.3協(xié)議所使用的端口相匹配
worker.list=AJP13
worker.AJP13.port=8009
#Tomcat服務(wù)器的地址
worker.AJP13.host=localhost
#類型
worker.AJP13.type=ajp13
#負(fù)載平衡因數(shù)
worker.AJP13.lbfactor=1
**注意:worker.list=AJP13中,AJP13為自定義名稱,但此名稱必須與下文所述的 “/Apache 2.2/conf/httpd.conf ” 文件中,JkMount指令對應(yīng)的名稱相匹配。
2、httpd.conf文件中添加配置內(nèi)容
加入workers.properties文件后,可修改 “/Apache 2.2/conf/httpd.conf ” 文件,加入以下配置,注意JkMount指令中的變量必須與worker.list所配置的名稱相同。
# 此處mod_jk-1.2.31-httpd-2.2.3文件為你下載的文件
LoadModule jk_module modules/mod_jk-1.2.31-httpd-2.2.3.so
# 指定tomcat監(jiān)聽配置文件地址
JkWorkersFile "C:/webserver/tomcat/tomcat8/conf/workers.properties"
#JkWorkersFile "C:/webserver/apache/apache22/conf/workers.properties"
# 指定日志存放位置
JkLogFile "C:/webserver/tomcat/tomcat8/logs/mod_jk2.log"
JkLogLevel info
-virtualhost *-
ServerName localhost
DocumentRoot "C:/webserver/tomcat/tomcat8/webapps"
DirectoryIndex index.html index.htm index.jsp index.action
ErrorLog logs/shsc-error_log.txt
CustomLog logs/shsc-access_log.txt common
JkMount /*WEB-INF AJP13
JkMount /*j_spring_security_check AJP13
JkMount /*.action AJP13
JkMount /servlet/* AJP13
JkMount /*.jsp AJP13
JkMount /*.do AJP13
JkMount /*.action AJP13
-/virtualhost-
上述配置中的紅色內(nèi)容是為了告訴Apache哪些交給Tomcat去處理,其它的都交由Apache自身去處理。
其中綠色的兩句比較關(guān)鍵,分別告訴:Apache載入一個(gè)額外的插件,用于連接tomcat; 連接時(shí)的配置參數(shù)描述位于Tomcat安裝目錄的/conf目錄下的一個(gè)叫workers.properties文件中,mod_jk一般使用ajp13協(xié)議連接,使用的是tomcat的8009端口。
完成以上配置后,重啟 Apache、Tomcat。此時(shí)Apache、Tomcat的默認(rèn)目錄為 "C:/Program Files/Apache Software Foundation/Tomcat 7.0/webapps ”,Apache使用默認(rèn)的80端口、Tomcat端口改成1080或其它非8080默認(rèn)端口(修改是為了安全,也可以不用修改)。在Tomcat默認(rèn)目錄下添加test目錄,在該目錄下加入index.jsp頁面,然后通過http://localhost/test/index.jsp試試是否可以正常訪問,如頁面可正常訪問,證明整合配置已經(jīng)成功。
至此,似乎整個(gè)配置工作已經(jīng)完成,但是如果你想試著把靜態(tài)的HTML頁面放到Apache的htdocs發(fā)布目錄下,把JSP等動(dòng)態(tài)內(nèi)容放到Tomcat的webapps目錄下(該目錄下不存放*.html文件),然后通過http://localhost/index.html想訪問Apache目錄下的內(nèi)容,你會(huì)發(fā)現(xiàn)404之類的不能訪問的錯(cuò)誤。如何解決,這里暫時(shí)賣個(gè)關(guān)子.......如果你能看出問題,能容易解決掉,就誠摯為你點(diǎn)個(gè)贊!
http://www.jfox.info/guan-yu-Tomcat-he-Tomcat-de-mian-shi-wen-ti
http://www.jfox.info/guan-yu-Tomcat-he-Tomcat-de-mian-shi-wen-ti
關(guān)于Tomcat和Tomcat的面試問題
一、Tomcat的缺省是多少,怎么修改
Tomcat的缺省端口號是8080.
修改Tomcat端口號:
1.找到Tomcat目錄下的conf文件夾
2.進(jìn)入conf文件夾里面找到server.xml文件
3.打開server.xml文件
4.在server.xml文件里面找到下列信息
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />
5.把port=”8080″改成port=”8888″,并且保存
6.啟動(dòng)Tomcat,并且在IE瀏覽器里面的地址欄輸入http://127.0.0.1:8888/
7、tomcat默認(rèn)采用的BIO模型,在幾百并發(fā)下性能會(huì)有很嚴(yán)重的下降。tomcat自帶還有NIO的模型,另外也可以調(diào)用APR的庫來實(shí)現(xiàn)操作系統(tǒng)級別控制。
NIO模型是內(nèi)置的,調(diào)用很方便,只需要將上面配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。如下面的參數(shù)配置,默認(rèn)的是HTTP/1.1。
<Connector port=”8080″
protocol=”org.apache.coyote.http11.Http11NioProtocol”
connectionTimeout=”20000″
redirectPort=”8443″
maxThreads=”500″
minSpareThreads=”20″
acceptCount=”100″
disableUploadTimeout=”true”
enableLookups=”false”
URIEncoding=”UTF-8″ />
二、tomcat 如何優(yōu)化?
1、優(yōu)化連接配置.這里以tomcat7的參數(shù)配置為例,需要修改conf/server.xml文件,修改連接數(shù),關(guān)閉客戶端dns查詢。
參數(shù)解釋:
URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里還有搞個(gè)mod_encoding,還要手工編譯
maxSpareThreads : 如果空閑狀態(tài)的線程數(shù)多于設(shè)置的數(shù)目,則將這些線程中止,減少這個(gè)池中的線程總數(shù)。
minSpareThreads : 最小備用線程數(shù),tomcat啟動(dòng)時(shí)的初始化的線程數(shù)。
enableLookups : 這個(gè)功效和Apache中的HostnameLookups一樣,設(shè)為關(guān)閉。
connectionTimeout : connectionTimeout為網(wǎng)絡(luò)連接超時(shí)時(shí)間毫秒數(shù)。
maxThreads : maxThreads Tomcat使用線程來處理接收的每個(gè)請求。這個(gè)值表示Tomcat可創(chuàng)建的最大的線程數(shù),即最大并發(fā)數(shù)。
acceptCount : acceptCount是當(dāng)線程數(shù)達(dá)到maxThreads后,后續(xù)請求會(huì)被放入一個(gè)等待隊(duì)列,這個(gè)acceptCount是這個(gè)隊(duì)列的大小,如果這個(gè)隊(duì)列也滿了,就直接refuse connection
maxProcessors與minProcessors : 在 Java中線程是程序運(yùn)行時(shí)的路徑,是在一個(gè)程序中與其它控制線程無關(guān)的、能夠獨(dú)立運(yùn)行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最 大利用率的高效程序,使空閑時(shí)間保持最低,從而接受更多的請求。
通常Windows是1000個(gè)左右,Linux是2000個(gè)左右。
useURIValidationHack:
我們來看一下tomcat中的一段源碼:
【security】
if (connector.getUseURIValidationHack()) {
String uri = validate(request.getRequestURI());
if (uri == null) {
res.setStatus(400);
res.setMessage(“Invalid URI”);
throw new IOException(“Invalid URI”);
} else {
req.requestURI().setString(uri);
// Redoing the URI decoding
req.decodedURI().duplicate(req.requestURI());
req.getURLDecoder().convert(req.decodedURI(), true);
可以看到如果把useURIValidationHack設(shè)成”false”,可以減少它對一些url的不必要的檢查從而減省開銷。
enableLookups=”false” : 為了消除DNS查詢對性能的影響我們可以關(guān)閉DNS查詢,方式是修改server.xml文件中的enableLookups參數(shù)值。
disableUploadTimeout :類似于Apache中的keeyalive一樣
給Tomcat配置gzip壓縮(HTTP壓縮)功能
compression=”on” compressionMinSize=”2048″
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
HTTP 壓縮可以大大提高瀏覽網(wǎng)站的速度,它的原理是,在客戶端請求網(wǎng)頁后,從服務(wù)器端將網(wǎng)頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負(fù)責(zé)解壓縮并瀏覽。相對于普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節(jié)省40%左右的流量。更為重要的是,它可以對動(dòng)態(tài)生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網(wǎng)頁也能進(jìn)行壓縮,壓縮效率驚人。
1)compression=”on” 打開壓縮功能
2)compressionMinSize=”2048″ 啟用壓縮的輸出內(nèi)容大小,這里面默認(rèn)為2KB
3)noCompressionUserAgents=”gozilla, traviata” 對于以下的瀏覽器,不啟用壓縮
4)compressableMimeType=”text/html,text/xml” 壓縮類型
最后不要忘了把8443端口的地方也加上同樣的配置,因?yàn)槿绻覀冏遠(yuǎn)ttps協(xié)議的話,我們將會(huì)用到8443端口這個(gè)段的配置,對吧?
<!–enable tomcat ssl–>
<Connector port=”8443″ protocol=”HTTP/1.1″
URIEncoding=”UTF-8″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” disableUploadTimeout=”true” connectionTimeout=”20000″
acceptCount=”300″ maxThreads=”300″ maxProcessors=”1000″ minProcessors=”5″
useURIValidationHack=”false”
compression=”on” compressionMinSize=”2048″
compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”
SSLEnabled=”true”
scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS”
keystoreFile=”d:/tomcat2/conf/shnlap93.jks” keystorePass=”aaaaaa”
/>
好了,所有的Tomcat優(yōu)化的地方都加上了。
2、優(yōu)化JDK
Tomcat默認(rèn)可以使用的內(nèi)存為128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下設(shè)置:
JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化內(nèi)存大小] -Xmx[可以使用的最大內(nèi)存]
或
設(shè)置環(huán)境變量:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化內(nèi)存大小] -Xmx[可以使用的最大內(nèi)存]”
一般說來,你應(yīng)該使用物理內(nèi)存的 80% 作為堆大小。如果本機(jī)上有Apache服務(wù)器,可以先折算Apache需要的內(nèi)存,然后修改堆大小。建議設(shè)置為70%;建議設(shè)置[[初始化內(nèi)存大小]等于[可以使用的最大內(nèi)存],這樣可以減少平凡分配堆而降低性能。
本例使用加入環(huán)境變量的方式:
# vi /etc/profile
加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700
# source /etc/profile
【參數(shù)說明】
-Xms 是指設(shè)定程序啟動(dòng)時(shí)占用內(nèi)存大小。一般來講,大點(diǎn),程序會(huì)啟動(dòng)的 快一點(diǎn),但是也可能會(huì)導(dǎo)致機(jī)器暫時(shí)間變慢。
-Xmx 是指設(shè)定程序運(yùn)行期間最大可占用的內(nèi)存大小。如果程序運(yùn)行需要占 用更多的內(nèi)存,超出了這個(gè)設(shè)置值,就會(huì)拋出OutOfMemory 異常。
-Xss 是指設(shè)定每個(gè)線程的堆棧大小。這個(gè)就要依據(jù)你的程序,看一個(gè)線程 大約需要占用多少內(nèi)存,可能會(huì)有多少線程同時(shí)運(yùn)行等。
-XX:PermSize設(shè)置非堆內(nèi)存初始值,默認(rèn)是物理內(nèi)存的1/64 。
-XX:MaxPermSize設(shè)置最大非堆內(nèi)存的大小,默認(rèn)是物理內(nèi)存的1/4。
三、tomcat 有那幾種Connector 運(yùn)行模式?
tomcat的運(yùn)行模式有3種.修改他們的運(yùn)行模式.3種模式的運(yùn)行是否成功,可以看他的啟動(dòng)控制臺(tái),或者啟動(dòng)日志.或者登錄他們的默認(rèn)頁面http://localhost:8080/查看其中的服務(wù)器狀態(tài)。
1)bio
默認(rèn)的模式,性能非常低下,沒有經(jīng)過任何優(yōu)化處理和支持.
2)nio
利用java的異步io護(hù)理技術(shù),no blocking IO技術(shù).
想運(yùn)行在該模式下,直接修改server.xml里的Connector節(jié)點(diǎn),修改protocol為
<Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol”
connectionTimeout=”20000″
URIEncoding=”UTF-8″
useBodyEncodingForURI=”true”
enableLookups=”false”
redirectPort=”8443″ />
啟動(dòng)后,就可以生效。
3)apr
安裝起來最困難,但是從操作系統(tǒng)級別來解決異步的IO問題,大幅度的提高性能.
必須要安裝apr和native,直接啟動(dòng)就支持apr。下面的修改純屬多余,僅供大家擴(kuò)充知識(shí),但仍然需要安裝apr和native
如nio修改模式,修改protocol為org.apache.coyote.http11.Http11AprProtocol