8.3 基于Socket(套接字)的低層次Java網(wǎng)絡(luò)編程
8.3.1 Socket通訊
網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱(chēng)為一個(gè)Socket。Socket通常用來(lái)實(shí)現(xiàn)客戶(hù)方和服務(wù)方的連接。Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面,一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號(hào)確定。
在傳統(tǒng)的UNIX環(huán)境下可以操作TCP/IP協(xié)議的接口不止Socket一個(gè),Socket所支持的協(xié)議種類(lèi)也不光TCP/IP一種,因此兩者之間是沒(méi)有必然聯(lián)系的。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。
說(shuō)Socket編程是低層次網(wǎng)絡(luò)編程并不等于它功能不強(qiáng)大,恰恰相反,正因?yàn)閷哟蔚停琒ocket編程比基于URL的網(wǎng)絡(luò)編程提供了更強(qiáng)大的功能和更靈活的控制,但是卻要更復(fù)雜一些。由于Java本身的特殊性,Socket編程在Java中可能已經(jīng)是層次最低的網(wǎng)絡(luò)編程接口,在Java中要直接操作協(xié)議中更低的層次,需要使用Java的本地方法調(diào)用(JNI),在這里就不予討論了。
8.3.2 Socket通訊的一般過(guò)
前面已經(jīng)提到Socket通常用來(lái)實(shí)現(xiàn)C/S結(jié)構(gòu)。
使用Socket進(jìn)行Client/Server程序設(shè)計(jì)的一般連接過(guò)程是這樣的:Server端Listen(監(jiān)聽(tīng))某個(gè)端口是否有連接請(qǐng)求,Client端向Server端發(fā)出Connect(連接)請(qǐng)求,Server端向Client端發(fā)回Accept(接受)消息。一個(gè)連接就建立起來(lái)了。Server端和Client端都可以通過(guò)Send,Write等方法與對(duì)方通信。
如圖
對(duì)于一個(gè)功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過(guò)程包含以下四個(gè)基本的步驟:
(1) 創(chuàng)建Socket;
(2) 打開(kāi)連接到Socket的輸入/出流;
(3) 按照一定的協(xié)議對(duì)Socket進(jìn)行讀/寫(xiě)操作;
(4) 關(guān)閉Socket.
第三步是程序員用來(lái)調(diào)用Socket和實(shí)現(xiàn)程序功能的關(guān)鍵步驟,其他三步在各種程序中基本相同。
以上4個(gè)步驟是針對(duì)TCP傳輸而言的,使用UDP進(jìn)行傳輸時(shí)略有不同,在后面會(huì)有具體講解。
8.3.1 Socket通訊
網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱(chēng)為一個(gè)Socket。Socket通常用來(lái)實(shí)現(xiàn)客戶(hù)方和服務(wù)方的連接。Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面,一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號(hào)確定。
在傳統(tǒng)的UNIX環(huán)境下可以操作TCP/IP協(xié)議的接口不止Socket一個(gè),Socket所支持的協(xié)議種類(lèi)也不光TCP/IP一種,因此兩者之間是沒(méi)有必然聯(lián)系的。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。
說(shuō)Socket編程是低層次網(wǎng)絡(luò)編程并不等于它功能不強(qiáng)大,恰恰相反,正因?yàn)閷哟蔚停琒ocket編程比基于URL的網(wǎng)絡(luò)編程提供了更強(qiáng)大的功能和更靈活的控制,但是卻要更復(fù)雜一些。由于Java本身的特殊性,Socket編程在Java中可能已經(jīng)是層次最低的網(wǎng)絡(luò)編程接口,在Java中要直接操作協(xié)議中更低的層次,需要使用Java的本地方法調(diào)用(JNI),在這里就不予討論了。
8.3.2 Socket通訊的一般過(guò)
前面已經(jīng)提到Socket通常用來(lái)實(shí)現(xiàn)C/S結(jié)構(gòu)。
使用Socket進(jìn)行Client/Server程序設(shè)計(jì)的一般連接過(guò)程是這樣的:Server端Listen(監(jiān)聽(tīng))某個(gè)端口是否有連接請(qǐng)求,Client端向Server端發(fā)出Connect(連接)請(qǐng)求,Server端向Client端發(fā)回Accept(接受)消息。一個(gè)連接就建立起來(lái)了。Server端和Client端都可以通過(guò)Send,Write等方法與對(duì)方通信。
如圖
對(duì)于一個(gè)功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過(guò)程包含以下四個(gè)基本的步驟:
(1) 創(chuàng)建Socket;
(2) 打開(kāi)連接到Socket的輸入/出流;
(3) 按照一定的協(xié)議對(duì)Socket進(jìn)行讀/寫(xiě)操作;
(4) 關(guān)閉Socket.
第三步是程序員用來(lái)調(diào)用Socket和實(shí)現(xiàn)程序功能的關(guān)鍵步驟,其他三步在各種程序中基本相同。
以上4個(gè)步驟是針對(duì)TCP傳輸而言的,使用UDP進(jìn)行傳輸時(shí)略有不同,在后面會(huì)有具體講解。