欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Java網絡編程

系統 1944 0
Java使網絡編程更方便、簡潔。它提供了各種Socket類,讀者只要了解這
些類的構造和相關的方法,就可以輕松的編寫網絡程序。而無論任何網絡
程序都是運行在一定的協議體系中的,了解這些協議的基本內容對于更好
的理解各種Socket類和方法都很有幫助。下面將介紹在Internet中占主導
地位的TCP/IP協議。
14.1? TCP/IP協議
TCP/IP協議是整個網絡通信的核心協議。其中TCP協議運行在客戶終端上,
是集成在操作系統內的一套協議軟件,它的任務是在網絡上的兩個機器之
間實現端到端的、可靠的數據傳輸功能。IP協議運行在組成網絡的核心設
備路由器上,它也是集成在系統內的一層協議軟件,負責將數據分組從源
端發送到目的端,通過對整個網絡拓撲結構的理解為分組的發送選擇路由
。值得注意的是TCP協議運行在客戶的主機中,是操作系統的一個組件,一
般操作系統會默認安裝給協議軟件,而IP協議既運行在客戶主機中也運行
在網絡設備中,在我們的主機中,查看安裝的TCP/IP協議軟件如圖主機中
的TCP/IP屬性所示。

14.1.1? IP協議和IP地址
計算機網絡中的每臺運行了IP協議的主機,都具有一個IP地址,該地址標
示網絡中的一臺主機。IP地址采用點分十進制方法表示。如192.168.2.1,
IP地址是一個32位的二進制序列,點分的每個部分占一個字節,使用十進
制表達。顯然每個部分的最大不超過255,因為二進制的8個1(11111111)
用十進制表達就是255。
IP地址由網絡部分和主機部分,網絡部分表示一個通信子網,給子網內的
主機可以不通過路由器而直接通信,如一個公司辦公室的局域網,主機部
分標識該通信子網內的主機。

14.1.2? TCP協議和端口
在整個網絡中,分組的傳輸過程中會發生很多難以預料的故障,如主機
down機或系統問題、網絡連線中斷、網絡交換設備掉電或網絡擁塞,這些
為問題的出現都可能造成分組的丟失或損壞。那么保障分組可靠地到達目
的地是IP協議無法解決的。此時需要它的上層協議TCP來處理。
TCP協議實現可靠通信的基礎是采用了握手機制實現了數據的同步傳輸,即
在通信的雙方發送數據前首先建立鏈接,協商一些參數,如發送的數據字
節數量、緩沖區大小等。一旦鏈接建立再傳送數據,并且對于收到的每一
個分組進行確認,這樣很好的保證了數據的可靠傳輸。
14.1.3? 客戶/服務器通信模型
客戶/服務器通信模型通常稱為C/S模型(Client/Server模型)。在這種通
信模型中有兩個軟件主體,一個是客戶程序,一個是服務器程序。我們通
常稱為客戶端和服務器端。通信的過程是客戶端向服務器端發出請求,例
如訪問FTP服務器下載文件,這個下載請求就由客戶端發出,而服務器接收
到請求后處理請求,把數據返回客戶端。完成一次通信過程。圖所示模型
是簡單的客戶/服務器通信模型。該模型展示了概要的通信模式。

14.2? UDP協議
UDP(User Datagram Protocol)協議稱為用戶數據報協議。該協議運行在
TCP/IP模型的傳輸層,該協議可以直接封裝成IP分組,不需要事先建立鏈
接就可以發送這些封裝好的IP分組。
一個UDP報文有兩個端口即源機器端口和目的機器端口、UDP長度、UDP校驗
和UDP凈荷組成,通過目的端口目的主機的傳輸層就知道把該報文遞交給那
個處理進程。而源端口值得從目標主機返回的UDP報文到達源主機后可以正
確的提交給上層進程處理。

14.3? 基于Java的客戶/服務器程序
本章介紹的Java網絡編程建立在TCP/IP協議基礎上,使用Socket套接字編
寫網絡通信程序。使用套接字編程可使程序員把主要精力集中在應用層,
集中于需要解決的問題領域,而至于傳輸層和網絡層,以及更底層的細節
則不用考慮,這些問題Socket套接字全部處理。也就是說使用套接字使程
序員看不到底層的通信細節,而只是在應用層使用Socket完成兩個主機之
間的通信。
這里需要首先介紹一下Socket再回到我們要討論的問題。
14.3.1? Socket及其原語
Socket概念來源于BerkeleyUNIX中使用的TCP socket(套接字),可以把它
看做一個通信實體,負責完成位于不同主機上的應用程序間通信。該套接
字提供了一組原語(一組最基本的操作)保證客戶端和服務器端順利地建
立通信鏈接并傳輸數據,最后釋放鏈接。這組原語已經廣泛應用在網絡程
序設計中。理解了這組原語對于理解客戶/服務器通信過程的建立和釋放很
有幫助。表列出了8個原語。

