何詠明
(長(zhǎng)江工程職業(yè)技術(shù)學(xué)院,武漢 430212)
所謂socket通常也稱作“套接字”,用于描述IP地址和端口,是一個(gè)通信鏈的句柄。應(yīng)用程序通常通過(guò)“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。
以J2SDK-1.6為例,Socket和ServerSocket類庫(kù)位于java.net包中。ServerSocket用于服務(wù)器端,Socket是建立網(wǎng)絡(luò)連接時(shí)使用的。在連接成功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì)話。對(duì)于一個(gè)網(wǎng)絡(luò)連接來(lái)說(shuō),套接字是平等的,并沒(méi)有差別,不因?yàn)樵诜?wù)器端或在客戶端而產(chǎn)生不同級(jí)別。不管是Socket還是ServerSocket它們的工作都是通過(guò)SocketImpl類及其子類完成的。
java.net.Socket繼承于java.lang.Object,有9個(gè)構(gòu)造器,其方法并不多,下面介紹使用最頻繁的3個(gè)方法,其它方法大家可以見(jiàn)JDK-1.6文檔。
·Accept方法用于產(chǎn)生“阻塞”,直到接受到一個(gè)連接,并且返回一個(gè)客戶端的Socket對(duì)象實(shí)例?!白枞笔且粋€(gè)術(shù)語(yǔ),它使程序運(yùn)行暫時(shí)“停留”在這個(gè)地方,直到一個(gè)會(huì)話產(chǎn)生,然后程序繼續(xù);通?!白枞笔怯裳h(huán)產(chǎn)生的。
·getInputStream方法獲得網(wǎng)絡(luò)連接輸入,同時(shí)返回一個(gè)IutputStream對(duì)象實(shí)例。
·getOutputStream方法連接的另一端將得到輸入,同時(shí)返回一個(gè)OutputStream對(duì)象實(shí)例。
Socket通訊原理圖如圖1。
服務(wù)器:創(chuàng)建ServerSocket于指定的端口監(jiān)聽(tīng)客戶端的連接請(qǐng)求,有連接為服務(wù)端創(chuàng)建一個(gè)可以通訊的socket。
客戶端:使用Socket對(duì)網(wǎng)絡(luò)上某一個(gè)服務(wù)器的某一個(gè)端口發(fā)出連接請(qǐng)求,一旦連接成功,就能進(jìn)行socket通訊。借助于上述原理開(kāi)發(fā)的簡(jiǎn)易通訊程序如圖2。
創(chuàng)建ServerSocket對(duì)應(yīng)的服務(wù)的端口號(hào),創(chuàng)建一個(gè)線程去監(jiān)聽(tīng)客戶端的連接情況,如果有客戶端的連接則把一個(gè)JFrame服務(wù)端通訊的窗口包裝成一個(gè)線程去與客戶端進(jìn)行socket通訊,直到客戶端或者是服務(wù)端發(fā)出bye才結(jié)束通訊。
圖1 Socket通訊原理圖
圖2 簡(jiǎn)單通訊程序
(1)服務(wù)端通訊在構(gòu)造函數(shù)中通過(guò)傳遞的socket對(duì)象來(lái)獲取相關(guān)的輸入和輸出流,同時(shí)把窗體自身顯示出來(lái)。
關(guān)鍵代碼:
(2)發(fā)送消息
服務(wù)器可以隨時(shí)向客戶機(jī)發(fā)送消息,下面的代碼是發(fā)送用的代碼,同時(shí)也監(jiān)聽(tīng)客戶機(jī)的情況,當(dāng)客戶機(jī)向服務(wù)器發(fā)送bye時(shí),延遲2秒關(guān)閉自身,此時(shí)由于客戶端已經(jīng)接收到bye能夠進(jìn)行自身窗口的關(guān)閉操作而先期關(guān)閉客戶端的窗口。
關(guān)鍵代碼:
(3)接收消息
接收消息采用線程來(lái)完成,因?yàn)橄⒌牡竭_(dá)是隨機(jī)的,我們不能讓CPU來(lái)等待一個(gè)隨機(jī)的消息的到達(dá),此時(shí)改善性能的最好的辦法就是使用線程,讓CPU從繁重的等待中解脫出來(lái)而做重要的事情。下面是接收消息的代碼,當(dāng)接收到一個(gè)bye時(shí)關(guān)閉相關(guān)的通訊并退出應(yīng)用程序。
客戶機(jī)采用對(duì)話框的形式創(chuàng)建窗口,通過(guò)構(gòu)造函數(shù)來(lái)偵聽(tīng)指定IP地址上的端口號(hào),同時(shí)添加窗口的關(guān)閉事件,并使自身顯示出來(lái)。
構(gòu)造函數(shù)關(guān)鍵代碼:
客戶機(jī)的其它通訊與服務(wù)器的代碼是一致的,在此不再重復(fù)。