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