14.3.2? 創建服務器
創建服務器使得服務器同客戶端傳輸數據需要三個基本步驟:
(1)創建ServerSocket對象。
(2)阻塞服務進程、啟動監聽。
(3)創建流并讀、寫數據。

14.3.3? 創建客戶端
創建客戶端程序與創建服務器程序略有區別,顯然服務器需要監聽服務請
求,而客戶端只需要啟動鏈接請求,所以創建客戶端關鍵是創建一個
Socket對象。下面代碼是Client客戶程序中創建Socket對象的過程。
private static String serverAddress=”localhost”;
private static int port = 8080;
Socket socket = new Socket (serverAddress,port);

14.4? Socket類詳解
Socket套接字在客戶、服務器通信模型中扮演著十分重要的角色,它就如
服務器和客戶端的代理,完成雙方應用程序發送和接收數據的任務。客戶
建立和服務器的鏈接而創建了Socket,服務器一旦接收客戶的鏈接請求也
返回一個Socket,之后這兩個Socket就可以收發數據了。
本章重點介紹如何創建一個Socket,這里主要講解該類的幾個構造函數,
并給出各自的實例代碼,演示不同的Socket對象創建方法。同時介紹建立
Socket鏈接時的常見異常的相關分析,使得讀者知道在使用中常見的鏈接
問題的性質。Socket含有豐富的信息,這些信息是建立鏈接的必要條件,
同時也是數據傳輸的前提,本章對Socket的幾個getXXX()函數的介紹使得
讀者充分認識Socket到底包含了什么。最后介紹關閉鏈接的方式和注意事
項。
14.4.1? 創建Socket
Socket類的幾種構造函數如下,其區別在于參數的不同,為用戶創建
Socket對象提供了靈活性。
(1)Socket():該構造函數沒有任何參數,創建沒有建立鏈接的Socket對
象,該對象包含系統的默認屬性。
(2)Socket(InetAddress address , int port) throws IOException
該構造函數創建一個流Socket,并且鏈接到指定IP地址的指定端口。
(3)Socket(String host, int port) throws UnknownHostException
IOException
該構造函數創建一個流Socket,并且鏈接到指定主機的指定端口。
(4)Socket(InetAddress address,int port,InetAddress localadd,int
localport) throws IOException
該構造函數創建一個Socket對象,鏈接到指定的遠端地址的指定端口。
(5)Socket(String host,int port,InetAddress localadd,int
localport) throws IOException
該構造函數創建一個流Socket,并且鏈接到指定名字的主機的指定端口。
如果指定的主機名為null,相當于通過InetAddress.getByName(null)獲得
的地址(即localhost),同時該方法綁定本地主機的IP地址和服務端口號

