Java網(wǎng)絡編程精解PPT課件_第1頁
Java網(wǎng)絡編程精解PPT課件_第2頁
Java網(wǎng)絡編程精解PPT課件_第3頁
Java網(wǎng)絡編程精解PPT課件_第4頁
Java網(wǎng)絡編程精解PPT課件_第5頁
已閱讀5頁,還剩51頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

.,1,Java網(wǎng)絡編程精解,作者:孫衛(wèi)琴參考書籍:技術支持網(wǎng)址:,.,2,第8章基于UDP的數(shù)據(jù)報和套接字,參考Java網(wǎng)絡編程精解的第8章,8.1UDP協(xié)議簡介8.2DatagramPacket類8.3DatagramSocket類8.4DatagramChannel類8.5組播Socket,.,3,第8章基于UDP的數(shù)據(jù)報和套接字,UDP(UserDatagramProtocol,用戶數(shù)據(jù)報協(xié)議)是傳輸層的另一種協(xié)議,它比TCP具有更快的傳輸速度,但是不可靠。UDP發(fā)送的數(shù)據(jù)單元稱為UDP數(shù)據(jù)報。當網(wǎng)絡傳輸UDP數(shù)據(jù)報時,無法保證數(shù)據(jù)報一定到達目的地,也無法保證各個數(shù)據(jù)報按發(fā)送的順序到達目的地。當發(fā)送方先發(fā)送包含字符串“hello”的數(shù)據(jù)報,再發(fā)送包含字符串“everyone”的數(shù)據(jù)報,接收方有可能先接收到字符串“everyone”,再接收到字符串“hello”;也有可能什么數(shù)據(jù)也沒有接收到,因為發(fā)送方發(fā)送的數(shù)據(jù)有可能在傳輸途中都丟失了。,.,4,8.1UDP協(xié)議簡介,在Java中,java.util.DatagramSocket負責接收和發(fā)送UDP數(shù)據(jù)報,java.util.DatagramPacket表示UDP數(shù)據(jù)報。如圖8-1所示,每個DatagramSocket與一個本地地址(包括本地主機的IP地址和本地UDP端口)綁定,每個DatagramSocket可以把UDP數(shù)據(jù)報發(fā)送給任意一個遠程DatagramSocket,也可以接收來自任意一個遠程DatagramSocket的UDP數(shù)據(jù)報。在UDP數(shù)據(jù)報中包含了目的地址的信息,DatagramSocket根據(jù)該信息把數(shù)據(jù)報發(fā)送到目的地。,.,5,8.1UDP協(xié)議簡介,UDP協(xié)議是無連接的協(xié)議,客戶端的DatagramSocket與服務器端的DatagramSocket不存在一一對應關系,兩者無需建立連接,就能交換數(shù)據(jù)報。DatagramSocket提供了接收和發(fā)送數(shù)據(jù)報的方法:publicvoidreceive(DatagramPacketdst)throwsIOException/接收數(shù)據(jù)報publicvoidsend(DatagramPacketsrc)throwsIOException/發(fā)送數(shù)據(jù)報,.,6,8.1UDP協(xié)議簡介,例程8-1的EchoServer與例程8-2的EchoClient就利用DatagramSocket來發(fā)送和接收數(shù)據(jù)報。同一時刻,可能會有多個EchoClient進程與EchoServer進程通信。EchoServer的DatagramSocket與UDP端口8000綁定,EchoClient則與任意一個可用的UDP端口綁定。EchoServer在一個while循環(huán)中不斷接收EchoClient的數(shù)據(jù)報,然后給EchoClient回復一個數(shù)據(jù)報。EchoClient從控制臺讀取用戶輸入的字符串,把它包裝成一個數(shù)據(jù)報,再把它發(fā)送給EchoServer,接著再接收EchoServer的響應數(shù)據(jù)報。,.,7,8.2DatagramPacket類,DatagramPacket表示數(shù)據(jù)報,它的構造方法可以分為兩類:一類構造方法創(chuàng)建的DatagramPacket對象用來接收數(shù)據(jù)還有一類構造方法創(chuàng)建的DatagramPacket對象用來發(fā)送數(shù)據(jù)。兩類構造方法的主要區(qū)別是,用于發(fā)送數(shù)據(jù)的構造方法需要設定數(shù)據(jù)報到達的目的地址,而用于接收數(shù)據(jù)的構造方法無需設定地址。,.,8,8.2DatagramPacket類,用于接收數(shù)據(jù)的構造方法包括:publicDatagramPacket(bytedata,intlength)publicDatagramPacket(bytedata,intoffset,intlength)以上data參數(shù)用來存放接收到的數(shù)據(jù),參數(shù)length指定要接收的字節(jié)數(shù),參數(shù)offset指定在data中存放數(shù)據(jù)的起始位置,即dataoffset。如果沒有設定參數(shù)offset,那么起始位置為data0。,.,9,8.2DatagramPacket類,用于發(fā)送數(shù)據(jù)的構造方法包括:publicDatagramPacket(bytedata,intoffset,intlength,InetAddressaddress,intport)publicDatagramPacket(bytedata,intoffset,intlength,SocketAddressaddress)publicDatagramPacket(bytedata,intlength,InetAddressaddress,intport)publicDatagramPacket(bytedata,intlength,SocketAddressaddress)以上data參數(shù)中存放了要發(fā)送的數(shù)據(jù),參數(shù)length指定要發(fā)送的字節(jié)數(shù),參數(shù)offset指定要發(fā)送的數(shù)據(jù)在data中的起始位置,即dataoffset。如果沒有設定參數(shù)offset,那么起始位置為data0。,.,10,8.2DatagramPacket類,以下兩段程序代碼都創(chuàng)建了一個數(shù)據(jù)報,它的送達地址為主機“myhost”的UDP端口100:InetAddressremoteIP=InetAddress.getByName(myhost);intremotePort=100;bytedata=hello.getBytes();/獲得字符串“hello”的字符編碼DatagramPacketoutputPacket=newDatagramPacket(data,data.length,remoteIP,remotePort);或者:InetAddressremoteIP=InetAddress.getByName(myhost);intremotePort=100;SocketAddressremoteAddr=newInetSocketAddress(remoteIP,remotePort);bytedata=hello.getBytes();DatagramPacketoutputPacket=newDatagramPacket(data,data.length,remoteAddr);,.,11,8.2.1選擇數(shù)據(jù)報的大小,DatagramPacket的構造方法有一個參數(shù)length,它決定了要接收或發(fā)送的數(shù)據(jù)報的長度。對于用于接收數(shù)據(jù)的DatagramPacket,如果實際接收到的數(shù)據(jù)報的長度大于DatagramPacket的長度,那么多余的數(shù)據(jù)就會被丟棄。因此,必須為DatagramPacket選擇合適的長度。理論上,IPv4數(shù)據(jù)報的最大長度為65507個字節(jié),如果一個DatagramPacket的長度為65507個字節(jié),那么它就可以接收任何IPv4數(shù)據(jù)報,而不會丟失數(shù)據(jù)。理論上,IPv6數(shù)據(jù)報的最大長度為65536字節(jié)。,.,12,8.2.1選擇數(shù)據(jù)報的大小,選擇數(shù)據(jù)報大小的通用原則是:如果網(wǎng)絡非常不可靠,如分組無線電網(wǎng)絡,則要選擇較小的數(shù)據(jù)報,以減少傳輸中遭破壞的可能性。如果網(wǎng)絡非常可靠,而且傳輸速度很快,就應當盡可能使用大的數(shù)據(jù)報。對于多數(shù)網(wǎng)絡,8K是一個很好的折衷方案。,.,13,8.2.2讀取和設置DatagramPacket的屬性,DatagramPacket類包括以下屬性:data:表示數(shù)據(jù)報的數(shù)據(jù)緩沖區(qū)。offset:表示數(shù)據(jù)報的數(shù)據(jù)緩沖區(qū)的起始位置。length:表示數(shù)據(jù)報的長度。address:對于用于發(fā)送的數(shù)據(jù)報,address屬性表示數(shù)據(jù)報的目標地址。對于用于接收的數(shù)據(jù)報,address屬性表示發(fā)送者的地址。port:對于用于發(fā)送的數(shù)據(jù)報,address屬性表示數(shù)據(jù)報的目標UDP端口。對于用于接收的數(shù)據(jù)報,port屬性表示接收者的UDP端口。,.,14,8.2.2讀取和設置DatagramPacket的屬性,DatagramPacket類提供了一系列get方法,用于讀取各種屬性:publicInetAddressgetAddress()publicintport()publicScoketAddressgetSocketAddress()publicbytegetData()publicintgetLength()publicintgetOffset(),.,15,8.2.2讀取和設置DatagramPacket的屬性,DatagramPacket類提供了一系列set方法,用于設置各種屬性:publicvoidsetAddress(InetAddressaddr)publicvoidsetPort(intport)publicvoidsetSocketAddress(SocketAddressaddress)publicvoidsetData(bytedata)publicvoidsetData(bytedata,intoffset,intlength)publicvoidsetLength(intlength),.,16,8.2.3數(shù)據(jù)格式的轉換,數(shù)據(jù)報中只能存放字節(jié)形式的數(shù)據(jù)。在發(fā)送方,需要把其他格式的數(shù)據(jù)轉換為字節(jié)序列。在接收方,需要把字節(jié)序列轉換為原來格式的數(shù)據(jù)。,.,17,8.2.3數(shù)據(jù)格式的轉換,在發(fā)送方,可以利用ByteArrayOutputStream和DataOuputStream來把其他格式的數(shù)據(jù)轉換為字節(jié)序列。例如以下longToByte()方法把long型數(shù)組中的數(shù)據(jù)轉換為字節(jié),把它們存放到一個字節(jié)數(shù)組中,再將其返回:publicbytelongToByte(longdata)throwsIOExceptionByteArrayOutputStreambao=newByteArrayOutputStream();DataOutputStreamdos=newDataOutputStream(bao);for(inti=0;idata.length;i+)dos.writeLong(datai);dos.close();returnbao.toByteArray();,.,18,8.2.3數(shù)據(jù)格式的轉換,在接收方,可以利用ByteArrayInputStream和DataInputStream來把字節(jié)序列轉換為原來格式的數(shù)據(jù)。例如以下byteToLong()方法把byte數(shù)組中的字節(jié)轉換為long型數(shù)據(jù),把它存放到一個long型數(shù)組中,再將其返回:publiclongbyteToLong(bytedata)throwsIOExceptionlongresult=newlongdata.length/8;/一個long數(shù)據(jù)占8個字節(jié)ByteArrayInputStreambai=newByteArrayInputStream(data);DataInputStreamdis=newDataInputStream(bai);for(inti=0;idata.length/8;i+)resulti=dis.readLong();returnresult;,.,19,8.2.4重用DatagramPacket,同一個DatagramPacket對象可以被重用,用來多次發(fā)送或接收數(shù)據(jù)。在例程8-3的DatagramTester類中,創(chuàng)建了sender和receiver兩個線程。sender線程負責發(fā)送數(shù)據(jù),這段操作由send()方法實現(xiàn)。Receiver線程負責接收數(shù)據(jù),這段操作由receive()方法實現(xiàn)。,.,20,8.3DatagramSocket類,DatagramSocket負責接收和發(fā)送數(shù)據(jù)報。每個DatagramSocket對象都會與一個本地端口綁定,在此端口監(jiān)聽發(fā)送過來的數(shù)據(jù)報。在客戶程序中,一般由操作系統(tǒng)為DatagramSocket分配本地端口,這種端口也稱為匿名端口;在服務器程序中,一般由程序顯式的為DatagramSocket指定本地端口。,.,21,8.3.1構造DatagramSocket,DatagramSocket的構造方法有以下幾種重載形式:(1)DatagramSocket()(2)DatagramSocket(intport)(3)DatagramSocket(intport,InetAddressladdr)(4)DatagramSocket(SocketAddressbindaddr),.,22,8.3.1構造DatagramSocket,如果想知道一個DatagramSocket對象所綁定的本地地址,可以調用它的以下方法:intgetLocalPort():返回DatagramSocket所綁定的端口。InetAddressgetLocalAddress():返回DatagramSocket所綁定的IP地址。SocketAddressgetLocalSocketAddress():返回一個SocketAddress對象,它包含DatagramSocket所綁定的IP地址和端口信息。,.,23,8.3.2接收和發(fā)送數(shù)據(jù)報,DatagramSocket的send()方法負責發(fā)送一個數(shù)據(jù)報,該方法的定義如下:publicvoidsend(DatagramPacketdp)throwsIOException值得注意的是,UDP協(xié)議提供不可靠的傳輸,如果數(shù)據(jù)報沒有到達目的地,send()方法不會拋出任何異常,因此發(fā)送方程序無法知道數(shù)據(jù)報是否被接收方接收到,除非雙方通過應用層的特定協(xié)議來確保接收方未收到數(shù)據(jù)報時,發(fā)送方能重發(fā)數(shù)據(jù)報。,.,24,8.3.2接收和發(fā)送數(shù)據(jù)報,DatagramSocket的receive()方法負責接收一個數(shù)據(jù)報,該方法的定義如下:publicvoidreceive(DatagramPacketdatagramPacket)throwsIOException此方法從網(wǎng)絡上接收一個數(shù)據(jù)報。如果網(wǎng)絡上沒有數(shù)據(jù)報,執(zhí)行該方法的線程會進入阻塞狀態(tài),直到收到數(shù)據(jù)報為止。,.,25,8.3.3管理連接,兩個TCPSocket之間存在固定的連接關系,而一個DatagramSocket可以與其他任意一個DatagramSocket交換數(shù)據(jù)報。在某些場合,一個DatagramSocket可能只希望與固定的另一個遠程DatagramSocket通信。例如NFS客戶只接收來自與之通信的服務器的數(shù)據(jù)報,再例如在網(wǎng)絡游戲中,一個游戲網(wǎng)家只接收他的游戲搭檔的數(shù)據(jù)報。,.,26,8.3.3管理連接,從JDK1.2開始,DatagramSocket添加了一些方法,利用這些方法,可以使一個DatagramSocket只能與另一個固定的DatagramSocket交換數(shù)據(jù)報:(1)publicvoidconnect(InetAddresshost,intport)(2)publicvoiddisconnect()(3)publicintgetPort()(4)publicInetAddressgetInetAddress()(5)publicSocketAddressgetRemoteSocketAddress(),.,27,8.3.4關閉DatagramSocket,DatagramSocket的close()方法會釋放所占用的本地UDP端口。在程序中及時關閉不再需要的DatagramSocket,這是好的編程習慣。,.,28,8.3.5DatagramSocket的選項,DatagramSocket有以下選項:SO_TIMEOUT:表示接收數(shù)據(jù)報時的等待超時時間。SO_RCVBUF:表示接收數(shù)據(jù)的緩沖區(qū)的大小。SO_SNDBUF:表示發(fā)送數(shù)據(jù)的緩沖區(qū)的大小。SO_REUSEADDR:表示是否允許重用DatagramSocket所綁定的本地地址。SO_BROADCAST:表示是否允許對網(wǎng)絡廣播地址收發(fā)數(shù)據(jù)報。,.,29,8.4DatagramChannel類,從JDK1.4開始,添加了一個支持按照非阻塞方式發(fā)送和接收數(shù)據(jù)報的DatagramChannel。DatagramChannel是SelectableChannel的子類,可以注冊到一個Selector。使用DatagramChannel,可以使得UDP服務器只需用單個線程就能同時與多個客戶通信。DatagramChannel默認情況下采用阻塞模式,如果希望該為非阻塞模式,可以調用configureBlocking(false)方法。,.,30,8.4.1創(chuàng)建DatagramChannel,DatagramChannel類的靜態(tài)open()方法返回一個DatagramChannel對象,每個DatagramChannel對象都關聯(lián)了一個DatagramSocket對象,DatagramChannel對象的socket()方法返回這個DatagramSocket對象。DatagramChannel對象創(chuàng)建后,與它關聯(lián)的DatagramSocket對象還沒有綁定到任何地址,必須調用DatagramSocket對象的bind()方法來與一個本地地址綁定:DatagramChannelchannel=DatagramChannel.open();DatagramSocketsocket=channel.socket();SocketAddressaddress=newInetSocketAddress(8000);socket.bind(address);,.,31,8.4.2管理連接,與DatagramSocket一樣,DatagramChannel的connect(SocketAddressremote)方法使得通道只能對特定的遠程地址收發(fā)數(shù)據(jù)報。DatagramChannel的isConnected()方法判斷通道是否只能對特定的遠程地址收發(fā)數(shù)據(jù)報。只要調用DatagramChannel的disconnect()方法,就能使得通道能再次對多個遠程地址收發(fā)數(shù)據(jù)報。UDP客戶程序通常只和特定的UDP服務器通信,因此可在UDP客戶程序中可以把DatagramChannel與遠程服務器連接。UDP服務器需要與多個UDP客戶程序通信,因此在UDP服務器中一般不用對DatagramChannel進行連接。,.,32,8.4.3用send()方法發(fā)送數(shù)據(jù)報,DatagramChannel的send(ByteBuffersrc,SocketAddresstarget)方法把參數(shù)src中的剩余數(shù)據(jù)作為一個數(shù)據(jù)報寫到通道中,參數(shù)target指定目標地址,該方法返回發(fā)送的字節(jié)數(shù):publicintsend(ByteBuffersrc,SocketAddresstarget)throwsIOException如果希望把相同數(shù)據(jù)發(fā)給多個客戶,可以重用源ByteBuffer。在這種情況下,每次都要把ByteBuffer的位置重新設為零:channel.send(src,target1);src.rewind();/把緩沖區(qū)的位置重設為零channel.send(src,target2);src.rewind();/把緩沖區(qū)的位置重設為零channel.send(src,target3);,.,33,8.4.4用receive()方法接收數(shù)據(jù)報,DatagramChannel的receive(ByteBufferdst)方法從通道中讀取一個數(shù)據(jù)報,存放在參數(shù)指定的ByteBuffer中,并返回數(shù)據(jù)報的發(fā)送方的地址:publicSocketAddressreceive(ByteBufferdst)throwsIOException如果DatagramChannel工作于阻塞模式,那么receive()方法在讀取到數(shù)據(jù)報之前不會返回。如果DatagramChannel工作于非阻塞模式,那么receive()方法在沒有數(shù)據(jù)報可讀取的情況下立即返回null。,.,34,8.4.4用receive()方法接收數(shù)據(jù)報,例程8-4的SendChannel和例程8-5的ReceiveChannel分別發(fā)送和接收數(shù)據(jù)報。SendChannel工作于默認的阻塞模式,每次發(fā)送的數(shù)據(jù)報的長度為1024個字節(jié)。ReceiveChannel既可以工作于阻塞模式,也可以工作于非阻塞模式,ReceiveChannel的用來存放接收到的數(shù)據(jù)報的緩沖區(qū)buffer的大小既可以為1024個字節(jié),也可以為4個字節(jié),這都取決于運行ReceiveChannel時設置的命令行參數(shù)。,.,35,8.4.5用write()方法發(fā)送數(shù)據(jù)報,write()方法和send()方法一樣,也能發(fā)送數(shù)據(jù)報。write()方法有三種重載形式:(1)publicintwrite(ByteBuffersrc)throwsIOException(2)publiclongwrite(ByteBuffersrcs)throwsIOException(3)publiclongwrite(ByteBuffersrcs,intoffset,intlength)throwsIOException,.,36,8.4.5用write()方法發(fā)送數(shù)據(jù)報,DatagramChannel的write()與send()方法的區(qū)別在于:(1)write()方法要求DatagramChannel已經(jīng)建立連接,也就是說,程序在調用DatagramChannel的write()方法之前,要求先調用connect()方法使通道與特定的遠程接收方連接。而send()方法則沒有這一限制。(2)在非阻塞模式下,write()方法不保證把ByteBuffer內的所有剩余數(shù)據(jù)作為一個數(shù)據(jù)報發(fā)送。假如ByteBuffer的剩余數(shù)據(jù)為r,實際發(fā)送的字節(jié)數(shù)為n,那么0=n=r。而send()方法總是把ByteBuffer內的所有剩余數(shù)據(jù)作為一個數(shù)據(jù)報發(fā)送。,.,37,8.4.6用read()方法接收數(shù)據(jù)報,read()方法和receive()方法一樣,也能接收數(shù)據(jù)報。read()方法有三種重載形式:publicintread(ByteBuffersrc)throwsIOExceptionpubliclongread(ByteBuffersrcs)throwsIOExceptionpubliclongread(ByteBuffersrcs,intoffset,intlength)throwsIOException,.,38,8.4.6用read()方法接收數(shù)據(jù)報,DatagramChannel的read()與receive()方法的區(qū)別在于:read()方法要求DatagramChannel已經(jīng)建立連接,也就是說,程序在調用DatagramChannel的read()方法之前,要求先調用connect()方法使通道與特定的遠程發(fā)送方連接。而receive()方法則沒有這一限制。,.,39,8.4.6用read()方法接收數(shù)據(jù)報,例程8-7的EchoClient使用DatagramChannel與EchoServer通信。EchoClient類共使用了兩個線程:主線程和Receiver線程。主線程主要負責接收和發(fā)送數(shù)據(jù),這些操作由talk()方法實現(xiàn)。Receiver線程負責讀取用戶向控制臺輸入的數(shù)據(jù),該操作由receiveFromUser()方法實現(xiàn)。,.,40,8.5組播Socket,網(wǎng)絡數(shù)據(jù)傳播按照接收者的數(shù)量,可分為以下三種方式:單播:提供點對點的通信。廣播:發(fā)送者每次發(fā)送的數(shù)據(jù)可以被傳播范圍內的所有接收者接收。組播:發(fā)送者每次發(fā)送的數(shù)據(jù)可以被小組內的所有接收者接收。,.,41,8.5組播Socket,組播組內的所有主機共享同一個地址,這種地址稱為組播地址。組播地址是范圍在55之間的IP地址。此范圍內的所有地址的前4個二進制位都是“1110”。組播地址也被稱為D類IP地址,與其他的A類、B類和C類地址相區(qū)別。組播組是開放的,主機可以在任何時候進入或離開組。IANA(InternetAssignedNumbersAuthority)組織負責分發(fā)永久組播地址。,.,42,8.5組播Socket,組播與單播UDP的區(qū)別在于,前者必須考慮TTL(TimeToLive)值,它用IP數(shù)據(jù)包的頭部的一個字節(jié)表示。TTL通過限制IP包被丟棄前通過的路由器數(shù)目,來決定IP包的生存時間。IP包每通過一個路由器,TTL就減一,當TTL變?yōu)?,這個包就被丟棄。TTL的一個作用是防止配置有誤的路由器把包在路由器之間無限的來回傳遞,還有一個作用是限制組播的地理范圍。,.,43,8.5.1MulticastSocket類,.MulticastSocket具有組播的功能,它是DatagramSocket的子類:publicclassMulticastSocketextendsDatagramSocket和DatagramSocket一樣,MulticastSocket也與DatagramPacket搭配使用,DatagramPacket用來存放接收和發(fā)送的組播數(shù)據(jù)報。,.,44,8.5.1MulticastSocket類,如果要接收組播數(shù)據(jù)報,只需創(chuàng)建一個MulticastSocket,把它加入到組播組,就能接收發(fā)送到該組的組播數(shù)據(jù)。發(fā)送組播數(shù)據(jù)報與發(fā)送單播數(shù)據(jù)報非常相似,只需創(chuàng)建一個MulticastSocket,無需把它加入到組播組(當然也可以把它加入到組播組),就能向一個組播組發(fā)送數(shù),.,45,8.5.1MulticastSocket類,1構造MulticastSocketMulticastSocket有以下構造方法:(1)publicMulticastSocket()throwsSocketException(2)publicMulticastSocket(intport)throwsSocketException(3)publicMulticastSocket(SocketAddressbindAddress)throwsSocketException,.,46,8.5.1MulticastSocket類,2與組播組通信MulticastSocket支持以下四種操作:(1)加入到組播組:joinGroup()方法(2)向組中成員發(fā)送數(shù)據(jù)報:send()方法(3)接收發(fā)送到組播組的數(shù)據(jù)報:receive()方法(4)離開組播組:leaveGroup()方法,.,47,8.5.1MulticastSocket類,3設置和獲得MulticastSocket的屬性MuliticastSocket類提供了兩組用于設置和讀取網(wǎng)絡接口的方法。MuliticastSocket只會對該網(wǎng)絡接口中的組收發(fā)組播數(shù)據(jù):/第1組方法publicvoidsetInterface(InetAddressaddress)throwsSocketExceptionpublicInetAddressgetInterface()throwsSocketException/第2組方法publicvoidsetNetworkInterface(NetworkInterfaceinterface)throwsSocketExceptionpublicNetworkInterfacegetNetworkInterface()throwsSocketException,.,48,8.5.2組播Socket的范例,例程8-8的MulticastSender類向一個IP地址為的組播組發(fā)送數(shù)據(jù)報。MulticastSocket發(fā)送數(shù)據(jù)報的方式與DatagramSocket非常相似:DatagramPacketdp=newDatagramPacket(buffer,buffer.length,group,port);ms.send(dp);/發(fā)送組播數(shù)據(jù)報MulticastSocket不管是否加入到組播組,都能發(fā)送組播數(shù)據(jù)報。因此把程序中的“ms.joinGroup(group);”這一行注釋掉,不會影響程序的運行效果。,.,49,8.5.2組播Socket的范例,在例程8-9的MulticastReceiver類中,MulticastSocket加入到IP地址為的組播組,然后不斷接收發(fā)往該組的數(shù)據(jù)報。MulticastSocket接收數(shù)據(jù)報的方式與DatagramSocket非常相似:DatagramPacketdp=newDatagramPacket(buffer,buffer.length);ms.receive(dp);/接收組播數(shù)據(jù)報,.,50,練習題1,問題:以下哪些敘述是正確的?選項:a)DatagramSocket的send(DatagramPacketsrc)方法發(fā)送數(shù)據(jù)報時,如果無法送達接收方,該方法會拋出IOException。b)UDP協(xié)議是無連接的協(xié)議。c)對于用于接收數(shù)據(jù)的DatagramPacket,如果實際接收到的數(shù)據(jù)報的長度大于DatagramPacket的長度,那么多余的數(shù)據(jù)就會被丟棄。d)DatagramSocket的getInputStream()方法用于獲得輸入流。答案:b,c,.,51,練習題2,問題:以下是DatagramPacket的構造方法,哪些用于發(fā)送數(shù)據(jù)報?選項:a)publicDatagramPacket(bytedata,intlength)b)publicDatagramPacket(bytedata,intoffs

溫馨提示

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

評論

0/150

提交評論