1. 程式人生 > >apache和tomcat三種連線方式

apache和tomcat三種連線方式

首先我們先介紹一下為什麼要讓 Apache 與 Tomcat 之間進行連線。事實上 Tomcat 本身已經提供了 HTTP 服務,該服務預設的埠是 8080,裝好 tomcat 後通過 8080 埠可以直接使用 Tomcat 所執行的應用程式,你也可以將該埠改為 80。

既然 Tomcat 本身已經可以提供這樣的服務,我們為什麼還要引入 Apache 或者其他的一些專門的 HTTP 伺服器呢?原因有下面幾個:

1. 提升對靜態檔案的處理效能

2. 利用 Web 伺服器來做負載均衡以及容錯

3. 無縫的升級應用程式

這三點對一個 web 網站來說是非常之重要的,我們希望我們的網站不僅是速度快,而且要穩定,不能因為某個 Tomcat 宕機或者是升級程式導致使用者訪問不了,而能完成這幾個功能的、最好的 HTTP 伺服器也就只有 apache 的 http server 了,它跟 tomcat 的結合是最緊密和可靠的。

接下來我們介紹三種方法將 apache 和 tomcat 整合在一起。

JK

這是最常見的方式,你可以在網上找到很多關於配置JK的網頁,當然最全的還是其官方所提供的文件。JK 本身有兩個版本分別是 1 和 2,目前 1 最新的版本是 1.2.19,而版本 2 早已經廢棄了,以後不再有新版本的推出了,所以建議你採用版本 1。

JK 是通過 AJP 協議與 Tomcat 伺服器進行通訊的,Tomcat 預設的 AJP Connector 的埠是 8009。JK 本身提供了一個監控以及管理的頁面 jkstatus,通過 jkstatus 可以監控 JK 目前的工作狀態以及對到 tomcat 的連線進行設定,如下圖所示:

圖 1:監控以及管理的頁面 jkstatus
圖 1:監控以及管理的頁面 jkstatus

在這個圖中我們可以看到當前JK配了兩個連線分別到 8109 和 8209 埠上,目前 s2 這個連線是停止狀態,而 s1 這個連線自上次重啟後已經處理了 47 萬多個請求,流量達到 6.2 個 G,最大的併發數有 13 等等。我們也可以利用 jkstatus 的管理功能來切換 JK 到不同的 Tomcat 上,例如將 s2 啟用,並停用 s1,這個在更新應用程式的時候非常有用,而且整個切換過程對使用者來說是透明的,也就達到了無縫升級的目的。關於 JK 的配置文章網上已經非常多了,這裡我們不再詳細的介紹整個配置過程,但我要講一下配置的思路,只要明白了配置的思路,JK 就是一個非常靈活的元件。

JK 的配置最關鍵的有三個檔案,分別是

httpd.conf 
Apache 伺服器的配置檔案,用來載入 JK 模組以及指定 JK 配置檔案資訊

workers.properties
到 Tomcat 伺服器的連線定義檔案

uriworkermap.properties
URI 對映檔案,用來指定哪些 URL 由 Tomcat 處理,你也可以直接在 httpd.conf 中配置這些 URI,但是獨立這些配置的好處是 JK 模組會定期更新該檔案的內容,使得我們修改配置的時候無需重新啟動 Apache 伺服器。

其中第二、三個配置檔名都可以自定義。下面是一個典型的 httpd.conf 對 JK 的配置

# (httpd.conf)
# 載入 mod_jk 模組
LoadModule jk_module modules/mod_jk.so

#
# Configure mod_jk
#

JkWorkersFile conf/workers.properties
JkMountFile conf/uriworkermap.properties
JkLogFile logs/mod_jk.log
JkLogLevel warn

接下來我們在 Apache 的 conf 目錄下新建兩個檔案分別是 workers.properties、uriworkermap.properties。這兩個檔案的內容大概如下

#
# workers.properties
#


# list the workers by name

worker.list=DLOG4J, status

# localhost server 1
# ------------------------
worker.s1.port=8109
worker.s1.host=localhost
worker.s1.type=ajp13

# localhost server 2
# ------------------------
worker.s2.port=8209
worker.s2.host=localhost
worker.s2.type=ajp13
worker.s2.stopped=1