14.4.2? Socket類的getXX ()方法
Socket類提供了getXX()方法,使用這些方法可以獲得Socket對象的豐富信
息,如建立Socket鏈接必須的主機IP地址和進程端口號。一旦建立了鏈接
,Socket提供了輸入輸出流方法來讀取服務器的數據,接收從服務器返回
的數據。下面詳細介紹經常使用個Socket類各種getXX()方法。
public InetAddress getInetAddress()
該方法返回建立了Socket鏈接的遠端Socket的地址,如果沒有建立鏈接則
返回null.
public InetAddress getLocalAddress()
該方法返回建立了Socket鏈接的本地地址。
public int getPort()
該方法返回建立了Socket鏈接的遠端服務的端口號。
public int getLocalPort()
該方法返回建立了Socket鏈接的本地服務端口號。
publicInputStream getInputStream() throws IOException
該方法返回當前Socket的輸入流
publicOutputStream getOutputStream() throws IOException
該方法返回當前Socket的輸入流
14.4.3? Socket類的setXX ()方法
Socket類提供了豐富的各種set類型方法,這是傳輸時需要考慮的參數如發
送和接收數據緩沖區的大小,長時間等待關閉鏈接,是否處理緊急數據,
是否使用換成那個機制等。本節將詳細介紹常用的set類型方法。讀者需要
了解這些方法的功能,和使用時機,而方法本身的使用很簡單,相信讀者
看后很容易掌握。
14.4.4? 關閉Socket
但建立Socket通信的雙方一旦通信結束,需要及時關閉Socket,這樣就可
以及時的釋放鏈接占用的資源如端口號、綁定的IP地址。Socket對象調用
close()方法關閉Socket通信,此時對象的輸入輸入流不再進行輸入輸出操
作。
如果需要立即釋放服務端口和IP地址,需要事先調用setReuseAddress
(boolean on)方法。如下代碼所示。
socket.setReuseAddress(true);
如果需要立即拋棄未發送完畢的數據,需要事先調用setSoLinger(boolean
on,int time)方法。如下代碼所示。
socket. setSoLinger(true,0);
14.5? SocketServer類
在11.3.1節我們學習了JDK的常用工具,其中在bin目錄下的工具最為有用
,在計算機上編譯和執行Java程序時需要知道編譯和執行程序的工具。
14.5.1? 創建SocketServer
Java提供了靈活的構造函數來創建SocketServer對象,該對象負責在服務
器端監聽客戶端請求。下面依次介紹構造函數和使用方式。
(1)public void ServerSocket() throws IOException
該構造函數創建一個不帶參數的默認構造方法。顯然該構造函數不與任何
斷口綁定,這樣創建的對象無法直接調用accept()方法類監聽接入的訪問
,必須綁定一個服務端口客戶端程序才可以訪問到服務器程序。
(2)public ServerSocket(int port ) throws IOException
該構造函數創建一個帶端口參數的ServerSocket對象,默認的服務器地址
為本機的IP地址。
(3)public void ServerSocket(int port, int connectNumber) throws
IOExcepiton
該構造函數有兩個參數,第一個參數指定服務器的服務端口,第二個參數
指定服務器管理鏈接請求的的數量。
14.5.2? SocketServer類的兩個重要方法
SocketServer類的兩個重要方法如下所示。
(1)SocketServer 類accept()方法
當客戶端向服務器發出請求時,該請求保存在服務器主機操作系統維護的
請求隊列中,accept()方法負責從該請求隊列中取出一個最早的請求,該
方法返回一個Socket對象,服務器通過該對象實現與客戶端的雙向可靠通
信。
(2)SocketServer類close()方法
該方法關閉當前服務器和客戶端的所有鏈接,釋放鏈接占用的資源如服務
端口,一般情況下不需要顯示的調用該方法,服務器程序退出時,操作系
統回自動釋放端口資源。顯示關閉SocketServer對象的方式如下所示。
ServerSocket serverSocket = New ServerSocket(8080);?
serverSocket.close();
14.5.3? 讀取SockerServer信息
ServerSocket類提供了一系列的get方法來獲得 ServerSocket的信息。如下
所示。
public InetAddress getInetAddress()
該方法返回建立了Socket鏈接的遠端 Socket的地址,如果沒有建立鏈接則
返回null。
public InetAddress getLocalAddress()
該方法返回建立了Socket鏈接的本地地址。
public int getPort()
該方法返回建立了Socket鏈接的遠端服務的端口號。
public int getLocalPort()
該方法返回建立了Socket鏈接的本地服務端口號。
14.5.3? 讀取SockerServer信息
publicInputStream getInputStream() throws IOException
該方法返回當前Socket的輸入流。
publicOutputStream getOutputStream() throws IOException
該方法返回當前Socket的輸入流。
其中常用的兩個方法如下所示:
Public InetAddress getInetAddress()
該方法返回該服務器綁定的IP地址,如果創建 ServerSocket對象時采用默
認的地址,則是服務器的本地地址,如果在創建對象時顯示指定了服務器
地址,則getInetAddress()方法返回的是指定的地址。
Public int getLocalPort();
該方法返回服務端口,如果用戶沒有顯示設置該端口,則操作系統會隨即
分配一個端口,否則返回用戶指定的端口。
14.6? 數據報通信
在TCP/IP協議族中,UDP協議與TCP協議都是處在傳輸層。而UDP協議是一種
無鏈接協議,即在建立通信的雙方無須事先建立聯系,只要需要發送數據
只管發送,不需要考慮對方是否接受或網絡是否可靠。它發送的每個數據
報稱為UDP報文,稱為UDP數據報。每個數據報相互獨立,各自包含完整的
目的地地址,源地址和相應的端口號。數據報在網絡的傳輸路徑取決于網
絡自身的狀況,至于能否到達目的地或到達后報文的正確性都難以保證。
在對方收到UDP報文后也不會作出任何反饋告訴發送方當前的狀態。顯然這
種方式無法保證數據的正確性,也無法處理丟失報文的情況。
14.6.1? 數據報通信簡介
基于Java的數據報通信主要依靠兩個類來完成,一個是
java.net.DatagramSocket類,一個是java.net.DatagramPacket類。其中
DatagramPacket表示要發送或接受的數據報,而DatagramSocket負責接收
和發送數據報,如下代碼所示。
1 //創建一個數據報
2 DatagramPacket packet = new DatagramPacket(new byte
[1024],1024);
3 //等待接收數據報, 如果沒有接收到數據,進程阻塞。
4? socket.receive(packet);
5 // 創建要發送的數據報
6 DatagramPacket Packet = new DatagramPacket(outputData,
7???????
outputData.length,remoteIP,8080);
8 //發出數據報
9 socket.send(Packet);
14.6.2? DatagramPacket類簡介
(1)構造函數
使用UDP協議發送和接收數據,需要在程序中表示數據報以調用
DatagramSocket的receive()和send()方法來接收和發送數據報,
DatagramPacket對象就是程序中的數據報,該類通過構造函數創建不同的
數據報。其構造函數分為兩類,一類創建用于發送的數據報,一類用于接
收的數據報。
(2)DatagramPacket類的連個重要方法
14.6.3? DatagramSocket類簡介
DatagramSocket類負責接收和發送數據報,每個 DatagramSocket對象會綁
定一個服務端口,這個端口可以是顯示設置的,也可以采用匿名端口,匿
名端口由操作系統隨機分配。UDP數據報在兩個DatagramSocket的對象實體
間傳輸。
編寫數據報方式的客戶、服務器程序時,首先需要在客戶方和服務器方建
立一個DatagramSocket對象,用來接收或發送數據報。接收和發送的數據
報由DatagramPacket類構造。
14.6.4? 實現數據報通信
在學習過了數據報通信的機制,以及java.net.DatagramSocket類和
java.net.Datagram
類之后。我們通過一個具體里的基于UDP協議的客戶服務器程序說明
DatagramSocket類來發送和接收數據的過程。
服務器程序的主機地址為本機地址,服務端口號為8080,程序啟動后等待
接收數據而阻塞,直到接收到UDP數據報才終止阻塞狀態。接收到數據后,
顯示在控制臺,并且把收到的數據再發送會客戶端。服務器程序如代碼所
示。

