<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java socket編程

    http://www.cnblogs.com/linzheng/archive/2011/01/23/1942328.html
    http://www.ibm.com/developerworks/cn/linux/l-cn-socketftp/一,網絡編程中兩個主要的問題

    一個是如何準確的定位網絡上一臺或多臺主機,另一個就是找到主機后如何可靠高效的進行數據傳輸。

    在TCP/IP協議中IP層主要負責網絡主機的定位,數據傳輸的路由,由IP地址可以唯一地確定Internet上的一臺主機。

    而TCP層則提供面向應用的可靠(tcp)的或非可靠(UDP)的數據傳輸機制,這是網絡編程的主要對象,一般不需要關心IP層是如何處理數據的。

    目前較為流行的網絡編程模型是客戶機/服務器(C/S)結構。即通信雙方一方作為服務器等待客戶提出請求并予以響應。客戶則在需要服務時向服務器提 出申請。服務器一般作為守護進程始終運行,監聽網絡端口,一旦有客戶請求,就會啟動一個服務進程來響應該客戶,同時自己繼續監聽服務端口,使后來的客戶也 能及時得到服務。

    二,兩類傳輸協議:TCP;UDP

    TCP是Tranfer Control Protocol的 簡稱,是一種面向連接的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的數據流。發送方和接收方的成對的兩個socket之間必須建 立連接,以便在TCP協議的基礎上進行通信,當一個socket(通常都是server socket)等待建立連接時,另一個socket可以要求進行連接,一旦這兩個socket連接起來,它們就可以進行雙向數據傳輸,雙方都可以進行發送 或接收操作。

    UDP是User Datagram Protocol的簡稱,是一種無連接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的。

    比較:

    UDP:1,每個數據報中都給出了完整的地址信息,因此無需要建立發送方和接收方的連接。

                2,UDP傳輸數據時是有大小限制的,每個被傳輸的數據報必須限定在64KB之內。

               3,UDP是一個不可靠的協議,發送方所發送的數據報并不一定以相同的次序到達接收方

    TCP:1,面向連接的協議,在socket之間進行數據傳輸之前必然要建立連接,所以在TCP中需要連接

                    時間。

                2,TCP傳輸數據大小限制,一旦連接建立起來,雙方的socket就可以按統一的格式傳輸大的  

                        數據。

                 3,TCP是一個可靠的協議,它確保接收方完全正確地獲取發送方所發送的全部數據。

    應用:

    1,TCP在網絡通信上有極強的生命力,例如遠程連接(Telnet)和文件傳輸(FTP)都需要不定長度的數據被可靠地傳輸。但是可靠的傳輸是要付出代價的,對數據內容正確性的檢驗必然占用計算機的處理時間和網絡的帶寬,因此TCP傳輸的效率不如UDP高。

    2,UDP操作簡單,而且僅需要較少的監護,因此通常用于局域網高可靠性的分散系統中client/server應用程序。例如視頻會議系統,并不要求音頻視頻數據絕對的正確,只要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。

    三,基于Socket的java網絡編程

    1,什么是Socket

    網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號唯一確定。

    但是,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在Java環境下,Socket編程主要是指基于TCP/IP協議的網絡編程。

    2,Socket通訊的過程

    Server端Listen(監聽)某個端口是否有連接請求,Client端向Server 端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client 端都可以通過Send,Write等方法與對方通信。

    對于一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:

      (1) 創建Socket;

      (2) 打開連接到Socket的輸入/出流;

      (3) 按照一定的協議對Socket進行讀/寫操作;

      (4) 關閉Socket.(在實際應用中,并未使用到顯示的close,雖然很多文章都推薦如此,不過在我的程序中,可能因為程序本身比較簡單,要求不高,所以并未造成什么影響。)

    3,創建Socket

    創建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還是數據報socket,localPort表示本地主機的端口號,localAddr和 bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創建serverSocket又可 以用來創建Socket。count則表示服務端所能支持的最大連接數。例如:學習視頻網 http://www.xxspw.com

      Socket client = new Socket("127.0.01.", 80);

      ServerSocket server = new ServerSocket(80);

      注意,在選擇端口時,必須小心。每一個端口提供一種特定的服務,只有給出正確的端口,才 能獲得相應的服務。0~1023的端口號為系統所保留,例如http服務的端口號為80,telnet服務的端口號為21,ftp服務的端口號為23, 所以我們在選擇端口號時,最好選擇一個大于1023的數以防止發生沖突。

      在創建socket時如果發生錯誤,將產生IOException,在程序中必須對之作出處理。所以在創建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端口發出客戶請求

            BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));

            //由系統標準輸入設備構造BufferedReader對象

            PrintWriter os=new PrintWriter(socket.getOutputStream());

            //由Socket對象得到輸出流,并構造PrintWriter對象

            BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));

            //由Socket對象得到輸入流,并構造相應的BufferedReader對象

            String readline;

            readline=sin.readLine(); //從系統標準輸入讀入一字符串

            while(!readline.equals("bye")){

            //若從標準輸入讀入的字符串為 "bye"則停止循環

              os.println(readline);

              //將從系統標準輸入讀入的字符串輸出到Server

              os.flush();

              //刷新輸出流,使Server馬上收到該字符串

              System.out.println("Client:"+readline);

              //在系統標準輸出上打印讀入的字符串

              System.out.println("Server:"+is.readLine());

              //從Server讀入一字符串,并打印到標準輸出上

              readline=sin.readLine(); //從系統標準輸入讀入一字符串

            } //繼續循環

            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);

            //創建一個ServerSocket在端口4700監聽客戶請求

            }catch(Exception e) {

              System.out.println("can not listen to:"+e);

            //出錯,打印出錯信息

            }

            Socket socket=null;

            try{

              socket=server.accept();

              //使用accept()阻塞等待客戶請求,有客戶

              
    //請求到來則產生一個Socket對象,并繼續執行

            }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));

             //由系統標準輸入設備構造BufferedReader對象

            System.out.println("Client:"+is.readLine());

            //在標準輸出上打印從客戶端讀入的字符串

            line=sin.readLine();

            //從標準輸入讀入一字符串

            while(!line.equals("bye")){

            //如果該字符串為 "bye",則停止循環

              os.println(line);

              //向客戶端輸出該字符串

              os.flush();

              //刷新輸出流,使Client馬上收到該字符串

              System.out.println("Server:"+line);

              //在系統標準輸出上打印讀入的字符串

              System.out.println("Client:"+is.readLine());

              //從Client讀入一字符串,并打印到標準輸出上

              line=sin.readLine();

              //從系統標準輸入讀入一字符串

            }  //繼續循環

            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程序只能實現Server和一個客戶的對話。在實際應用 中,往往是在服務器上運行一個永久的程序,它可以接收來自其他多個客戶端的請求,提供相應的服務。為了實現在服務器方給多個客戶提供服務的功能,需要對上 面的程序進行改造,利用多線程實現多客戶機制。服務器總是在指定的端口上監聽是否有客戶請求,一旦監聽到客戶請求,服務器就會啟動一個專門的服務線程來響 應該客戶的請求,而服務器本身在啟動完線程之后馬上又進入監聽狀態,等待下一個客戶的到來。

    posted @ 2016-06-19 22:20 youngturk 閱讀(172) | 評論 (0)編輯 收藏

    java 環境變量配置

    1. java_home C:\jdk1.6.0_30 2. Path ;%java_home%\bin 3. classpath .;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar

    posted @ 2016-06-19 22:18 youngturk 閱讀(370) | 評論 (0)編輯 收藏

    JVM介紹

    http://www.cnblogs.com/sunada2005/p/3577799.html

    posted @ 2016-06-19 22:11 youngturk 閱讀(150) | 評論 (0)編輯 收藏

    關于Tomcat 6的熱部署和熱加載 轉

    http://greemranqq.iteye.com/blog/1774258 
    http://www.cnblogs.com/-lpf/p/4317281.html
    我在項目開發過程中,經常要改動JAVA/JSP 文件,但是又不想從新啟動服務器(服務器從新啟動花時間),想直接獲得(debug)結果.有兩種方式熱部署 和熱加載:

     

    1.熱加載:在server.xml -> context 屬性中 設置 reloadable="true"

     

    Java代碼  收藏代碼
    1. <Context docBase="xxx" path="/xxx" reloadable="true"/>  

        

     

    2. 熱部署:在server.xml -> context 屬性中 設置  autoDeploy="true"

      

    Java代碼  收藏代碼
    1. <Context docBase="xxx" path="/xxx" autoDeploy="true"/>  

     

    3.區別:

          熱加載:服務器會監聽 class 文件改變,局部進行加載,不清空session ,不釋放內存。開發中用的多,但是要考慮內存溢出的情況。

     

          熱部署: 整個項目從新部署,包括你從新打上.war 文件。 會清空session ,釋放內存。項目打包的時候用的多。

     

    也可以通過Eclipse上設置實現上述配置文件的修改 

    Eclipse的工程名右鍵: properties->Tomcat->General->Make this context as reloadable(reloadable="true")不要選中 Eclipse的工程名右鍵:Tomcat project->Update Context Definition

     

    注意:source 屬性有些版本不支持,容易出錯,去掉就行 

    二。

    不重啟Tomcat有兩種方式:熱部署、熱加載 
      熱部署:容器狀況在運行時重新部署整個項目。這類環境下一般整個內存會清空,重新加載,這類方式 
      有可能會造成sessin丟失等環境。tomcat 6確實可以熱部署了,而且對話也沒丟. 
      熱加載:最好是在調試過程中使用,免患上整個項目加載,Debug標準樣式支持熱加載。容器狀況在運行時重 
      新加載轉變編譯后的類。在這類環境下內存不會清空,sessin不會丟失,但容易造成內存溢出,或者找不到方 
      法。一般轉變類的布局和模型就會有異常,在已經有的變量和方法中轉變是不會出問題的(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服務器在運行狀況下會監視在WEB-INF/classess和WEB- 
      INF/lib目次下的class文件的改動,以及監視web應用的WEB-INF/web.xml文件的改動。要是檢測到的class 
      文件或者web.xml文件被更新,服務器會自動加載Web應用。該屬性的默認值為false.在web應用的開發和調 
      試階段,把reloadable設為true,可以方便對web應用的調試。在web應用正式發布階段,把reloadable設為 
      false,可以減低tomcat的運行負荷,提高Tomcat的運行性能。 
      5>cachingAllowed:要是為true,標示允許啟用靜態資源的緩存。使用緩存能提高拜候靜態資源的效率。 
      tomcat把那一些時常被客戶端拜候的靜態資源(如:HTML文檔、圖片文件和聲響文件等)放在緩存中,當客戶再 
      次拜候有關靜態資源時,Tomcat只需直接從緩存中讀取相關數據,無須反復讀取文件系統中的文件。該屬 
      性的默認值為true. 
      6>cacheMaxSize:設定靜態資源的緩存的最大容量,以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,由于它路程經過過程其他途徑對debug="0"這個屬性進行了使成為事實,所以這搭不能再有此屬性。你只要將它去掉,就能夠沒事了啟動了。 也就是說去掉debug="0“,萬事OK,呵呵。 


    (轉)

    -------------------------------------------------------------

    針對需要重新啟動tomcat的服務,重新啟動方式為:

    安裝版:tomcat/bin/shotdown.bat      關閉tomcat服務

              tomcat/bin/startup.bat         開啟tomcat服務

    或者-->我的電腦-->管理-->服務和應用程序/服務-->找到Apache Tomcat重啟

    posted @ 2016-06-19 21:03 youngturk 閱讀(284) | 評論 (0)編輯 收藏

    apache tomcat mod_js配置整合,

    http://blog.sina.com.cn/s/blog_3c9872d00102w00y.html
    Apache與Tomcat整合應用是一個老話題,不算新技能,但對非運維人員在配置過程中或許也會遇到一些問題。這里只是把自己多回配置的過程做一個摘錄,供自己翻閱并望對過路的人有用。
    Apache是當下在Windows、Unix、Linux 等操作系統中最流行的Web服務器軟件之一,其反應速度快、運行效率高,不僅支持HTML等靜態頁面,在加載插件后也可支持 PHP 頁面等。Tomcat是Apache軟件基金協會與Sun公司聯合開發的Web服務器,除支持HTML靜態頁面外,還是JSP、Servlet等JAVA WEB應用的服務器。在相同運行環境下,Tomcat對靜態頁面的反應速度沒有Apache靈敏,整合 Apache與Tomcat能使系統運行于一個良好環境下,實現JAVA的動態與靜態頁面分離,不僅讓系統更安全,同時也可提高系統效率。

    一、JAVA應用基礎架構

    通用的JAVA應用架構如下,包括WEB Server、APP Server和DB Server三個部分:
    Apache和Tomcat整合配置實現JAVA應用的“動靜”分離
    1、WEB Server
    WEB Server置于企業防火墻外,這個防火墻也可以認為是一個CISCO路由器,在CISCO路由器上開放兩個端口為:80和443,其中:
    80端口:用于正常的http訪問
    443端口:用于https訪問,即如果你在ie里打入https://xxx.xxx.xx這樣的地址,默認走的是443這個端口
    WebServer專門用于解析HTML、JS(JavaScript)、CSS、JPG/GIF等圖片格式文件、TXT、VBSCRIPT、PHP等“靜態”網頁內容。
    2、APP Server
    APP Server置于企業防火墻內,它和Web Server之間的連接必須且一定為內部IP連接。App Server用于解析我們的任何需要Java編譯器才能解析的“動態”網頁,其實App Server本身也能解析任何靜態網頁的。在應用中我們這樣來想一下:我們讓負責專門解析靜態網頁的Web Server來解析html等內容,而讓App Server專門用于解析任何需要Java編譯器才能解析的東西,讓它們各司其職。這樣作的好處:
      1)為App Server“減壓”,同時也提高了性能;
      2)不用再把8080這個端口暴露在internet上,也很安全,畢竟我們的App Server上是有我們的代碼的,就算是編譯過的代碼也容易被“反編譯”,這是很不安全的;
      3)為將來進一步的“集群擴展”打好了基礎。
    3、DB Server
     比方說我們用MySQL,它需要通過3306與App Server進行連接,那么這個1521我們稱為數據庫連接端口,如果把它暴露在Internet上就比較危險,就算密碼很復雜,但 對于高明的黑客來說,要攻破你的口令也只是時間上的問題而己。因此我們把我們的DB Server也和App Server一樣,置于內網的防火墻,任何的DB連接與管理只能通過內網來訪問。
    二、系統安裝與配置
    系統安裝包括MySQL的安裝,WEB Server即Apache的安裝,App Server即Tomcat的安裝。關于這三個系統安裝網上相關的文檔很多,此處略去。以下主要摘錄需要重點配置的內容。
    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,將網站發布路徑與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根目錄下的文件時出現以下錯誤提示:
    Apache和Tomcat整合配置實現JAVA應用的“動靜”分離
    3)再找到下面這樣的行
    Options FollowSymLinks indexes
    把它注掉改成下面這樣
    #Options FollowSymLinks indexes
    Options None
    以免在訪問Apache目錄時出現直接列表顯示子目錄或目錄下文件的不安全情況,如下圖樣子:
    Apache和Tomcat整合配置實現JAVA應用的“動靜”分離
    以上配置修改完成后重啟Apache服務,保證要能正常運行。
    三、Apache與Tomcat的整合配置
    Apache(Web Server)負責處理HTML靜態內容,Tomcat(App Server)負責處理動態內容;原理圖如下:
    Apache和Tomcat整合配置實現JAVA應用的“動靜”分離
    上述架構的原理是: 在Apache中裝載一個模塊,這個模塊叫mod_jk; Apache通過80端口負責解析任何靜態web內容; 任何不能解析的內容,用表達式告訴mod_jk,讓mod_jk派發給相關的App Server去解釋。
    因此,首先把 mod_jk-1.2.31-httpd-2.2.3(可從網上搜索下載該模塊,如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協議所使用的端口相匹配
     worker.list=AJP13
     worker.AJP13.port=8009
     #Tomcat服務器的地址
     worker.AJP13.host=localhost
     #類型
     worker.AJP13.type=ajp13
     #負載平衡因數
     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監聽配置文件地址
    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;  連接時的配置參數描述位于Tomcat安裝目錄的/conf目錄下的一個叫workers.properties文件中,mod_jk一般使用ajp13協議連接,使用的是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試試是否可以正常訪問,如頁面可正常訪問,證明整合配置已經成功。
    至此,似乎整個配置工作已經完成,但是如果你想試著把靜態的HTML頁面放到Apache的htdocs發布目錄下,把JSP等動態內容放到Tomcat的webapps目錄下(該目錄下不存放*.html文件),然后通過http://localhost/index.html想訪問Apache目錄下的內容,你會發現404之類的不能訪問的錯誤。如何解決,這里暫時賣個關子.......如果你能看出問題,能容易解決掉,就誠摯為你點個贊!
     

    posted @ 2016-06-19 20:42 youngturk 閱讀(220) | 評論 (0)編輯 收藏

    關于Tomcat和Tomcat的面試問題

    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模型,在幾百并發下性能會有很嚴重的下降。tomcat自帶還有NIO的模型,另外也可以調用APR的庫來實現操作系統級別控制。
      NIO模型是內置的,調用很方便,只需要將上面配置文件中protocol修改成 org.apache.coyote.http11.Http11NioProtocol,重啟即可生效。如下面的參數配置,默認的是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 如何優化?

     1、優化連接配置.這里以tomcat7的參數配置為例,需要修改conf/server.xml文件,修改連接數,關閉客戶端dns查詢。

    參數解釋:

     URIEncoding=”UTF-8″ :使得tomcat可以解析含有中文名的文件的url,真方便,不像apache里還有搞個mod_encoding,還要手工編譯

     maxSpareThreads : 如果空閑狀態的線程數多于設置的數目,則將這些線程中止,減少這個池中的線程總數。

     minSpareThreads : 最小備用線程數,tomcat啟動時的初始化的線程數。

     enableLookups : 這個功效和Apache中的HostnameLookups一樣,設為關閉。

     connectionTimeout : connectionTimeout為網絡連接超時時間毫秒數。

     maxThreads : maxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數,即最大并發數。

     acceptCount : acceptCount是當線程數達到maxThreads后,后續請求會被放入一個等待隊列,這個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參數值。

     disableUploadTimeout :類似于Apache中的keeyalive一樣

    給Tomcat配置gzip壓縮(HTTP壓縮)功能

    compression=”on” compressionMinSize=”2048″

    compressableMimeType=”text/html,text/xml,text/javascript,text/css,text/plain”

    HTTP 壓縮可以大大提高瀏覽網站的速度,它的原理是,在客戶端請求網頁后,從服務器端將網頁文件壓縮,再下載到客戶端,由客戶端的瀏覽器負責解壓縮并瀏覽。相對于普通的瀏覽過程HTML,CSS,Javascript , Text ,它可以節省40%左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP , JSP , ASP , Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率驚人。

    1)compression=”on” 打開壓縮功能

    2)compressionMinSize=”2048″ 啟用壓縮的輸出內容大小,這里面默認為2KB

    3)noCompressionUserAgents=”gozilla, traviata” 對于以下的瀏覽器,不啟用壓縮

    4)compressableMimeType=”text/html,text/xml” 壓縮類型

    最后不要忘了把8443端口的地方也加上同樣的配置,因為如果我們走https協議的話,我們將會用到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優化的地方都加上了。

    2、優化JDK
    Tomcat默認可以使用的內存為128MB,Windows下,在文件{tomcat_home}/bin/catalina.bat,Unix下,在文件$CATALINA_HOME/bin/catalina.sh的前面,增加如下設置:
    JAVA_OPTS=”‘$JAVA_OPTS” -Xms[初始化內存大小] -Xmx[可以使用的最大內存]

    設置環境變量:export JAVA_OPTS=””$JAVA_OPTS” -Xms[初始化內存大小] -Xmx[可以使用的最大內存]”
    一般說來,你應該使用物理內存的 80% 作為堆大小。如果本機上有Apache服務器,可以先折算Apache需要的內存,然后修改堆大小。建議設置為70%;建議設置[[初始化內存大小]等于[可以使用的最大內存],這樣可以減少平凡分配堆而降低性能。
    本例使用加入環境變量的方式:
    # vi /etc/profile
    加入:export JAVA_OPTS=””$JAVA_OPTS” -Xms700 —Xmx700
    # source /etc/profile

    【參數說明】

    -Xms 是指設定程序啟動時占用內存大小。一般來講,大點,程序會啟動的 快一點,但是也可能會導致機器暫時間變慢。

    -Xmx 是指設定程序運行期間最大可占用的內存大小。如果程序運行需要占 用更多的內存,超出了這個設置值,就會拋出OutOfMemory 異常。

    -Xss 是指設定每個線程的堆棧大小。這個就要依據你的程序,看一個線程 大約需要占用多少內存,可能會有多少線程同時運行等。

    -XX:PermSize設置非堆內存初始值,默認是物理內存的1/64 。

    -XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。

    三、tomcat 有那幾種Connector 運行模式?

    tomcat的運行模式有3種.修改他們的運行模式.3種模式的運行是否成功,可以看他的啟動控制臺,或者啟動日志.或者登錄他們的默認頁面http://localhost:8080/查看其中的服務器狀態。

    1)bio

    默認的模式,性能非常低下,沒有經過任何優化處理和支持.

    2)nio

    利用java的異步io護理技術,no blocking IO技術.

    想運行在該模式下,直接修改server.xml里的Connector節點,修改protocol為

     <Connector port=”80″ protocol=”org.apache.coyote.http11.Http11NioProtocol”
        connectionTimeout=”20000″
        URIEncoding=”UTF-8″
        useBodyEncodingForURI=”true”
        enableLookups=”false”
        redirectPort=”8443″ />

    啟動后,就可以生效。

    3)apr

    安裝起來最困難,但是從操作系統級別來解決異步的IO問題,大幅度的提高性能.

    必須要安裝apr和native,直接啟動就支持apr。下面的修改純屬多余,僅供大家擴充知識,但仍然需要安裝apr和native

    如nio修改模式,修改protocol為org.apache.coyote.http11.Http11AprProtocol

    posted @ 2016-06-19 10:31 youngturk 閱讀(409) | 評論 (0)編輯 收藏

    spring httpInvoke 解決遠程調用遠程的類的方法

    http://zhidao.baidu.com/link?url=6FrnwvBQEZhjM-ooNCuiAra7T6qi9FsFhFvkHBKaOjqovZR86OCsIePi-05nM-fxRrlInEGbElSxlhgO6X7JsaGNdQdNrQ2xE58wglgeQO3 http://blog.csdn.net/liaq325/article/details/8281550 摘自以上 spring httpInvoke

    spring httpInvoke 基于spring架構的服務器之間的遠程調用實現。通過spring httpInvoke,可以調用遠程接口,進行數據交互、業務邏輯操作

    服務器端:(被調用一方)

    [java] view plain copy
    1. public  class User implements Serializable{//必須實現serializable接口,遠程調用的基礎  
    2.     private String username;  
    3.     private Date birthday;  
    4.     //構造方法  
    5.     //set get 方法  
    6. }  
    7. public interface UserService{  
    8.     User getUser(String username);  
    9. }  
    10. public UserServiceImpl implements UserService{  
    11.     //實現userService  
    12. }  
    重要的配置文件來了。。。。
    remote-servlet.xml放在項目根目錄下面,跟web.xml相同的級別

    暴露給調用端:服務的實現,接口

    [html] view plain copy
    1. <bean id="userService" class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">  
    2.     <property name="service">  
    3.         <bean class="com.cd.Liaq.UserServiceImpl"/>  
    4.     </property>  
    5.     <property name="serviceInterface">  
    6.         <value>com.cd.Liaq.UserService</value>  
    7.     </property>  
    8. </bean>  
    暴露了服務的實現和接口,那么怎么訪問服務呢?
    spring封裝訪問url

    [html] view plain copy
    1. <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
    2.     第一種:<property name="urlMap">  
    3.         <map>  
    4.             <entry key="TestUser" value-ref="userService"/>  
    5.         </map>  
    6.     </property>  
    7.     第二種:<prop key="/TestUser">userService</prop>  
    8. </bean>  
    web.xml:配置dispatcherServlet共調用一方使用

    [html] view plain copy
    1. <!-- spring遠程調用 -->  
    2. <servlet>  
    3.     <servlet-name>remote</servlet-name>  
    4.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    5.     <load-on-startup>1</load-on-startup>  
    6. </servlet>  
    7. <servlet-mapping>  
    8.     <servlet-name>remote</servlet-name>  
    9.     <url-pattern>/remoting/*</url-pattern>  
    10. </servlet-mapping>  
    到處為止:被調用端一方完畢!!!!
    客戶端調用:

    [html] view plain copy
    1. <!-- 通過http連接遠程系統 -->  
    2. <bean id="memberService"  
    3.     class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
    4.     <property name="serviceUrl">  
    5.         <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>  
    6.     </property>  
    7.     <property name="serviceInterface">  
    8.         <value>com.cd.Liaq.UserService</value>  
    9.     </property>  
    10. </bean>  
    通過spring容器調用UserService,用到HttpInvokerProxyFactoryBean工廠,配置serviceUrl和serviceInterface
    為了提高效率:客戶端使用Commons-HttpClient,導入改包,改寫配置

    [html] view plain copy
    1. <bean id="memberService"  
    2.     class="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean">  
    3.     <property name="serviceUrl">  
    4.         <value>http://192.9.200.123:8080/MemberSystem/remoting/memberService</value>  
    5.     </property>  
    6.     <property name="serviceInterface">  
    7.         <value>com.cd.Liaq.UserService</value>  
    8.     </property>  
    9.      <property name="httpInvokerRequestExecutor"> //使用指定的執行器執行  
    10.         <ref bean="httpInvokerRequestExecutor" />    
    11.     </property>    
    12. </bean>  
    13. <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">    
    14.     <property name="httpClient">    
    15.         <bean class="org.apache.commons.httpclient.HttpClient">    
    16.             <property name="connectionTimeout" value="2000" />    
    17.             <property name="timeout" value="5000" />    
    18.         </bean>    
    19.     </property>    
    20. </bean>    

    配置超時時間timeout和連接超時connectionTimeout兩個屬性
    優化執行器:多線程===被調用端響應時間縮短很多

    [html] view plain copy
    1. <bean id="httpInvokerRequestExecutor" class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">    
    2.     <property name="httpClient">    
    3.         <bean class="org.apache.commons.httpclient.HttpClient">    
    4.             <property name="connectionTimeout" value="2000" />    
    5.             <property name="timeout" value="5000" />    
    6.             <property  name="httpConnectionManager">//控制連接  
    7.                     <ref  bean="multiThreadedHttpConnectionManager" />    
    8.             </property>    
    9.         </bean>    
    10.     </property>    
    11. </bean>    
    12. <bean id="multiThreadedHttpConnectionManager" class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">    
    13.     <property name="params">    
    14.         <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">    
    15.             <property name="maxTotalConnections"  value="600" />    
    16.             <property name="defaultMaxConnectionsPerHost" value="512" />    
    17.         </bean>    
    18.     </property>    
    19. </bean>    
    httpClient的3.1版本不支持這種配置

    [html] view plain copy
    1. <property  name="connectionTimeout" value="2000" />      
    2. <property  name="timeout"  value="5000" />    

    另外httpClient本身也是多線程的。。HttpClient that uses a default MultiThreadedHttpConnectionManage
    <bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">  
        <property  name="maxTotalConnections"  value="600" />  
        <property  name="defaultMaxConnectionsPerHost"  value="512" />  
    </bean>  
    maxConnectionsPerHost 每個主機的最大并行鏈接數,默認為2 
    public static final int DEFAULT_MAX_HOST_CONNECTIONS = 2; 
    maxTotalConnections 客戶端總并行鏈接最大數,默認為20  
    public static final int DEFAULT_MAX_TOTAL_CONNECTIONS = 20; 

    posted @ 2016-06-19 10:29 youngturk 閱讀(2263) | 評論 (0)編輯 收藏

    6. 分布式緩存集群環境配置 轉

         摘要: http://www.cnblogs.com/hoojo/archive/2012/07/19/2599534.htmlhttp://www.cnblogs.com/hellowood23/p/5210267.htmlhttp://blog.csdn.net/ni_hao_ya/article/details/9344779http://www.cnblogs.com/hellowood23/p/...  閱讀全文

    posted @ 2016-06-19 00:22 youngturk 閱讀(182) | 評論 (0)編輯 收藏

    手動獲取spring的ApplicationContext和bean對象

    WEB項目:

    方法1:

    1
    ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)

     方法2:

    1
    ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)

     方法3:

    1
    寫一個工具類類繼承ApplicationObjectSupport,并將這個加入到spring的容器

     方法4:

    1
    寫一個工具類類繼承WebApplicationObjectSupport,并將這個加入到spring的容器

     方法5:(推薦)

    1
    寫一個工具類實現ApplicationContextAware接口,并將這個加入到spring的容器

     示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    import java.util.Map;
    import org.springframework.beans.BeansException;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
     
    /**
     * 獲取ApplicationContext和Object的工具類
     * @author yzl
     *
     */
    @SuppressWarnings({ "rawtypes", "unchecked" })
    public class SpringContextUtils implements ApplicationContextAware {
        private static ApplicationContext applicationContext;
     
        public void setApplicationContext(ApplicationContext arg0)
                throws BeansException {
            applicationContext = arg0;
        }
     
        /**
         * 獲取applicationContext對象
         * @return
         */
        public static ApplicationContext getApplicationContext(){
            return applicationContext;
        }
         
        /**
         * 根據bean的id來查找對象
         * @param id
         * @return
         */
        public static Object getBeanById(String id){
            return applicationContext.getBean(id);
        }
         
        /**
         * 根據bean的class來查找對象
         * @param c
         * @return
         */
        public static Object getBeanByClass(Class c){
            return applicationContext.getBean(c);
        }
         
        /**
         * 根據bean的class來查找所有的對象(包括子類)
         * @param c
         * @return
         */
        public static Map getBeansByClass(Class c){
            return applicationContext.getBeansOfType(c);
        }
    }

     

     

    非WEB項目

    1
    ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml")

    可選的操作方法有:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    一:
    String[]   path={"WebRoot/WEB-INF/applicationContext.xml","WebRoot/WEB-INF/applicationContext_task.xml"};
    ApplicationContext context = new FileSystemXmlApplicationContext(path);
     
    二:
    String path="WebRoot/WEB-INF/applicationContext*.xml";
    ApplicationContext context = new FileSystemXmlApplicationContext(path);
     
    三:
    ApplicationContext ctx = new FileSystemXmlApplicationContext("classpath:地址");
    沒有classpath的話就是從當前的工作目錄

    posted @ 2016-06-18 23:56 youngturk 閱讀(273) | 評論 (0)編輯 收藏

    Ehcache學習 轉

         摘要: http://ligf06.iteye.com/blog/17108875.    在 Spring 中運用 EHCache需要使用 Spring 來實現一個 Cache 簡單的解決方案,具體需求如下:使用任意一個現有開源 Cache Framework,要求使用 Cache 系統中 Service 或則 DAO 層的...  閱讀全文

    posted @ 2016-06-18 15:45 youngturk 閱讀(152) | 評論 (0)編輯 收藏

    僅列出標題
    共33頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統計

    公告

    this year :
    1 jQuery
    2 freemarker
    3 框架結構
    4 口語英語

    常用鏈接

    留言簿(6)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    相冊

    EJB學習

    Flex學習

    learn English

    oracle

    spring MVC web service

    SQL

    Struts

    生活保健

    解析文件

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产亚洲精品AAAA片APP| 日韩插啊免费视频在线观看| 黄网站在线播放视频免费观看| 日韩欧毛片免费视频| 久久精品国产亚洲AV无码娇色| 免费少妇a级毛片| 无码永久免费AV网站| 亚洲色无码专区一区| 亚洲综合自拍成人| 国产国拍精品亚洲AV片| 国产极品美女高潮抽搐免费网站| 免费的黄色的网站| 亚洲日韩国产AV无码无码精品| 亚洲图片在线观看| 野花高清在线观看免费3中文| 国产99视频精品免费专区| 亚洲高清免费视频| 色屁屁在线观看视频免费| 亚洲中文字幕无码久久2020| 亚洲大尺码专区影院| 亚洲AV第一页国产精品| 成年男女男精品免费视频网站| 猫咪免费人成网站在线观看| 国产精品亚洲天堂| 亚洲精品动漫免费二区| 亚洲精品日韩中文字幕久久久| 永久黄网站色视频免费直播| 免费下载成人电影| 国产va免费精品观看精品| 亚洲黄色免费网站| 精品成在人线AV无码免费看| 黄色毛片免费在线观看| 亚洲AV成人无码久久WWW| 亚洲欧美自偷自拍另类视| 亚洲色偷偷综合亚洲av78| 成人亚洲国产va天堂| 亚洲综合一区国产精品| 亚洲人成77777在线播放网站不卡| 亚洲人成网男女大片在线播放| 国产精品亚洲精品青青青| 国产午夜亚洲精品|