worker.DLOG4J.type=lb
worker.retries=3
worker.DLOG4J.balanced_workers=s1, s2
worker.DLOG4J.sticky_session=1

worker.status.type=status

以上的 workers.properties 配置就是我們前面那個螢幕抓圖的頁面所用的配置。首先我們配置了兩個型別為 ajp13 的 worker 分別是 s1 和 s2,它們指向同一臺伺服器上執行在兩個不同埠 8109 和 8209 的 Tomcat 上。接下來我們配置了一個型別為 lb(也就是負載均衡的意思)的 worker,它的名字是 DLOG4J,這是一個邏輯的 worker,它用來管理前面配置的兩個物理連線 s1 和 s2。最後還配置了一個型別為 status 的 worker,這是用來監控 JK 本身的模組。有了這三個 worker 還不夠,我們還需要告訴 JK,哪些 worker 是可用的,所以就有 worker.list = DLOG4J, status 這行配置。

接下來便是 URI 的對映配置了,我們需要指定哪些連結是由 Tomcat 處理的,哪些是由 Apache 直接處理的,看看下面這個檔案你就能明白其中配置的意義

/*=DLOG4J
/jkstatus=status

!/*.gif=DLOG4J
!/*.jpg=DLOG4J
!/*.png=DLOG4J
!/*.css=DLOG4J
!/*.js=DLOG4J
!/*.htm=DLOG4J
!/*.html=DLOG4J

相信你已經明白了一大半了:所有的請求都由 DLOG4J 這個 worker 進行處理,但是有幾個例外,/jkstatus 請求由 status 這個 worker 處理。另外這個配置中每一行資料前面的感嘆號是什麼意思呢?感嘆號表示接下來的 URI 不要由 JK 進行處理,也就是 Apache 直接處理所有的圖片、css 檔案、js 檔案以及靜態 html 文字檔案。

通過對 workers.properties 和 uriworkermap.properties 的配置,可以有各種各樣的組合來滿足我們前面提出對一個 web 網站的要求。您不妨動手試試!

http_proxy

這是利用 Apache 自帶的 mod_proxy 模組使用代理技術來連線 Tomcat。在配置之前請確保是否使用的是 2.2.x 版本的 Apache 伺服器。因為 2.2.x 版本對這個模組進行了重寫,大大的增強了其功能和穩定性。

http_proxy 模式是基於 HTTP 協議的代理,因此它要求 Tomcat 必須提供 HTTP 服務,也就是說必須啟用 Tomcat 的 HTTP Connector。一個最簡單的配置如下

ProxyPass /images !
ProxyPass /css !
ProxyPass /js !
ProxyPass / http://localhost:8080/

在這個配置中,我們把所有 http://localhost 的請求代理到 http://localhost:8080/ ,這也就是 Tomcat 的訪問地址,除了 images、css、js 幾個目錄除外。我們同樣可以利用 mod_proxy 來做負載均衡,再看看下面這個配置

ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !

ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember http://server1:8080/
BalancerMember http://server2:8080/
BalancerMember http://server3:8080/
</Proxy>

配置比 JK 簡單多了,而且它也可以通過一個頁面來監控叢集執行的狀態,並做一些簡單的維護設定。

圖 2:監控叢集執行狀態
圖 2:監控叢集執行狀態

ajp_proxy

ajp_proxy 連線方式其實跟 http_proxy 方式一樣,都是由 mod_proxy 所提供的功能。配置也是一樣,只需要把 http:// 換成 ajp:// ,同時連線的是 Tomcat 的 AJP Connector 所在的埠。上面例子的配置可以改為:

ProxyPass /images !
ProxyPass /css ! 
ProxyPass /js !

ProxyPass / balancer://example/
<Proxy balancer://example/>
BalancerMember ajp://server1:8080/
BalancerMember ajp://server2:8080/
BalancerMember ajp://server3:8080/
</Proxy>

採用 proxy 的連線方式,需要在 Apache 上載入所需的模組,mod_proxy 相關的模組有 mod_proxy.so、mod_proxy_connect.so、mod_proxy_http.so、mod_proxy_ftp.so、mod_proxy_ajp.so, 其中 mod_proxy_ajp.so 只在 Apache 2.2.x 中才有。如果是採用 http_proxy 方式則需要載入 mod_proxy.so 和 mod_proxy_http.so;如果是 ajp_proxy 則需要載入 mod_proxy.so 和 mod_proxy_ajp.so這兩個模組。

三者比較

相對於 JK 的連線方式,後兩種在配置上是比較簡單的,靈活性方面也一點都不遜色。但就穩定性而言就不像 JK 這樣久經考驗,畢竟 Apache 2.2.3 推出的時間並不長,採用這種連線方式的網站還不多,因此,如果是應用於關鍵的網際網路網站,還是建議採用 JK 的連線方式。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

叢集與負載平衡
    使用mod_jk預設的以輪循方式進行平衡負載,而叢集方式也是使用這種方法進行平衡。Tomcat中的叢集原理是通過組播的方式進行節點的查詢並使用TCP連線進行會話的複製。

    叢集不同於負載平衡的是,由於叢集服務需要在處理請求之間不斷地進行會話複製,複製後的會話將會慢慢變得龐大,因此它的資源佔用率是非常高的,如果在併發量大的應用中,複製的會話大小會變得相當大,而使用的總記憶體更是會迅速升高。

    但叢集的會話複製,增加了系統的高可用性。由於在每臺伺服器都儲存有使用者的Session資訊,如果伺服器群中某臺當機,應用可以自動切換到其它伺服器上繼續執行,而使用者的資訊不會丟失,這提高了應用的冗錯性。

    具體採用負載平衡還是叢集,這要看應用的需求了。

安裝配置Apache

    安裝前請確認IIS服務停止,因為Apache可能會使用80埠.

、下載 Apache 的安裝程式 apache_2.2.3-win32-x86-no_ssl.exe 後,安裝很簡單,一路回車,就此略過。

、安裝完畢後,將下載的 mod_jk-1.2.20-apache-2.2.3.so改名為mod_jk.so並 複製到 Apache 安裝目錄下的 modules 子目錄中。

、然後進入 Apache 安裝目錄下的 conf 子目錄中,開啟 httpd.conf 配置檔案,在最後插入以下一行: Include conf/mod_jk.conf

4、 conf 子目錄下,建立一個新的配置檔案: mod_jk.conf ,此檔案為 Apache 載入聯結器的配置檔案,檔名可修改,但要與 httpd.conf  Include 的檔名一致,在logs子目錄下建立日誌檔案mod_jk.log,mod_jk.conf內容如下:

 # Load mod_jk module
# Specify the filename of the mod_jk lib
LoadModule jk_module modules/mod_jk.so

# Where to find workers.properties
JkWorkersFile conf/workers.properties

# Where to put jk logs
JkLogFile logs/mod_jk.log

# Set the jk log level  [ debug/error/info ] 
JkLogLevel info

# Select the log format
JkLogStampFormat  " [%a %b %d %H:%M:%S %Y] " 
 
# JkOptions indicates to send SSK KEY SIZE
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

# JkRequestLogFormat
JkRequestLogFormat  " %w %V %T " 
 
# Mount your applications
JkMount /* loadbalancer

# You can use external file for mount points.
# It will be checked for updates each  60  seconds.
# The format of the file is: /url = worker
# /examples/* = loadbalancer
JkMountFile conf/uriworkermap.properties

# Add shared memory.
# This directive is present with  1.2.10  and
# later versions of mod_jk ,  and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm

# Add jkstatus for managing runtime data
<Location /jkstatus/>
    JkMount status
    Order deny , allow
    Deny from all
    Allow from  127.0.0.1 
</Location>
注: 該檔案中,有兩處設定比較重要:LoadModule與JkMount。LoadModule中要正確設定mod_jk的路徑;JkMount指明Apache需要將哪些url進行轉發,在上面 的設定中,Apache將會把url路徑為 /application/* 的請求傳送到mod_jk負載均衡。通過該方式,可以配置Apache提供靜態Web頁面服務,並把動態頁面功能轉發到JBOSS伺服器。如果希望所有的服務都由JBOSS叢集服務提供,則把JKMount設定為JkMount /* loadbalancer即可。

5、conf
子目錄下,建立一個新的配置檔案:workers.properties,此檔案為負載平衡的配置檔案,檔名不能修改,這是JK預設的名字,內容如下:
# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status


# Define Node1
# modify the host as your host IP or DNS name.
worker.node1.port=8009
worker.node1.host=localhost
worker.node1.type=ajp13
worker.node1.lbfactor=1
#worker.node1.cachesize=1000


# Define Node2
# modify the host as your host IP or DNS name.
worker.node2.port=8009
worker.node2.host=10.225.69.111
worker.node2.type=ajp13
worker.node2.lbfactor=1
#worker.node2.cachesize=1000
#worker.node2.stopped=1


# Define Node3
# modify the host as your host IP or DNS name.
worker.node3.port=8009
worker.node3.host=10.225.69.75
worker.node3.type=ajp13
worker.node3.lbfactor=1
#worker.node3.cachesize=1000
#worker.node3.stopped=1


# Load-balancing behaviour
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2,node3
worker.loadbalancer.sticky_session=1


#worker.list=loadbalancer
# Status worker for managing load balancer
worker.status.type=status
除了通過 JKMount 設定轉發路徑外,你可以通過 JkMountFile 詳細設定哪些 url 需要通過 mod_jk 進行負載均衡轉發。通過在 APACHE_HOME/conf 目錄下建立檔案 uriworkermap.properties 進行控制,檔案格式為 /url=worker_name:
# Simple worker configuration file
# Mount the Servlet context to the ajp13 worker

/*=loadbalancer
!/*.gif=loadbalancer
!/*.jpg=loadbalancer
!/*.png=loadbalancer
!/*.css=loadbalancer
!/*.js=loadbalancer
!/*.htm=loadbalancer
!/*.html=loadbalancer

/prweb/*=loadbalancer
#/jmx-console/*=loadbalancer
#/web-console=loadbalancer
#/web-console/*=loadbalancer

注:以上定義了三個worker,分別為node1,node2,node2;8009埠是Tomcat預設的ajp埠;定義了一個負載平衡伺服器loadbalancer,相關的詳細說明可以看官方的網站文件:http://tomcat.apache.org/connectors-doc/,其它節點的定義可以直接Copy,修改一下節點名及IP就好了。
Aworker.list=loadbalancer

設定工作的負載平衡器,各Tomcat節點不能加入此列表。

       Bworker.server99.lbfactor

負載平衡的權重比,如果此權重比越大,則分配到此節點的請求越多,如以上兩個節點的權重比為1:1,則為平均分配。

Cworker.loadbalancer.balance_workers=node1,node2,node3

   指定此負載平衡器負責的Tomcat應用節點。

Dworker.loadbalancer.sticky_session=true

   此處指定叢集是否需要會話複製,如果設為true,則表明為會話粘性,不進行會話複製,當某使用者的請求第一次分發到哪臺Tomcat後,後繼的請求會一直分發到此Tomcat伺服器上處理;如果設為false,則表明需求會話複製。當設定為0(false)時,是基於請求的負載均衡,為1(true)時是基於使用者的負載均衡。

Eworker.loadbalancer.sticky_session_force=true

   如果上面的sticky_session設為true時,建議此處也設為true,此引數表明如果叢集中某臺Tomcat伺服器在多次請求沒有響應後,是否將當前的請求,轉發到其它Tomcat伺服器上處理;此引數在sticky_session=true時,影響比較大,會導致轉發到其它Tomcat伺服器上的請求,找不到原來的session,所以如果此時請求中有讀取session中某些資訊的話,就會導致應用的null異常。


參考:
http://www.blogjava.net/zolly/archive/2006/12/12/Apache_Tomcat.html
http://www.qqread.com/z/apache/index-0.html
http://www.javazy.com/contentex/200641293233.shtml
http://www.newasp.net/tech/java/14456.html
http://amqir.itpub.net/

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

Apache虛擬主機(vhost)配置教程

作者:星之宇 ┊ 時間:2012-12-16 9:36 ┊ 分類: 網站技術 ┊ 閱讀:13117 ┊ 評論:1

使用apache來配置虛擬主機,在單一系統上執行多個網站。

現在很多linux主機使用apache作為web伺服器的,大部分是基於這個原理來配置虛擬主機的。

下面就windows下以apache 2.4.3作為演示的一個教程。

這裡只是簡單的說明下,簡述實現的原理

1.Apache的配置檔案httpd.conf,找到Virtual hosts,進行如下修改儲存。

# Virtual hosts#Include conf/extra/httpd-vhosts.conf去掉第2行的‘#’號,改為# Virtual hostsInclude conf/extra/httpd-vhosts.conf

這樣就開啟了extra資料夾下的httpd-vhosts.conf,以後修改虛擬主機只要在這個檔案進行。

2.對httpd-vhosts.conf進行配置。

例如域名www.a.com和www.b.com

# Virtual Hosts## Required modules: mod_log_config# If you want to maintain multiple domains/hostnames on your# machine you can setup VirtualHost containers for them. Most configurations# use only name-based virtual hosts so the server doesn't need to worry about# IP addresses. This is indicated by the asterisks in the directives below.## Please see the documentation at # <URL:http://httpd.apache.org/docs/2.4/vhosts/># for further details before you try to setup virtual hosts.## You may use the command line option '-S' to verify your virtual host# configuration.## VirtualHost example:# Almost any Apache directive may go into a VirtualHost container.# The first VirtualHost section is used for all requests that do not# match a ServerName or ServerAlias in any <VirtualHost> block.#<VirtualHost*:80>ServerAdmin [email protected].com
    DocumentRoot"d:/www/a"ServerName a.com
    ServerAlias www.a.com
    ErrorLog"logs/a.com.log"CustomLog"logs/a.com.log" common
    <Directory"d:/www/a">Require all granted   
    </Directory> 
</VirtualHost><VirtualHost*:80>ServerAdmin [email protected].com
    DocumentRoot"d:/www/b"ServerName b.com
    ServerAlias www.b.com
    ErrorLog"logs/b.com.log"CustomLog"logs/b.com.log" common
    <Directory"d:/www/b">Require all granted   
    </Directory> 
</VirtualHost>

注意:apache 2.4以上版本中需要在目錄下面新增 Require all granted,否則無論怎麼訪問都是403。

這個我也查找了好久才查出的原因,官方文件也沒有找到說明的地方。


相關推薦

apachetomcat連線方式

首先我們先介紹一下為什麼要讓 Apache 與 Tomcat 之間進行連線。事實上 Tomcat 本身已經提供了 HTTP 服務,該服務預設的埠是 8080,裝好 tomcat 後通過 8080 埠可以直接使用 Tomcat 所執行的應用程式,你也可以將該埠改為 80。

Apache HTTP Server 與 Tomcat連線方式介紹

首先我們先介紹一下為什麼要讓 Apache 與 Tomcat 之間進行連線。事實上 Tomcat 本身已經提供了 HTTP 服務,該服務預設的埠是 8080,裝好 tomcat 後通過 8080 埠可以直接使用 Tomcat 所執行的應用程式,你也可以將該埠改為 80。

Server 與Tomcat連線方式介紹

以上的 workers.properties 配置就是我們前面那個螢幕抓圖的頁面所用的配置。首先我們配置了兩個型別為 ajp13 的 worker 分別是 s1 和 s2,它們指向同一臺伺服器上執行在兩個不同埠 8109 和 8209 的 Tomcat 上。接下來我們配置了一個型別為 lb(也就是負載均衡的意

oracle中Normal,sysdba,sysoper連線方式使用者sys,system,sysdba,scott

sys和system使用者的區別 【system】使用者只能用normal身份登陸em。 【sys】使用者具有“SYSDBA”或者“SYSOPER”許可權,登陸em也只能用這兩個身份,不能用normal。 “SYSOPER”許可權,即資料庫操作員許可權,許可權包括:   開啟資料庫伺服器   關閉資料庫伺服

JDBC連線方式

第一種連線方式 package cn.itheima.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.

oracle連線方式

1.sid: 格式一: Oracle JDBC Thin using an SID:  jdbc:oracle:thin:@host:port:SID  Example: jdbc:oracle:thin:@localhost:1521:orcl  這種格式是最簡單也是用得

Dubbo的連線方式

1、採用zookeeper作為註冊中心 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://ww

Java連線Oracle資料庫的連線方式

背景: 這兩天在學習Oracle資料庫,這裡就總結下自己上課所學的知識,同時記錄下來,方便整理當天所學下的知識,也同時方便日後自己查詢。 SQL語句的話,這裡我就不多講了,感覺和其他的資料庫(MySQL、SQL Server)都是類似,區別不大。 今天在這

Hive學習 ()Hive的連線連線方式

目錄一、CLI連線二、HiveServer2/beeline    1、修改 hadoop 叢集的 hdfs-site.xml 配置檔案    2、修改 hadoop 叢集的 core-site.xml 配置檔案三、Web UI正文:一、CLI連線進入到 bin 目錄下,直接

redis連線方式

Part I. 直接啟動 下載 官網下載 安裝 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 編譯 make #可使用root使用者執行`make install`,將可執行檔案拷貝到/usr/local/b

hana的連線方式

環境準備 java1.6以上版本 hana jdbc jar包 通過cmd連線hana 在hana jdbc jar包所在目錄執行,其中-u 資料庫賬號,密碼,-n  IP:埠 ,-c   操作語句 埠:3 + instance number + 15

C++函數的傳遞方式為:值傳遞、指針傳遞引用傳遞

否則 方式 指針 指向 out 數據結構 logs 形參 使用 C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞 值傳遞: void fun(int x){ x += 5; //修改的只是y在棧中copy x,x只是y的一個副本,在內存中重新開辟的一塊臨時空間把y

繼承方式訪問權限

-a prot play 9.png png -h .cn orm font 也就是說子類只能訪問父類的保護和公有成員,而對象只能訪問公有成員。繼承方式 1. 三種繼承方式不影響子類對父類的訪問權限,子類對父類只看父類的訪問控制權。 2. 繼承

apache分別基於方案實現tomcat的代理、負載均衡及會話綁定

tomcat apacheapache分別基於mod_proxy_ajp, mod_proxy_http, mod_jk三種方案實現代理、負載均衡、會話綁定及Tomcat session cluster1、nginx, haproxy, apache(mod_proxy_ajp, mod_proxy_http

Apache Prefork、WorkerEventMPM分析

更多 可用 make ret 負載 install 插入 mic per 三種MPM介紹   Apache 2

elasticsearch 的兩連線方式+客戶端

  所有語言 所有語言可以使用 RESTful API 通過埠 9200 和 Elasticsearch 進行通訊,你可以用你最喜愛的 web 客戶端訪問 Elasticsearch 。事實上,正如你所看到的,你甚至可以使用 curl&n

C++: 繼承多型(一)繼承方式與許可權

繼承 在C++中,我們常要對某個函式進行多次複用,例如: 資訊管理系統中,對於教師、學生、教務人員等"類"而言,有部分資訊是通用的:姓名,性別,年齡,聯絡方式等。如果為每一種角色都編寫一個"類",會有不少重複的程式碼,造成效率上的浪費。       &nbs

常量的定義方式static在c語言中的修飾

c語言的常量在執行期間為固定值,在定義後無法被修改常量可以是任何的資料基本型別,可以為整形,浮點常量,字元和字串常量1,使用const關鍵字2, 使用巨集定義3,使用列舉常量   列舉: 1 #include<stdio.h> 2 int main(){ 3 e

Java程式碼複用的常用方式:繼承、組合代理

複用程式碼是Java眾多引人注目的功能之一。這句話很通順,沒什麼問題,但問題在於很多人並不清楚“複用”是什麼。就好像我說“沉默王二是一個不止會寫程式碼的程式設計師”,唉,沉默王二是誰? 如果想學習Java工程化、高效能及分散式、深入淺出。微服務、Spring,MyBatis,Netty原始碼分析的朋友可以加

併發伺服器實現方式之程序、執行緒select

  前言:剛開始學網路程式設計,都會先寫一個客戶端和服務端,不知道你們有沒有試一下:再開啟一下客戶端,是連不上服務端的。還有一個問題不知道你們發現沒:有時啟伺服器,會提示“Address already in use”,過一會就好了,想過為啥麼?在這篇部落格會解釋這個問題。   但現實的伺服器都會連很多客戶