14.7? 本章習題
(1)學完本章中,讀者需要回答:
簡述IP 協議的作用,ip協議工作在OSI參考模型的那一個層
TCP 協議的的作用?什么是一個網絡鏈接。
簡述客戶/服務器通信模型。
如何通過Socket類創建客戶端程序
如何通過 SocketServer類實現服務器端程序。
解釋什么是數據報通信。
如何通過DatagramPacket類創建數據報
如何通過DatagramSocket類實現數據報通信。
(2)注意事項。
1.本章的基本通信模型是C/S模型,在繼續學習客戶端/服務器應用程序設
計前首先要理解該通信模型。
2.本章讀者一定要掌握最簡單的通過Socket類SocketServer類實現客戶端
/服務器應用程序的設計開發。
3.掌握數據報通信的原理和具體實現方法。

Java網絡編程


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本黄色一级片视频 | 青娱乐九色| 日韩精品一区二区三区在线观看 | 久久综合伊人 | 欧美日韩精品一区二区 | 亚洲一区在线观 | 热灸灸这里只有精品 | 日韩在线激情 | 免费在线一区二区三区 | 久久理论 | 四虎精品8848ys一区二区 | 亚洲最大成人综合 | 中文字幕av网 | 黄片毛片在线观看 | 亚洲男人天堂2021 | 国产99免费 | 视频一区二区在线观看 | 欧美一级电影在线播放 | 草久在线观看视频 | 久久久无码精品亚洲日韩按摩 | 成人免播放器午夜视频 | www.91成人| 黄色激情小视频 | 欧美激情综合亚洲五月蜜桃 | 国产精品视频免费视频 | 九色成人蝌蚪国产精品电影在线 | 夜夜夜操操操 | 午夜精品久久久久久久99蜜桃i | 久久久av | 国产99视频在线 | 亚洲日本色 | aaaaaaa片毛片免费观看 | 国产99久久精品一区二区永久免费 | 在线观看亚洲一区二区 | 波多野结衣在线免费播放 | 日韩一区二区在线视频 | 欧美日韩专区国产精品 | 黄色一级视频网站 | 久久精彩| 我要看免费毛片 | 加勒比AV一本大道香蕉大在线 |