Java中的Socket程式設計 3 深入

2021-08-27 17:26:19 字數 1461 閱讀 5841

[size=medium]

[b]讀不在三更五鼓,功只怕一曝十寒。—郭沫若[/b]

意思是說,學習不在某一時的努力,而要鍥而不捨的堅持才能成功!

這句話告訴我們,學習是乙個循序漸進的積累過程,急於求成是不可取的,而想一勞永逸,想到的時候就用功一時,想不到的時候就疏於學業,這樣也只能算是學無所成的。

上一次我們實現了乙個服務端和客戶端同時讀寫的程式,但是服務端在處理完乙個客戶端的請求之後就結束了,而不能繼續接收其他客戶端的請求,這種方式還不能滿足我們實際開發中的需要。今天我們來實現乙個更貼近實際情況的程式:

[b]1、需求:乙個服務端非同步處理多個客戶端的請求[/b]

核心點:服務端通過accept方法監聽客戶端請求,當接收到某個客戶端請求時,開啟乙個新的執行緒來處理請求,然後繼續回到監聽狀態。這樣就實現了非同步處理客戶端請求的程式。

[b]2、**實現:[/b]

[b]1)服務端**:[/b]

[/size]

[size=medium]

[b]服務端**分析:[/b]

1、在主程式中,我們使用了乙個while(true)死迴圈,監聽客戶端請求,當監聽到有請求過來,就開啟乙個新執行緒來處理,然後主程式回到原來的監聽狀態。實際開發中也是這種情況的,服務端應該一直處於開啟狀態,可以隨時響應客戶端請求。

2、為了避免出現亂碼,服務端和客戶端讀寫資料統一使用utf-8編碼格式。

3、為了提高讀寫效率,程式中我們使用了帶快取區的字元輸入輸出流,一行一行的讀寫資料;其中[b]readline方法是阻塞式[/b]操作的,只有讀到乙個換行、回車或換行回車符時才會執行往後的操作,否則一直處於阻塞狀態。而[b]newline方法[/b]是往流中寫乙個換行符。

[b]2)客戶端**:[/b]

[/size]

[size=medium]

客戶端**分析:

設定超時時長,單位是毫秒。當設定了超時時長大於0時,表示socket在這一時間內,如果沒讀取到資料,則不會一直阻塞在那裡,而是丟擲乙個sockettimeoutexception異常。

[b]3、執行結果:[/b]

注意:先執行server程式,再執行client程式。為體現服務端可以處理多個客戶端請求,把client程式拷貝到硬碟的某個路徑,編輯檔案,修改往服務端寫資料的內容,然後在dos控制台再執行一次。即

[img]

[b]結果如下: [/b]

[b]1)server程式控制臺:[/b]

[img]

[b]2)client程式控制臺:[/b]

[img]

[b]3)dos命令控制台:[/b]

[img]

[b]4、總結:[/b]

經過前面兩章和本章的學習,我相信大家對socket會有了乙個更深入的了解,前面兩章的內容均是為了本章內容而做鋪墊的,實際開發中,就是使用本章這種方式,乙個服務端非同步響應多個客戶端請求。以後更複雜的程式也是在這基礎上拓展的,要學會融會貫通,以不變應萬變。

[/size]

Java中的網路程式設計(Socket程式設計)2

封裝計算機的ip位址 沒有埠 public static void main string args throws unknownhostexception包含埠,用於socket通訊的 注意 傳送端和接收端的埠號要一致 埠號由接收方或者伺服器來定義 然後通知傳送方或者客戶端,按照這個埠傳送 pub...

java 網路程式設計socket

埠號 用於標識程序的邏輯位址,不同程序的標識 有效埠 0 65535,其中0 1024系統使用或保留埠 傳輸協議 通訊的規則 常見協議 tcp,udp udp 1.將資料及源和目的封裝成資料報中,不需要建立連線 2.每個資料報的大小限制在64k內 3.因無連線,是不可靠協議 4.不需要建立連線,速度...

java網路程式設計之SOCKET

建立物件的時候就會建立連線 try socket socket new socket time.nist.gov 13 catch ioeception ex 可選的 socket.setsotimeout 150000 從socket中讀取資料 inputstream in socket.geti...