Java程序設(shè)計(jì)項(xiàng)目案例化教程課件:網(wǎng)絡(luò)編程_第1頁(yè)
Java程序設(shè)計(jì)項(xiàng)目案例化教程課件:網(wǎng)絡(luò)編程_第2頁(yè)
Java程序設(shè)計(jì)項(xiàng)目案例化教程課件:網(wǎng)絡(luò)編程_第3頁(yè)
Java程序設(shè)計(jì)項(xiàng)目案例化教程課件:網(wǎng)絡(luò)編程_第4頁(yè)
Java程序設(shè)計(jì)項(xiàng)目案例化教程課件:網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Java面向?qū)ο蟪绦蛟O(shè)計(jì)網(wǎng)絡(luò)編程本章內(nèi)容掌握網(wǎng)絡(luò)編程的一些基礎(chǔ)知識(shí)了解網(wǎng)絡(luò)編程的原理掌握基于TCP協(xié)議的網(wǎng)絡(luò)編程掌握基于udp協(xié)議的網(wǎng)絡(luò)編程任務(wù)相關(guān)知識(shí)

網(wǎng)絡(luò)編程指的就是通過(guò)網(wǎng)絡(luò)進(jìn)行程序數(shù)據(jù)操作,既然是網(wǎng)絡(luò)開發(fā),那么一定就分為用戶和服務(wù)兩端,而這兩個(gè)端的開發(fā)實(shí)際上就有以下的兩種不同的架構(gòu):·

C/S(Client/Server):要開發(fā)兩套程序,一套是服務(wù)器端,另外一套是與之對(duì)應(yīng)的客戶端,但是這種程序在日后進(jìn)行維護(hù)的時(shí)候,是需要維護(hù)兩套程序,而且客戶端的程序更新也必須及時(shí),此類程序安全;·

B/S(Browser/Server):要開發(fā)一套程序,只開發(fā)服務(wù)器端的,客戶端使用瀏覽器進(jìn)行訪問(wèn),這種程序在日后進(jìn)行程序維護(hù)的時(shí)候只需要維護(hù)服務(wù)器端即可,客戶端不需要做任何的修改,此類程序使用公共端口,包括公共協(xié)議,所以安全性很差。

如果從網(wǎng)絡(luò)的開發(fā)而言,大的分類是以上的兩類,可是從現(xiàn)在的開發(fā)來(lái)講,更多的情況是針對(duì)于B/S程序進(jìn)行的開發(fā),或者可以這么理解:B/S程序的開發(fā)屬于網(wǎng)絡(luò)時(shí)代,而C/S程序的開發(fā)屬于單機(jī)時(shí)代。而對(duì)于WebService的開發(fā),實(shí)話而言,也屬于B/S結(jié)構(gòu)的程序(跨平臺(tái))。

