ServerSocket與Socket類
TCP最主要的特征就是能夠建立長時(shí)間的連接,而且能夠保證數(shù)據(jù)安全的送達(dá),但是速度比較慢。使用TCP進(jìn)行連接的時(shí)候會(huì)有三次握手,之后才建立起服務(wù)器與客戶端的連接,因?yàn)門CP的鏈接習(xí)慣是詢問對方機(jī)器是否存在,不存在就不會(huì)建立連接,存在才會(huì)建立連接。
示意圖:

在Java中想要使用TCP協(xié)議做編寫服務(wù)端的話,需要使用到ServerSocke類,這個(gè)類是TCP協(xié)議的。
TCP協(xié)議的操作類都在java.net包下放著,ServerSocket類就是服務(wù)器端,服務(wù)器插座,Socket這個(gè)單詞就是插座的意思。
同樣是TCP協(xié)議并與ServerSocket類相對的是Socket類,這個(gè)類是作為一個(gè)通訊端、客戶端的存在。用于去連接服務(wù)器端,這個(gè)Socket如果是從ServerSocket拿到的對象,那就是與服務(wù)器連接的那個(gè)Socket,如果是自己創(chuàng)建的Socket對象,那你就是客戶端。
在理論上可以有無限個(gè)Socket端來連接ServerSocket端,在ServerSocket端上每有一個(gè)Socket端來連接,就會(huì)創(chuàng)建與之相對的Socket對象。也就是說ServerSocket端上也有Socket對象,每一個(gè)Socket就像插座上的插孔一樣,連接著通訊端的Socket對象。
示意圖:

ServerSocket類可以編寫服務(wù)器端,Socket類可以用來編寫客戶端。創(chuàng)建ServerSocket對象的時(shí)候需要聲明一個(gè)端口號,這樣通訊端才能通過端口號去連接。創(chuàng)建Socket對象的時(shí)候則需要聲明一個(gè)IP地址和ServerSocket對象的端口號,這樣才能對服務(wù)端發(fā)出連接請求。在發(fā)出連接請求成功連接后,Socket通訊端會(huì)創(chuàng)建兩個(gè)流,一個(gè)是InputStream流一個(gè)是OutputStream流。同時(shí),ServerSocket服務(wù)器端會(huì)得到一個(gè)Socket對象,然后這個(gè)Socket對象也會(huì)創(chuàng)建出InputStream流和OutputStream流。
示意圖:

上面只是粗略的說一下如何建立的連接,實(shí)際上ServerSocket服務(wù)器端的Socket對象是通過accept();方法得到的,這個(gè)方法監(jiān)聽著聲明的端口號。一旦有通訊端來連接,就會(huì)創(chuàng)建Socket對象,客戶端和服務(wù)器端建立連接成功之后就通過InputStream流和OutputStream流來進(jìn)行交互數(shù)據(jù)。
完整示意圖:

明白了兩個(gè)類之間的聯(lián)系后,我們就開始嘗試編寫一個(gè)服務(wù)器端吧。我們使用瀏覽器作為Socket端,因?yàn)闉g覽器也是TCP協(xié)議的,所以可以連接到我們編寫的服務(wù)器端。(提示:如果確定編寫的代碼無誤,但是瀏覽器卻連接不到編寫的服務(wù)端,可以更換IE瀏覽器試一下)
代碼示例:

運(yùn)行結(jié)果:

瀏覽器會(huì)發(fā)送一段瀏覽器的信息:

我們還可以使用字節(jié)流,讀取一些漂亮妹子照片的并通過網(wǎng)絡(luò)流輸出到瀏覽器上,估計(jì)很多屌絲們就精神一震了(手動(dòng)滑稽)。
代碼示例:

運(yùn)行結(jié)果:

現(xiàn)在我們已經(jīng)知道如何編寫服務(wù)器端,并且知道可以使用瀏覽器作為客戶端去進(jìn)行連接了,那么接下來使用Socket類進(jìn)行編寫一個(gè)客戶端,簡單的與服務(wù)器端交互一下數(shù)據(jù)。服務(wù)器端的編寫和上面的第一個(gè)示例沒有區(qū)別,就不過多解釋。
客戶端則是需要聲明一個(gè)ip地址和端口號,這個(gè)端口號是服務(wù)器端的端口號,這點(diǎn)要注意。然后同樣的通過流來交互數(shù)據(jù),讀取或輸出數(shù)據(jù)時(shí),需要看一下服務(wù)器端是先讀取還是先輸出,服務(wù)器端先讀取的話客戶端就需要先編寫輸出數(shù)據(jù)的代碼,否則反之。關(guān)于這個(gè)誰先讀取或輸出是沒有規(guī)定的,都是根據(jù)另一端的編寫的代碼來決定。
服務(wù)器端代碼示例:

客戶端代碼示例:

運(yùn)行結(jié)果:

當(dāng)有兩個(gè)結(jié)果并且想要兩個(gè)控制臺界面時(shí),可以點(diǎn)擊這里,選擇NewConsoleView新建控制臺:


代碼之間的關(guān)系示意:

多網(wǎng)卡就是一臺計(jì)算機(jī)中有好幾個(gè)網(wǎng)卡,一般普通PC電腦有兩個(gè)網(wǎng)卡,一個(gè)物理網(wǎng)卡,一個(gè)虛擬網(wǎng)卡。筆記本電腦則一般有三個(gè)網(wǎng)卡一個(gè)無線網(wǎng)卡,一個(gè)物理網(wǎng)卡,一個(gè)虛擬網(wǎng)卡。
一般在服務(wù)器上有很多個(gè)網(wǎng)卡,所以就有很多網(wǎng)線接口,因?yàn)橛行┓?wù)器會(huì)需要“三合一網(wǎng)絡(luò)”,“三合一網(wǎng)絡(luò)”就是將聯(lián)通、電信、移動(dòng)的網(wǎng)線都接入到這臺服務(wù)器里,那這臺服務(wù)器就能同時(shí)使用三個(gè)運(yùn)營商的網(wǎng)絡(luò)了。
而且因?yàn)榉?wù)器機(jī)房里一般都是有很多臺服務(wù)器在進(jìn)行集群,所以也需要一部分網(wǎng)絡(luò)接口用于連接內(nèi)部的集群網(wǎng)絡(luò),一部分網(wǎng)絡(luò)接口則連接通過防火墻之類的安全措施過濾后的外部網(wǎng)絡(luò)。
多網(wǎng)卡服務(wù)器圖片:
