湯小波
【摘要】本文講述了網(wǎng)絡(luò)通信的基本原理及java平臺下網(wǎng)絡(luò)通信技術(shù),并用簡單明了的步驟闡述了java語言實(shí)現(xiàn)過程,旨在指導(dǎo)java平臺的網(wǎng)絡(luò)開發(fā)應(yīng)用。
【關(guān)鍵字】通信 ServerSocket Socket
如今,計(jì)算機(jī)網(wǎng)絡(luò)已成為現(xiàn)代社會信息交流的重要鏈路,社會的交流離不開計(jì)算機(jī)網(wǎng)絡(luò)通信,如何實(shí)現(xiàn)其相互通信呢?基于Java的網(wǎng)絡(luò)通信就成為一種重要手段。
1、網(wǎng)絡(luò)通信協(xié)議及原理
1.1、網(wǎng)絡(luò)通信協(xié)議
什么是網(wǎng)絡(luò)通信協(xié)議?實(shí)現(xiàn)計(jì)算機(jī)連接和通信的規(guī)則稱之為網(wǎng)絡(luò)通信協(xié)議。網(wǎng)絡(luò)通信協(xié)議有很多種,目前應(yīng)用最廣泛的有TCP/IP協(xié)議和UDP協(xié)議。在TCP/IP結(jié)構(gòu)中,傳輸層有兩個(gè)重要的高級協(xié)議,分別是UDP和TCP,其中UDP稱為用戶數(shù)據(jù)報(bào)協(xié)議,TCP稱為傳輸控制協(xié)議。
1.2、TCP通信原理
TCP協(xié)議是面向連接的通信協(xié)議,即在傳輸數(shù)據(jù)前先在發(fā)送端和接收端建立邏輯連接,然后再傳輸數(shù)據(jù),它提供了兩臺計(jì)算機(jī)之間可靠無差錯(cuò)的數(shù)據(jù)傳輸。在TCP連接中必須要明確客戶端與服務(wù)器端,由客戶端向服務(wù)器端發(fā)出連接請求,每次連接的創(chuàng)建都需要經(jīng)過“三次握手”。第一次握手,客戶端向服務(wù)器端發(fā)出連接請求,等待服務(wù)器確認(rèn);第二次握手,服務(wù)器端向客戶端回送一個(gè)響應(yīng),通知客戶端收到了連接請求;第三次握手,客戶端再次向服務(wù)器端發(fā)送確認(rèn)信息,確認(rèn)連接。TCP連接的整個(gè)交互過程如圖1所示。
1.3、IP地址與端口號
要想使網(wǎng)絡(luò)中的計(jì)算機(jī)能夠進(jìn)行通信,必須為每臺計(jì)算機(jī)指定一個(gè)標(biāo)識號,通過這個(gè)標(biāo)識號來指定接收數(shù)據(jù)的計(jì)算機(jī)或者發(fā)送數(shù)據(jù)的計(jì)算機(jī)。在TCP/IP協(xié)議中,這個(gè)標(biāo)識號就是IP地址廠白可以唯一標(biāo)識一臺計(jì)算機(jī)。
通過IP地址可以連接到指定計(jì)算機(jī),但如果想訪問目標(biāo)計(jì)算機(jī)中的某個(gè)應(yīng)用程序,還需要指定端口號。在計(jì)算機(jī)中,不同的應(yīng)用程序是通過端口號區(qū)分的。接下來通過一個(gè)圖例來描述IP地址和端口號的作用,如圖2所示:
2、TCP協(xié)議下的Java通信工具類及實(shí)現(xiàn)原理
在JavaJDK網(wǎng)絡(luò)通信包中提供了兩個(gè)實(shí)現(xiàn)TCP程序的類,一個(gè)是ServerSocket類,用于表示服務(wù)器端;一個(gè)是Socket類,用于表示客戶端。在通信工具類ServerSocket中提供了多個(gè)構(gòu)造方法,其中的常用構(gòu)造方法為ServerSocket(int pat),使用該構(gòu)造方法在創(chuàng)建ServerSocket對象時(shí),可以將其綁定到一個(gè)指定的端口號上(參數(shù)port就是端口號)。Socket類提供了一個(gè)常用構(gòu)造器Socket(Stringhost,int port),使用該構(gòu)造方法在創(chuàng)建Socket對象時(shí),會根據(jù)參數(shù)去連接在指定地址和端口上運(yùn)行的服務(wù)器程序,其中參數(shù)host接收的是一個(gè)字符串類型的IP地址。此兩通信工具類在計(jì)算機(jī)網(wǎng)絡(luò)通信中的原理如圖3所示:
在服務(wù)器端和客戶端建立連接之后,要想實(shí)現(xiàn)相互通信,首先由ServerSocket對象監(jiān)聽某臺客戶端的端口號,由該對象的accept()方法接收客戶端的請求,當(dāng)執(zhí)行了accept()方法之后,服務(wù)器端程序會發(fā)生阻塞,直到客戶端發(fā)出連接請求時(shí),accept()方法才會返回一個(gè)Socket對象用于和客戶端實(shí)現(xiàn)通信,程序才能繼續(xù)向下執(zhí)行。兩端相互通信,通過數(shù)據(jù)流來實(shí)現(xiàn),它們分別擁有各自的輸入流Inputstream和輸出流OutStream,通過對象的getinputStream()方法和getOutputStream()來得到相互的輸入與輸出流,通過流的方法來實(shí)現(xiàn)流數(shù)據(jù)的發(fā)送和接收。如圖4所示:
3、Java語言實(shí)現(xiàn)
3.1、針對如圖4的服務(wù)器端,實(shí)現(xiàn)過程如下:
1)創(chuàng)建SenrerSocket對象:
ServerSocket serverSocket=new ServerSacket(8888);
2)調(diào)用ServerSocket的accept()方法接收數(shù)據(jù)
Socket client=server Socket.accept();
3)獲取客戶端的輸出流
OutputStream os=client.getOutputStream();
4)當(dāng)客戶端連接到服務(wù)端時(shí),向客戶端輸出數(shù)據(jù)
os.write《“XXX歡迎你!").getBytes());
3.2、針對如圖4的客戶端,實(shí)現(xiàn)過程如下:
1)創(chuàng)建一個(gè)Socket并連接到給出地址和端口號的計(jì)算機(jī)
Socket client=new Socket(InetAddress.getLocaiHost(),8888);
2)得到接收數(shù)據(jù)的流
InputStream is=client.getlnputStream();
bytes buff=new byte[1024];//定義1024個(gè)字節(jié)數(shù)組的緩沖區(qū)
3)將數(shù)據(jù)讀到緩沖區(qū)中
int len=is.read(buf);
4、結(jié)語
通過上述分析,我們研究了網(wǎng)絡(luò)通信原理及在Java中如何實(shí)現(xiàn)網(wǎng)絡(luò)通信的基本技術(shù)。在此基礎(chǔ)之上就可以編寫出我們所需要的各種網(wǎng)絡(luò)通信程序。