而在日后學(xué)習(xí)Android開發(fā)的時(shí)候,如果要考慮安全性使用Socket,如果要考慮方便性,還是基于WEB的開發(fā)方便使用。而對(duì)于網(wǎng)絡(luò)的開發(fā)在Java中也分為兩種:TCP(傳輸控制協(xié)議,可靠的傳輸)、UDP(數(shù)據(jù)報(bào)協(xié)議),對(duì)于網(wǎng)絡(luò)開發(fā),本次只專注于TCP程序的實(shí)現(xiàn)。網(wǎng)絡(luò)編程基礎(chǔ)知識(shí)網(wǎng)絡(luò)編程的目的就是指直接或間接地通過(guò)網(wǎng)絡(luò)協(xié)議與其他計(jì)算機(jī)進(jìn)行通訊。網(wǎng)絡(luò)編程中有兩個(gè)主要的問(wèn)題,一個(gè)是如何準(zhǔn)確的定位網(wǎng)絡(luò)上一臺(tái)或多臺(tái)主機(jī),另一個(gè)就是找到主機(jī)后如何可靠高效的進(jìn)行數(shù)據(jù)傳輸。在TCP/IP協(xié)議中IP層主要負(fù)責(zé)網(wǎng)絡(luò)主機(jī)的定位,數(shù)據(jù)傳輸?shù)穆酚?,由IP地址可以唯一地確定Internet上的一臺(tái)主機(jī)。而TCP層則提供面向應(yīng)用的可靠的或非可靠的數(shù)據(jù)傳輸機(jī)制。目前較為流行的網(wǎng)絡(luò)編程模型是客戶機(jī)/服務(wù)器(C/S)結(jié)構(gòu),即通信雙方一方作為服務(wù)器等待客戶提出請(qǐng)求并予以響應(yīng)。客戶則在需要服務(wù)時(shí)向服務(wù)器提出申請(qǐng)。服務(wù)器一般作為守護(hù)進(jìn)程始終運(yùn)行,監(jiān)聽網(wǎng)絡(luò)端口,一旦有客戶請(qǐng)求,就會(huì)啟動(dòng)一個(gè)服務(wù)進(jìn)程來(lái)響應(yīng)該客戶,同時(shí)自己繼續(xù)監(jiān)聽服務(wù)端口,使后來(lái)的客戶也能及時(shí)得到服務(wù)。網(wǎng)絡(luò)編程涉及到幾個(gè)概念:通訊協(xié)議:通訊協(xié)議:計(jì)算機(jī)網(wǎng)絡(luò)中實(shí)現(xiàn)通訊必須遵循的一些約定,這些約定被稱為通信協(xié)議。通信協(xié)議負(fù)責(zé)對(duì)傳輸速率、傳輸代碼、代碼結(jié)構(gòu)、傳輸控制步驟、出錯(cuò)控制等制定處理標(biāo)準(zhǔn)。網(wǎng)絡(luò)通訊協(xié)議有很多種,目前應(yīng)用最廣泛的使TCP/IP協(xié)議(TransmissionControlProtocol/InternetProtocol)、UDP協(xié)議(UserDatagramProtocol)、ICMP協(xié)議(InternetControlMessageProtocol)和其他一些協(xié)議的協(xié)議組。本章涉及到TCP協(xié)議和UDP協(xié)議。TCP是傳輸控制協(xié)議,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)TCP協(xié)議傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流??蛻舳撕头?wù)器端每次建立數(shù)據(jù)連接都要經(jīng)過(guò)“三次握手”。三次握手協(xié)議指的是在發(fā)送數(shù)據(jù)的準(zhǔn)備階段,服務(wù)器端和客戶端之間需要進(jìn)行三次交互:第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的syn(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。連接建立后,客戶端和服務(wù)器就可以開始進(jìn)行數(shù)據(jù)傳輸了。UDP是UserDatagramProtocol(用戶數(shù)據(jù)報(bào)協(xié)議)的簡(jiǎn)稱,是一種無(wú)連接的、不可靠的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。但是這個(gè)協(xié)議的速度卻比較快,所以在現(xiàn)在網(wǎng)絡(luò)基礎(chǔ)設(shè)施越來(lái)越好的情況下,使用UDP協(xié)議的應(yīng)用程序也越來(lái)越多了。IP地址表識(shí)Internet上的計(jì)算機(jī)。知道了網(wǎng)絡(luò)中某一臺(tái)主機(jī)的IP地址,就可以定位這臺(tái)計(jì)算機(jī),通過(guò)這種地址標(biāo)識(shí),網(wǎng)絡(luò)中計(jì)算機(jī)可以相互定位和通訊,采用IPV4、IPV6兩種格式。IP地址:Port端口號(hào)是計(jì)算機(jī)輸入輸出信息的接口,端口是網(wǎng)絡(luò)通信時(shí)同一主機(jī)上的不同進(jìn)程的標(biāo)識(shí),標(biāo)識(shí)正在計(jì)算機(jī)上運(yùn)行的進(jìn)程(程序)。端口號(hào)被規(guī)定為一個(gè)16位的整數(shù)0-65535,其中,0-1023被預(yù)定義的服務(wù)通信占用,應(yīng)該使用1024-65535這些端口中的某一個(gè)進(jìn)行通信。每個(gè)程序監(jiān)聽本機(jī)上的一個(gè)端口套接字Socket:套接字是用來(lái)描述IP地址和端口的,可以把它看成是一個(gè)通信端點(diǎn)。Socket實(shí)際是傳輸層供給應(yīng)用層的編程接口。Socket就是應(yīng)用層與傳輸層之間的橋梁。使用Socket編程可以開發(fā)客戶機(jī)和服務(wù)器應(yīng)用程序,可以在本地網(wǎng)絡(luò)上進(jìn)行通信,也可通過(guò)Internet在全球范圍內(nèi)通信,Socket連接示意圖如圖10.1所示:創(chuàng)建客戶端的socket的時(shí)候,socket=newSocket(“218:198:118:108”,80);Socket連接到ip地址是218:198:118:108,服務(wù)器端口80的服務(wù)器上。同時(shí)會(huì)自動(dòng)生成一個(gè)本地端口號(hào),該端口號(hào)和服務(wù)器端口號(hào)建立一條通信鏈路。套接字是由IP地址和端口號(hào)組成的,簡(jiǎn)單解釋一下,假設(shè)你的電腦上有兩個(gè)程序都在運(yùn)行,并且都從服務(wù)器端讀取數(shù)據(jù),一個(gè)是A,一個(gè)是B,現(xiàn)在A的服務(wù)器和B的服務(wù)器同時(shí)發(fā)送來(lái)數(shù)據(jù),現(xiàn)在怎么判斷接收到的網(wǎng)絡(luò)數(shù)據(jù)是給哪一個(gè)程序使用的呢?這就是端口的作用了!每個(gè)程序監(jiān)聽本機(jī)上的一個(gè)端口,就可以從這個(gè)端口讀取數(shù)據(jù)了!這樣數(shù)據(jù)就不會(huì)混亂。本地端口號(hào)和服務(wù)器端端口號(hào)不一致。套接字Socket:(續(xù))URL:protocol://resourceName

協(xié)議名(protocol)指明獲取資源所使用的傳輸協(xié)議,如http、ftp、gopher、file等,資源名(resourceName)則應(yīng)該是資源的完整地址,包括主機(jī)名、端口號(hào)、文件名或文件內(nèi)部的一個(gè)引用。例如:/

協(xié)議名://主機(jī)名/home/welcome.html

協(xié)議名://機(jī)器名+文件名:80/Gamelan/network.html#BOTTOM協(xié)議名://機(jī)器名+端口號(hào)+文件名+內(nèi)部引用網(wǎng)絡(luò)編程原理要實(shí)現(xiàn)網(wǎng)絡(luò)機(jī)器間的通訊,首先得來(lái)看看計(jì)算機(jī)系統(tǒng)網(wǎng)絡(luò)通信的基本原理,在底層層面去看,網(wǎng)絡(luò)通信需要做的就是將流從一臺(tái)計(jì)算機(jī)傳輸?shù)搅硗庖慌_(tái)計(jì)算機(jī),基于傳輸協(xié)議和網(wǎng)絡(luò)IO來(lái)實(shí)現(xiàn),其中傳輸協(xié)議比較出名的有http、tcp、udp等等,http、tcp、udp都是在基于Socket概念上為某類應(yīng)用場(chǎng)景而擴(kuò)展出的傳輸協(xié)議,網(wǎng)絡(luò)IO,主要有bio、nio、aio三種方式,所有的分布式應(yīng)用通訊都基于這個(gè)原理而實(shí)現(xiàn),只是為了應(yīng)用的易用,各種語(yǔ)言通常都會(huì)提供一些更為貼近應(yīng)用易用的應(yīng)用層協(xié)議。網(wǎng)絡(luò)上的兩個(gè)程序通過(guò)一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。Socket通常用來(lái)實(shí)現(xiàn)客戶方和服務(wù)方的連接。Socket是TCP/IP協(xié)議的一個(gè)十分流行的編程界面,一個(gè)Socket由一個(gè)IP地址和一個(gè)端口號(hào)唯一確定。但是,Socket所支持的協(xié)議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯(lián)系的。在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。Java網(wǎng)絡(luò)通訊原理:要實(shí)現(xiàn)網(wǎng)絡(luò)機(jī)器間的通訊,首先得來(lái)看看計(jì)算機(jī)系統(tǒng)網(wǎng)絡(luò)通信的基本原理,在底層層面去看,網(wǎng)絡(luò)通信需要做的就是將流從一臺(tái)計(jì)算機(jī)傳輸?shù)搅硗庖慌_(tái)計(jì)算機(jī),基于傳輸協(xié)議和網(wǎng)絡(luò)IO來(lái)實(shí)現(xiàn),其中傳輸協(xié)議比較出名的有http、tcp、udp等等,http、tcp、udp都是在為某類應(yīng)用場(chǎng)景而定義出的傳輸協(xié)議,網(wǎng)絡(luò)IO,主要有bio、nio、aio三種方式,所有的分布式應(yīng)用通訊都基于這個(gè)原理而實(shí)現(xiàn),只是為了應(yīng)用的易用,各種語(yǔ)言通常都會(huì)提供一些更為貼近應(yīng)用易用的應(yīng)用層協(xié)議。TCP/IP服務(wù)器端應(yīng)用程序是通過(guò)Java語(yǔ)言中提供的ServerSocket和Socket這兩個(gè)有關(guān)網(wǎng)絡(luò)的類來(lái)實(shí)現(xiàn)的。而ServerSocket類除了建立一個(gè)Server之外,還通過(guò)accept()方法提供了隨時(shí)監(jiān)聽客戶端連接請(qǐng)求的功能,它的構(gòu)造方法有以下兩種。ServerSocket(intport)ServerSocket(intport,intbacklog)其中port是指連接中對(duì)方的端口號(hào),backlog則表示服務(wù)器端所能支持的最大連接數(shù)。下面的程序用來(lái)監(jiān)聽客戶端應(yīng)用程序建立連接的請(qǐng)求,并在連接建立后向客戶端發(fā)送信息。Java中的網(wǎng)絡(luò)通信時(shí)通過(guò)Socket實(shí)現(xiàn)的,Socket分為ServerSocket和Socket兩大類,ServerSocket用于服務(wù)器端,可以通過(guò)accept方法監(jiān)聽請(qǐng)求,監(jiān)聽請(qǐng)求后返回Socket,Socket用于完成具體數(shù)據(jù)傳輸,客戶端也可以使用Socket發(fā)起請(qǐng)求并傳輸數(shù)據(jù)。ServerSocket的使用可以分為三步:創(chuàng)建ServerSocket。ServerSocket的構(gòu)造方法有5個(gè),其中最方便的是ServerSocket(intport),只需要一個(gè)port就可以了。調(diào)用創(chuàng)建出來(lái)的ServerSocket的accept方法進(jìn)行監(jiān)聽。accept方法是阻塞方法,也就是說(shuō)調(diào)用accept方法后程序會(huì)停下來(lái)等待連接請(qǐng)求,在接受請(qǐng)求之前程序?qū)⒉粫?huì)繼續(xù)執(zhí)行,當(dāng)接收到請(qǐng)求后accept方法返回一個(gè)Socket。使用accept方法返回的Socket與客戶端進(jìn)行通信TCP是TranferControlProtocol的簡(jiǎn)稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)TCP協(xié)議傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。發(fā)送方和接收方的成對(duì)的兩個(gè)socket之間必須建立連接,以便在TCP協(xié)議的基礎(chǔ)上進(jìn)行通信,當(dāng)一個(gè)socket(通常都是serversocket)等待建立連接時(shí),另一個(gè)socket可以要求進(jìn)行連接,一旦這兩個(gè)socket連接起來(lái),它們就可以進(jìn)行雙向數(shù)據(jù)傳輸,雙方都可以進(jìn)行發(fā)送或接收操作?;赥CP協(xié)議的網(wǎng)絡(luò)編程服務(wù)器端的步驟:1、創(chuàng)建服務(wù)器端的ServerSocket對(duì)象,綁定監(jiān)聽端口2、調(diào)用accept()方法進(jìn)行偵聽客戶端的請(qǐng)求,等待客戶端的連接3、與客戶端建立連接以后,通過(guò)輸入流讀取客戶端發(fā)送的請(qǐng)求信息4、通過(guò)輸出流用來(lái)響應(yīng)客戶端5、關(guān)閉輸入輸出流以及socket等相應(yīng)的資源客戶端的步驟:1、創(chuàng)建socket對(duì)象,并且指明需要連接的服務(wù)器端的地址以及端口號(hào),用來(lái)與服務(wù)器端進(jìn)行連接2、連接建立后,獲取一個(gè)輸出流,通過(guò)輸出流向服務(wù)器端發(fā)送請(qǐng)求信息3、通過(guò)輸入流,讀取服務(wù)器端響應(yīng)的信息4、關(guān)閉相應(yīng)的資源相關(guān)的類介紹在Java的類庫(kù)中,URL、URLConnection、Socket、ServerSocket類都是利用TCP在網(wǎng)絡(luò)上通信的;而DatagramPacket和DatagramSocket類是使用UDP的。本章將主要講述利用TCP協(xié)議進(jìn)行通信的各個(gè)類。1、URL類:.URL,是統(tǒng)一資源定位器,它是指向internet資源的指針。通過(guò)URL標(biāo)識(shí),就可以利用各種網(wǎng)絡(luò)協(xié)議來(lái)獲取遠(yuǎn)端計(jì)算機(jī)上的資源或信息,從而方便快捷地開發(fā)Internet應(yīng)用程序。格式:傳輸協(xié)議名://主機(jī)名:端口號(hào)/文件名#引用構(gòu)造方法:表10.1常用方法:表10.2構(gòu)造方法主要功能(spec)從String表示形成一個(gè)URL對(duì)象(context,spec)通過(guò)在指定的上下文中解析給定的規(guī)范來(lái)創(chuàng)建一個(gè)URL方法主要功能ObjectgetContent()獲取此URL的內(nèi)容intgetDefaultPort()獲取與此URL關(guān)聯(lián)協(xié)議的默認(rèn)端口號(hào)StringgetFile()獲取此URL的文件名StringgetHost()獲取此URL的主機(jī)名(如適用)StringgetPath()獲取此URL的路徑部分intgetPort()獲取此URL的端口號(hào)StringgetProtocol()獲取此URL的協(xié)議名稱StringgetRef()獲取此URL的錨點(diǎn)(也稱為“引用”)URLConnectionopenConnection()它表示到URL所引用的遠(yuǎn)程對(duì)象的連接InputStreamopenStream()打開與此URL,并返回一個(gè)InputStream,以便從該連接讀取【例10-1】:通過(guò)案例來(lái)掌握使用URL類獲取遠(yuǎn)端主機(jī)上指定文件的內(nèi)容:創(chuàng)建一個(gè)參數(shù)為/index.html的URL對(duì)象,然后讀取這個(gè)對(duì)象的文件。importjava.io.*;import.URL;publicclassDemo10_01{ publicstaticvoidmain(String[]args)throwsException{ //創(chuàng)建URL對(duì)象 URLurl=newURL("/index.html"); //創(chuàng)建InputStreamReader對(duì)象 InputStreamReaderis=newInputStreamReader(url.openStream()); System.out.println("協(xié)議:"+url.getProtocol());//顯示協(xié)議名 System.out.println("主機(jī):"+url.getHost());//顯示主機(jī)名 System.out.println("端口:"+url.getDefaultPort());//顯示與此URL關(guān)聯(lián)協(xié)議的默認(rèn)端口號(hào) System.out.println("路徑:"+url.getPath());//顯示路徑名 System.out.println("文件:"+url.getFile());//顯示文件名 //創(chuàng)建BufferedReader對(duì)象 BufferedReaderbr=newBufferedReader(is); StringinputLine; System.out.println("文件內(nèi)容:"); //按行從緩沖輸入流循環(huán)讀字符,直到讀完所有行 while((inputLine=br.readLine())!=null){ System.out.println(inputLine);//把讀取的數(shù)據(jù)輸出到屏幕上} br.close();//關(guān)閉字符輸入流}}該程序的運(yùn)行結(jié)果:協(xié)議:http主機(jī):端口:80路徑:/index.html文件:/index.html文件內(nèi)容:<!DOCTYPEhtml><!--STATUSOK--><html><head><metahttp-equiv=content-typecontent=text/html;charset=utf-8><metahttp-equiv=X-UA-Compatiblecontent=IE=Edge><metacontent=alwaysname=referrer><linkrel=stylesheettype=text/csshref=/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head>……文件內(nèi)容太多,</head>以下內(nèi)容就此省略。URLConnection抽象類URLConnection是所有類的超類,它代表應(yīng)用程序和

URL

之間的通信鏈接。此類的實(shí)例可用于讀取和寫入此

URL

引用的資源。構(gòu)造方法:表10.3常用方法:表10.4構(gòu)造方法主要功能URLConnection(URLurl)構(gòu)造與指定URL的URL連接方法主要功能ObjectgetContent()檢索此URL連接的內(nèi)容StringgetContentEncoding()返回content-encoding標(biāo)題字段的值IntgetContentLength()返回content-length標(biāo)題字段的值StringgetContentType()返回content-type標(biāo)題字段的值URLgetURL()返回此URLConnection的URL字段的值InputStreamgetInputStream()返回從此打開的連接讀取的輸入流OutputStreamgetOutputStream()返回寫入此連接的輸出流publicvoidsetConnectTimeout(inttimeout)設(shè)定一個(gè)指定的超時(shí)值(以毫秒為單位)【例10-2】:通過(guò)案例來(lái)掌握使用URLConnection類獲取Web頁(yè)面信息功能實(shí)現(xiàn):使用URLConnection顯示網(wǎng)址/index.html的相關(guān)信息。importjava.io.*;import.URL;import.URLConnection;publicclassDemo10_02{ publicstaticvoidmain(String[]args)throwsException{ Strings; //創(chuàng)建URL對(duì)象 URLurl=newURL("/index.htm"); //定義URLConnection對(duì)象,并讓其指向給定的連接 URLConnectionuc=url.openConnection(); System.out.println("文件類型:"+uc.getContentType()); System.out.println("文件長(zhǎng)度:"+uc.getContentLength()); System.out.println("文件內(nèi)容:"); System.out.println("--------------------------------------------"); //定義字節(jié)輸入流對(duì)象,并使其指向給定連接的輸入流 BufferedReaderis=newBufferedReader(newInputStreamReader(uc.getInputStream()));//創(chuàng)建BufferedReader對(duì)象 while((s=is.readLine())!=null){//循環(huán)讀下一個(gè)字節(jié),直到文件結(jié)束 System.out.println(s);//輸出字節(jié)對(duì)應(yīng)的字符 } is.close();//關(guān)閉字節(jié)流 }}該程序的運(yùn)行結(jié)果:文件類型:text/html文件長(zhǎng)度:2381文件內(nèi)容:--------------------------------------------<!DOCTYPEhtml><!--STATUSOK--><html><head><metahttp-equiv=content-typecontent=text/html;charset=utf-8><metahttp-equiv=X-UA-Compatiblecontent=IE=Edge><metacontent=alwaysname=referrer><linkrel=stylesheettype=text/csshref=/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head>文件內(nèi)容太多,</head>以下內(nèi)容就此省略。3、InetAddress:在internet上,表示一個(gè)主機(jī)的地址有兩種方式,即域名地址(如:)和ip地址(如:10).該類正是用來(lái)表示主機(jī)地址的。InetAddress類提供將主機(jī)名解析為其IP地址(或反之)的方法。常用方法:表10.53、InetAddress:在internet上,表示一個(gè)主機(jī)的地址有兩種方式,即域名地址(如:)和ip地址(如:10).該類正是用來(lái)表示主機(jī)地址的。InetAddress類提供將主機(jī)名解析為其IP地址(或反之)的方法。常用方法:表10.5InetAddress:方法主要功能StaticInetAddressgetByAddress(byte[]addr)在給定原始ip地址的情況下,返回InetAddress對(duì)象StaticInetAddressgetByAddress(Stringhost,byte[]addr)根據(jù)提供的主機(jī)名和IP地址創(chuàng)建InetAddressStaticInetAddressgetLocalHost()返回本地主機(jī)StaticInetAddressgetByName(Stringhost)在給定主機(jī)名的情況下確定主機(jī)的ip地址Byte[]getAddress()返回此InetAddress對(duì)象的原始ip地址StringgetHostAddress()返回ip地址字符串StringgetHostName()獲取此ip地址的主機(jī)名booleanisMulticastAddress()檢查InetAddress是否是ip多播地址booleanisReachable(inttimeout)測(cè)試是否可以達(dá)到該地址StringtoString()將此ip地址轉(zhuǎn)換為String【例10-3】:通過(guò)案例來(lái)掌握使用InetAddress類遠(yuǎn)端主機(jī)的ip地址和主機(jī)名。功能實(shí)現(xiàn):使用InetAddress對(duì)象獲取internet網(wǎng)上指定主機(jī)和本地主機(jī)的有關(guān)信息。import.InetAddress;import.UnknownHostException;publicclassDemo10_03{ publicstaticvoidmain(Stringargs[]){ try{ //獲取給定域名的地址 InetAddressinetAddress1=InetAddress.getByName(""); System.out.println(inetAddress1.getHostName());//顯示主機(jī)名 System.out.println(inetAddress1.getHostAddress());//顯示IP地址 System.out.println(inetAddress1);//顯示地址的字符串描述 //獲取本機(jī)的地址 InetAddressinetAddress2=InetAddress.getLocalHost(); System.out.println(inetAddress2.getHostName()); System.out.println(inetAddress2.getHostAddress()); System.out.println(inetAddress2); //獲取給定IP的主機(jī)地址(5) byte[]bs=newbyte[]{(byte)72,(byte)5,(byte)124,(byte)55}; InetAddressinetAddress3=InetAddress.getByAddress(bs); InetAddressinetAddress4=InetAddress.getByAddress("Sun官方網(wǎng)站()",bs); System.out.println(inetAddress3); System.out.println(inetAddress4); }catch(UnknownHostExceptione){ e.printStackTrace(); } }}該程序的運(yùn)行結(jié)果:關(guān)于Java

Socket編程的詳細(xì)介紹事實(shí)上網(wǎng)絡(luò)編程簡(jiǎn)單的理解就是兩臺(tái)計(jì)算機(jī)相互通訊數(shù)據(jù)而已,對(duì)于程序員而言,去掌握一種編程接口并使用一種編程模型相對(duì)就會(huì)顯得簡(jiǎn)單的多了。Java

SDK提供一些相對(duì)簡(jiǎn)單的Api來(lái)完成這些工作。Socket就是其中之一。對(duì)于Java而言,這些Api存在與

這個(gè)包里面。因此只要導(dǎo)入這個(gè)包就可以準(zhǔn)備網(wǎng)絡(luò)編程了ServerSocket構(gòu)造方法: 表10.6ServerSocket常用方法:表10.7ServerSocket:構(gòu)造方法主要功能ServerSocket()創(chuàng)建未綁定的服務(wù)器套接字ServerSocket(intport)創(chuàng)建綁定到指定端口的服務(wù)器套接字ServerSocket(intport,intbacklog)創(chuàng)建服務(wù)器套接字并將其綁定到指定的本地端口號(hào),并指定了積壓ServerSocket(intport,intbacklog,InetAddressbindAddr)創(chuàng)建一個(gè)具有指定端口的服務(wù)器,偵聽backlog和本地IP地址綁定方法主要功能Socketaccept()偵聽并接受此套接字的連接voidbind(SocketAddressendpoint)將ServerSocket綁定到特定地址(ip地址和端口號(hào))voidbind(SocketAddressendpoint,intbacklog)在有多個(gè)網(wǎng)卡(每個(gè)網(wǎng)卡都有自己的ip地址)的服務(wù)器上,將ServerSocket綁定到特定地址(ip地址和端口號(hào)),并設(shè)置最長(zhǎng)連接隊(duì)列voidclose()關(guān)閉此套接字InetAddressgetInetAddress()返回此服務(wù)器套接字的本地地址IntgetLocalPort()返回此套接字在其上偵聽的端口SocketAddressgetLocalSocketAddress()返回此套接字綁定的端口的地址,如果尚未綁定則返回nullbooleanisBound()返回ServerSocket的綁定狀態(tài)booleanisClosed()返回ServerSocket的關(guān)閉狀態(tài)StringtoString()作為String返回此套接字的實(shí)現(xiàn)地址和實(shí)現(xiàn)端口【例10-4】:通過(guò)案例來(lái)掌握使用ServerSocket類獲取服務(wù)器的狀態(tài)信息。功能測(cè)試:測(cè)試ServerSocket中部分方法的功能。importjava.io.*;import.ServerSocket;publicclassDemo10_04{ publicstaticvoidmain(Stringargs[]){ ServerSocketserverSocket=null; try{ serverSocket=newServerSocket(2010); System.out.println("服務(wù)器端口:"+serverSocket.getLocalPort()); System.out.println("服務(wù)器地址:"+serverSocket.getInetAddress()); System.out.println("服務(wù)器套接字:"+serverSocket.getLocalSocketAddress()); System.out.println("是否綁定連接:"+serverSocket.isBound()); System.out.println("連接是否關(guān)閉:"+serverSocket.isClosed()); System.out.println("服務(wù)器套接字詳情:"+serverSocket.toString()); }catch(IOExceptione1){ System.out.println(e1); } }}該程序的運(yùn)行結(jié)果:在Java中Socket可以理解為客戶端或者服務(wù)器端的一個(gè)特殊的對(duì)象,這個(gè)對(duì)象有兩個(gè)關(guān)鍵的方法,一個(gè)是getInputStream方法,另一個(gè)是getOutputStream方法。getInputStream方法可以得到一個(gè)輸入流,客戶端的Socket對(duì)象上的getInputStream方法得到的輸入流其實(shí)就是從服務(wù)器端發(fā)回的數(shù)據(jù)流。GetOutputStream方法得到一個(gè)輸出流,客戶端Socket對(duì)象上的getOutputStream方法返回的輸出流就是將要發(fā)送到服務(wù)器端的數(shù)據(jù)流,(其實(shí)是一個(gè)緩沖區(qū),暫時(shí)存儲(chǔ)將要發(fā)送過(guò)去的數(shù)據(jù))。Socket構(gòu)造方法:表10.8ocket常用方法:表10.9Socket類:構(gòu)造方法主要功能Socket()創(chuàng)建一個(gè)未連接的套接字,并使用系統(tǒng)默認(rèn)類型的SocketImplSocket(InetAddressaddress,intport)創(chuàng)建流套接字并將其連接到指定IP地址的指定端口號(hào)方法主要功能InetAddressgetInetAddress()返回套接字連接的地址InetAddressgetLocalAddress()獲取套接字綁定的本地地址intgetLocalPort()返回此套接字綁定到的本地端口SocketAddressgetLocalSocketAddress()返回此套接字綁定的端點(diǎn)的地址,如果尚未綁定則返回nullInputStreamgetInputSteam()返回此套接字的輸入流OutputStreamgetOutputStream()返回此套接字的輸出流intgetPort()返回此套接字連接到的遠(yuǎn)程端口booleanisBound()返回套接字的綁定狀態(tài)booleanisClosed()返回套接字的關(guān)閉狀態(tài)booleanisConnected()返回套接字的連接狀態(tài)voidconnect(SocketAddressendpoint,inttimeout)將此套接字連接到服務(wù)器,并指定一個(gè)超時(shí)值voidclose()關(guān)閉此套接字【例10-5】:通過(guò)案例來(lái)掌握使用Socket類獲取指定連接的狀態(tài)信息。功能實(shí)現(xiàn):測(cè)試Socket中部分方法的功能。import.Socket;publicclassDemo10_05{ publicstaticvoidmain(Stringargs[]){ Socketsocket; try{ socket=newSocket("7",4700); System.out.println("是否綁定連接:"+socket.isBound()); System.out.println("本地端口:"+socket.getLocalPort()); System.out.println("連接服務(wù)器的端口:"+socket.getPort()); System.out.println("連接服務(wù)器的地址:"+socket.getInetAddress()); System.out.println("遠(yuǎn)程服務(wù)器的套接字:"+socket.getRemoteSocketAddress()); System.out.println("是否處于連接狀態(tài):"+socket.isConnected()); System.out.println("客戶套接詳情:"+socket.toString()); }catch(Exceptione){ System.out.println("服務(wù)器端沒有啟動(dòng)"); } }}該程序的運(yùn)行結(jié)果:打開服務(wù)端運(yùn)行結(jié)果:未打開服務(wù)端運(yùn)行結(jié)果:【例10-6】:實(shí)現(xiàn)簡(jiǎn)單的聊天功能//TalkServer.javaimportjava.io.*;import.*;publicclassTalkServer{ publicstaticvoidmain(Stringargs[]){ try{ ServerSocketserver=null; try{ server=newServerSocket(4700); }catch(Exceptione){ System.out.println("cannotlistento:"+e); } Socketsocket=null; try{ socket=server.accept(); }catch(Exceptione){ System.out.println("Error:"+e); } Stringline; BufferedReaderis=newBufferedReader(newInputStreamReader( socket.getInputStream())); PrintWriteros=newPrintWriter(socket.getOutputStream()); BufferedReadersin=newBufferedReader(newInputStreamReader(System.in)); System.out.println("Client:"+is.readLine()); line=sin.readLine(); while(!line.equals("bye")){ os.println(line); os.flush(); System.out.println("Server:"+line); System.out.println("Client:"+is.readLine()); line=sin.readLine(); } is.close(); os.close(); socket.close(); server.close(); }catch(Exceptione){ System.out.println("Error"+e); } }} //TalkClient.javaimportjava.io.*;import.*;publicclassTalkClient{ publicstaticvoidmain(Stringargs[]){ try{ Socketsocket=newSocket("",4700); BufferedReadersin=newBufferedReader(newInputStreamReader(System.in)); PrintWriteros=newPrintWriter(socket.getOutputStream()); BufferedReaderis=newBufferedReader(newInputStreamReader(socket.getInputStream())); Stringreadline; readline=sin.readLine(); while(!readline.equals("bye")){ os.println(readline); os.flush(); System.out.println("Client:"+readline); System.out.println("Server:"+is.readLine()); readline=sin.readLine(); } os.close(); is.close(); socket.close(); }catch(Exceptione){ System.out.println("Error"+e); } }}該程序的運(yùn)行結(jié)果:TalkServer運(yùn)行結(jié)果:TalkClient運(yùn)行結(jié)果:UDP

是UserDatagramProtocol

的簡(jiǎn)稱,是一種無(wú)連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的。DatagramPacket:數(shù)據(jù)報(bào)包用來(lái)實(shí)現(xiàn)無(wú)連接包投遞服務(wù)。每條報(bào)文僅根據(jù)該包中包含的信息從一臺(tái)機(jī)器路由到另一臺(tái)機(jī)器。從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)包可能選擇不同的路由,也可能按不同的順序到達(dá)。不對(duì)包投遞做出保證。要發(fā)送和接受數(shù)據(jù)報(bào),需要用DatagramPacket類將數(shù)據(jù)打包,即用DatagramPacket類創(chuàng)建一個(gè)對(duì)象,稱為數(shù)據(jù)包?;赨DP協(xié)議的網(wǎng)絡(luò)編程DatagramPackeg(bytedata[],intlen,InetAddress,intport);數(shù)組是數(shù)據(jù)包內(nèi)容,len為數(shù)據(jù)包長(zhǎng)度,add為數(shù)據(jù)包發(fā)送地址,port為接受主機(jī)對(duì)應(yīng)的應(yīng)用。DatagramPackeg(bytedata[],intoffset,intlen,InetAddress,intport);數(shù)據(jù)包內(nèi)容為數(shù)組從offset開始長(zhǎng)度為len為數(shù)據(jù),add為數(shù)據(jù)包發(fā)送地址,port為接受主機(jī)對(duì)應(yīng)的應(yīng)用。舉例:Byte[]data=”數(shù)據(jù)包內(nèi)容”.getByte();InetAdressadd=InetAdress.getName(“”);DatagramPacketdatagram=newDatagramPacket(data,data.length,add,1234);對(duì)應(yīng)的構(gòu)造方法如下:

發(fā)送數(shù)據(jù)和接受數(shù)據(jù):發(fā)送數(shù)據(jù):數(shù)據(jù)包準(zhǔn)備好了,就使用DatagramSocket對(duì)象的send()方法可以發(fā)送數(shù)據(jù)。DatagramSocketmail=newDatagramSocket();mail.send(datagram);接受數(shù)據(jù):DatagramSocket對(duì)象的receive()方法接收數(shù)據(jù),必須提前確定接收方的地址和端口號(hào)和數(shù)據(jù)包地址和端口號(hào)吻合。Bytedata[]=newbyte[500];DatagramSocketmail=newDatagramPacketSocket(1234);DatagramPacketdatagram=newDatagramPacket(data,data.length);mail.receive(datagram);【例10-7】:客戶端發(fā)送1,2,3,4,5數(shù)據(jù),服務(wù)端接受該數(shù)據(jù)并顯示。//TestDatagramClient.javaimport.*;publicclassTestDatagramClient{ publicstaticvoidmain(String[]args){ bytedata[]={1,2,3,4,5}; try{ InetAddressadd=InetAddress.getByName(""); DatagramPacketdatagram=newDatagramPacket(data,data.length,add,12345); DatagramSocketds; ds=newDatagramSocket(); ds.send(datagram);for(byteb:data) System.out.print(b+""); }catch(Exceptione){ e.printStackTrace(); } }}//TestDatagramServer.javaimport.*; publicclassTestDatagramServer{ publicstaticvoidmain(String[]args){ bytedata[]=newbyte[5]; DatagramSocketds; try{ DatagramPacketdp=newDatagramPacket(data,data.length); ds=newDatagramSocket(12345); ds.receive(dp); for(inti=0;i<data.length;i++){ System.out.print(data[i]+","); } }catch(Exceptione){ e.printStackTrace();}}}該程序的運(yùn)行結(jié)果:TestDatagramServer運(yùn)行結(jié)果:TestDatagramClient運(yùn)行結(jié)果:常用方法:表10.10方法主要功能inetAddressgetAddress()返回某臺(tái)機(jī)器的ip地址,此數(shù)據(jù)報(bào)將要發(fā)往該機(jī)器或者是從該機(jī)器接收到的byte[]getData()返回?cái)?shù)據(jù)緩沖區(qū)intgetLength()返回將要發(fā)送或接收到的數(shù)據(jù)的長(zhǎng)度intgetOffset()返回將要發(fā)送或接收到的數(shù)據(jù)的偏移量intgetPort()返回某臺(tái)主機(jī)的端口號(hào),此數(shù)據(jù)報(bào)將要發(fā)往該主機(jī)或者是從該主機(jī)接收到的SocketAddressgetSocketAddress()獲取要將此包發(fā)送到的或發(fā)出此數(shù)據(jù)報(bào)的遠(yuǎn)程主機(jī)的SocketAddress(通常為ip地址+端口號(hào)voidsetAddress(InetAddressiaddr)設(shè)置要將此數(shù)據(jù)報(bào)發(fā)往的那臺(tái)機(jī)器的ip地址voidsetData(byte[]buf)為此包設(shè)置數(shù)據(jù)緩沖區(qū)voidsetLength(intlength)為此包設(shè)置長(zhǎng)度voidsetPort(intiport)設(shè)置要將此數(shù)據(jù)報(bào)發(fā)往的遠(yuǎn)程主機(jī)上的端口號(hào)voidsetSocketAddress(SocketAddressaddress)設(shè)置要將此數(shù)據(jù)報(bào)發(fā)往的遠(yuǎn)程主機(jī)的SocketAddress(通常為ip地址+端口號(hào))DatagramSocket:6、DatagramSocket:此類表示用來(lái)發(fā)送和接收數(shù)據(jù)報(bào)包的套接字。數(shù)據(jù)報(bào)套接字是包投遞服務(wù)的發(fā)送或接收點(diǎn)。每個(gè)在數(shù)據(jù)報(bào)套接字上發(fā)送或接收的包都是單獨(dú)編址和路由的。從一臺(tái)機(jī)器發(fā)送到另一臺(tái)機(jī)器的多個(gè)包可能選擇不同的路由,也可能按不同的順序到達(dá)。構(gòu)造方法:表10.11常用方法:表10.12構(gòu)造方法主要功能DatagramSocket()構(gòu)造數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的任何可用端口DatagramSocket(intport)構(gòu)造數(shù)據(jù)報(bào)套接字并將其綁定到本地主機(jī)上的指定端口DatagramSocket(intport,InetAddressladdr)創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地地址DatagramSocket(SocketAddressbindaddr)創(chuàng)建一個(gè)數(shù)據(jù)報(bào)套接字,綁定到指定的本地套接字地址方法主要功能voidbind(SocketAddressaddr)將此DatagramSocket綁定到特定的地址和端口voidclose()關(guān)閉此數(shù)據(jù)報(bào)套接字voidconnect(InetAddressaddress,intport)將此套接字連接到遠(yuǎn)程套接字地址(ip地址+端口)voidconnect(SocketAddressaddr)將此套接字連接到遠(yuǎn)程套接字地址voiddisconnect()斷開套接字的連接InetAddressgetInetAddress()返回此套接字連接的地址InetAddressgetLocalAddress()獲取套接字綁定的本地地址intgetLocalPort()返回此套接字綁定的本地主機(jī)上的端口號(hào)SocketAddressgetLocalSocketAddress()返回此套接字綁定的端點(diǎn)的地址,如果尚未綁定則返回nullSocketAddressgetRemoteSocketAdddress()返回此套接字連接的端點(diǎn)的地址,如果未連接則返回nullvoidreceive(DatagramPacketp)從此套接字接收數(shù)據(jù)包voidsend(DatagramPacketp)從此套接字發(fā)送數(shù)據(jù)包【例10-8】:通過(guò)案例來(lái)掌握UDP協(xié)議的網(wǎng)絡(luò)編程//TestUDPClient.javaimport.*;importjava.io.*;publicclassTestUDPClient{ publicstaticvoidmain(Stringargs[])throwsException{ longn=10000L; ByteArrayOutputStreambaos=newByteArrayOutputStream(); DataOutputStreamdos=newDataOutputStream(baos); dos.writeLong(n); byte[]buf=baos.toByteArray(); System.out.println(buf.length); DatagramPacketdp=newDatagramPacket(buf,buf.length,newInetSocketAddress("",5678)); DatagramSocketds=newDatagramSocket(9999); ds.send(dp); ds.close();}}//TestUDPServer.javaimport.*;importjava.io.*;publicclassTestUDPServer{ publicstaticvoidmain(Stringargs[])throwsException{ bytebuf[]=newbyte[1024]; DatagramPacketdp=newDatagramPacket(buf,buf.length); DatagramSocketds=newDatagramSocket(5678); while(true){ ds.receive(dp); ByteArrayInputStreambais=newByteArrayInputStream(buf); DataInputStreamdis=newDataInputStream(bais); System.out.println(dis.readLong());}}}該程序的運(yùn)行結(jié)果:TestUDPServer運(yùn)行結(jié)果:TestUDPClient運(yùn)行結(jié)果:任務(wù)進(jìn)階服務(wù)器端程序創(chuàng)建套接字,并等待客戶端請(qǐng)求。客戶端創(chuàng)建套接字,每秒發(fā)過(guò)去一個(gè)數(shù)字,并等待接收服務(wù)器返回的結(jié)果,服務(wù)器端接收請(qǐng)求,并將處理結(jié)果送回去,再次等待其他請(qǐng)求,而客戶端接收到數(shù)據(jù)后繼續(xù)發(fā)送請(qǐng)求(共10次)??蛻舳薸mportjava.io.*;import.Socket;publicclassclient{ publicstaticvoidmain(String[]args){ Strings=null; Socketc; DataInputStreamin=null; DataOutputStreamout=null; inti=1; try{ c=newSocket("localhost",2345); in=newDataInputStream(c.getInputStream()); out=newDataOutputStream(c.getOutputStream()); out.writeInt(i); while(i<=10){ s=in.readUTF();

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論