【摘要】我們都知道現(xiàn)在通過各種網(wǎng)絡(luò)工具可以實(shí)現(xiàn)數(shù)據(jù)之間的交流,但是,卻很少有人去理解實(shí)現(xiàn)的原理,本論文就通過使用java語言,自己來編寫程序,實(shí)現(xiàn)計(jì)算機(jī)中數(shù)據(jù)的交流,通過閱讀本論文,你會(huì)了解到什么是Socket,什么是端口號,如何使用java來實(shí)現(xiàn)一個(gè)Socket通信。相信本論文一定會(huì)為你在編程領(lǐng)域有所幫助。
【關(guān)鍵詞】Socket;端口號;java
一、引言
要想自己動(dòng)手實(shí)現(xiàn)Socket編程,我們首先要知道什么是Socket,在此之前,我們就不得不提到TCP協(xié)議,這里我們不要把TCP看得多么高大上,我們只要知道,數(shù)據(jù)如果想要在網(wǎng)絡(luò)中進(jìn)行傳輸,那么就必須要遵守這個(gè)協(xié)議,就像你要成為中華人民共和國的公民,你首先就必須有國家承認(rèn)的身份證一樣,這樣我們才能動(dòng)手做其他事情。有了TCP協(xié)議為基礎(chǔ),那我們就可以通過java語言中提供的類來實(shí)現(xiàn)Socket編程。
二、java中需要使用到的類
java是一門面向?qū)ο蟮恼Z言,所謂面向?qū)ο螅皇俏覀兙幊痰囊环N思想,在java語言沒有誕生之前,我們使用到的面向過程的編程方式,面向過程就是我們在編程中需要到什么,那就創(chuàng)造出來,就像你要去銀行取錢,你要坐車去,那么你就要?jiǎng)?chuàng)造出一輛車,你要使用ATM機(jī),那么就要?jiǎng)?chuàng)造出一臺ATM機(jī)。而使用面向?qū)ο蟮姆绞?,就是你需要的各種東西之前就給你創(chuàng)造好了,你要取錢,你只要輸入密碼和余額就是了。而java中提供了類的概念,就想人類,就是一個(gè)java中的類,而毛主席就是人類的一個(gè)個(gè)體,在java中我們稱毛主席就是人類的一個(gè)對象。對于Socket編程而言,java中也提供了相應(yīng)的類,我們只要熟練使用那些類,就能夠?qū)崿F(xiàn)本論文的目標(biāo)。
在java中,以及提供了客戶端的Socket類,而服務(wù)器端,有ServerSocket類,通過其中的各種屬性和方法,以及在java中常用的輸入流和輸出流等相關(guān)只是,我們就能簡單的實(shí)現(xiàn)Soket編程。
三、Soket通信模型
現(xiàn)在,我們有了TCP協(xié)議為基礎(chǔ),有了java語言作為媒介,那么就可以開始去理解Soket通信模型。首先,我們需要建立服務(wù)器端Server,創(chuàng)建一個(gè)客戶端Client,然后在Server端的指定端口進(jìn)行監(jiān)聽,所謂的端口,就好像是門牌號一樣,客戶端可以通過ip地址找到對應(yīng)的服務(wù)器端,但是服務(wù)器端是有很多端口的,每個(gè)應(yīng)用程序?qū)?yīng)一個(gè)端口號,通過類似門牌號的端口號,客戶端才能真正的訪問到該服務(wù)器。當(dāng)Client客戶端創(chuàng)建了socket向服務(wù)器端發(fā)送請求后,服務(wù)器端會(huì)接收到客戶端的請求,并創(chuàng)建一個(gè)連接的Socket來與客戶端通信。而具體的通信,java中提供了輸入流和輸出流的概念。從而實(shí)現(xiàn)數(shù)據(jù)的交互。通信結(jié)束后,我們需要在客戶端和服務(wù)器端都關(guān)閉Socket和相應(yīng)資源,這樣一個(gè)Socket通信就完成了。
四、Socket通信實(shí)現(xiàn)步驟
1、服務(wù)器端創(chuàng)建ServerSocket對象,ServerSocket server=new ServerSocket(8888);綁定監(jiān)聽的端口,如上表示的就是監(jiān)聽了8888端口,然后通過server對象的accept()方法監(jiān)聽客戶端請求,此時(shí)服務(wù)器端就實(shí)現(xiàn)了對客戶端的連接,通過建立連接后,可以使用字符流來接收客戶端發(fā)送過來的數(shù)據(jù),InputStream iStream=socket.getInputStream()其中的iStream對象中就保存了這些數(shù)據(jù),當(dāng)然,此時(shí)我們還可以通過InputStreamReader 和BufferReader等來包裝輸入流,然后通過while循環(huán)來將其中的數(shù)據(jù)讀取并處理相關(guān)的業(yè)務(wù)邏輯,最后關(guān)閉相應(yīng)的資源。
2、客戶端要?jiǎng)?chuàng)建Socket對象,Socket socketCli=new Socket("127.0.0.1",8888);這里是用的是Socket類,其中包裝了各種客戶端需要使用到的方法,該類的構(gòu)造函數(shù)中有兩個(gè)參數(shù),其中第一個(gè)參數(shù)數(shù)服務(wù)器的IP地址,這里寫的127.0.0.1,表示的是服務(wù)器地址為本機(jī),如果你要連接的服務(wù)器是遠(yuǎn)程服務(wù)器,那么你就需要寫上你要連接的服務(wù)器的地址,而第二個(gè)參數(shù)表示的是要連接該服務(wù)器上的哪個(gè)端口號,這里的端口號必須和服務(wù)器端打開的端口號相同,如果不同,那么則無法實(shí)現(xiàn)數(shù)據(jù)的發(fā)送和接收,有了Socket示例對象后,我們需要在客戶端創(chuàng)建輸出流來向服務(wù)器端輸出數(shù)據(jù),scoketCli中有g(shù)etOutputStream()的方法來獲取輸出流,OutputStream oStream=socketCli.getOutputStream(),同理,如果我們的服務(wù)器會(huì)承受比較大的壓力的時(shí)候,我們可以使用PrintWriter來包裝該輸出流,PrintWriter writer=new PrintWriter(oStream),最后通過writer對象的write方法來將要發(fā)送的數(shù)據(jù)發(fā)送出去,這樣服務(wù)器端才能接收到客戶端發(fā)送的數(shù)據(jù),值得注意的是,無論是服務(wù)器端還是客戶端,我們都必須是關(guān)閉相關(guān)的資源,因?yàn)槿绻麤]有及時(shí)的關(guān)閉,服務(wù)器可能會(huì)出現(xiàn)莫名其妙的錯(cuò)誤。
在編寫好代碼后,我們需要注意幾點(diǎn),因?yàn)檫@是服務(wù)端和客戶端的交互,所以首先我們在運(yùn)行的時(shí)候必須先開啟服務(wù)器端,就像你取錢的時(shí)候,肯定是要先有銀行的,當(dāng)然,運(yùn)行服務(wù)器的時(shí)候,端口號如果被占用的話,系統(tǒng)會(huì)提示端口被占用的信息,此時(shí)你需要使用一個(gè)另外的端口號,而客戶端中,上面的代碼因?yàn)槭褂玫氖潜緳C(jī),所以IP地址設(shè)置為127.0.0.1,如果你是連接其他電腦,那么只需要將該IP地址修改即可。
五、結(jié)論
從上面的代碼我們可以得到下面的結(jié)論,在我們開啟服務(wù)端,并監(jiān)聽了指定的端口,那么如果有客戶端連接,通過java的各種手段,服務(wù)器端就可以獲取到客戶端發(fā)送過來的數(shù)據(jù),從中我們也應(yīng)該知道了所謂的TCP和IP以及端口號的使用,很多東西也許看上去生澀難懂,但是只要我們實(shí)際的動(dòng)手去操作了,特別是編程,那么就會(huì)很容易的去理解。當(dāng)然,上面只是一個(gè)很小的例子,實(shí)際的開發(fā)中會(huì)更加的困難,但是只要我們掌握了基本的知識點(diǎn),那么就可以在實(shí)際的開發(fā)中一點(diǎn)一點(diǎn)的去學(xué)習(xí),從而達(dá)到更高的一個(gè)水平。
【作者簡介】
陶艷芳(1994—),女,漢族,湖南人,邵陽學(xué)院魏源國際學(xué)院2013級通信工程專業(yè)在讀。