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

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

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