




已閱讀5頁,還剩51頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
.,1,Java網(wǎng)絡(luò)編程精解,作者:孫衛(wèi)琴參考書籍:技術(shù)支持網(wǎng)址:,.,2,第8章基于UDP的數(shù)據(jù)報和套接字,參考Java網(wǎng)絡(luò)編程精解的第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ù)報。當(dāng)網(wǎng)絡(luò)傳輸U(kuò)DP數(shù)據(jù)報時,無法保證數(shù)據(jù)報一定到達(dá)目的地,也無法保證各個數(shù)據(jù)報按發(fā)送的順序到達(dá)目的地。當(dāng)發(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ù)責(zé)接收和發(fā)送UDP數(shù)據(jù)報,java.util.DatagramPacket表示UDP數(shù)據(jù)報。如圖8-1所示,每個DatagramSocket與一個本地地址(包括本地主機(jī)的IP地址和本地UDP端口)綁定,每個DatagramSocket可以把UDP數(shù)據(jù)報發(fā)送給任意一個遠(yuǎn)程DatagramSocket,也可以接收來自任意一個遠(yuǎn)程DatagramSocket的UDP數(shù)據(jù)報。在UDP數(shù)據(jù)報中包含了目的地址的信息,DatagramSocket根據(jù)該信息把數(shù)據(jù)報發(fā)送到目的地。,.,5,8.1UDP協(xié)議簡介,UDP協(xié)議是無連接的協(xié)議,客戶端的DatagramSocket與服務(wù)器端的DatagramSocket不存在一一對應(yīng)關(guān)系,兩者無需建立連接,就能交換數(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進(jìn)程與EchoServer進(jìn)程通信。EchoServer的DatagramSocket與UDP端口8000綁定,EchoClient則與任意一個可用的UDP端口綁定。EchoServer在一個while循環(huán)中不斷接收EchoClient的數(shù)據(jù)報,然后給EchoClient回復(fù)一個數(shù)據(jù)報。EchoClient從控制臺讀取用戶輸入的字符串,把它包裝成一個數(shù)據(jù)報,再把它發(fā)送給EchoServer,接著再接收EchoServer的響應(yīng)數(shù)據(jù)報。,.,7,8.2DatagramPacket類,DatagramPacket表示數(shù)據(jù)報,它的構(gòu)造方法可以分為兩類:一類構(gòu)造方法創(chuàng)建的DatagramPacket對象用來接收數(shù)據(jù)還有一類構(gòu)造方法創(chuàng)建的DatagramPacket對象用來發(fā)送數(shù)據(jù)。兩類構(gòu)造方法的主要區(qū)別是,用于發(fā)送數(shù)據(jù)的構(gòu)造方法需要設(shè)定數(shù)據(jù)報到達(dá)的目的地址,而用于接收數(shù)據(jù)的構(gòu)造方法無需設(shè)定地址。,.,8,8.2DatagramPacket類,用于接收數(shù)據(jù)的構(gòu)造方法包括:publicDatagramPacket(bytedata,intlength)publicDatagramPacket(bytedata,intoffset,intlength)以上data參數(shù)用來存放接收到的數(shù)據(jù),參數(shù)length指定要接收的字節(jié)數(shù),參數(shù)offset指定在data中存放數(shù)據(jù)的起始位置,即dataoffset。如果沒有設(shè)定參數(shù)offset,那么起始位置為data0。,.,9,8.2DatagramPacket類,用于發(fā)送數(shù)據(jù)的構(gòu)造方法包括: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è)定參數(shù)offset,那么起始位置為data0。,.,10,8.2DatagramPacket類,以下兩段程序代碼都創(chuàng)建了一個數(shù)據(jù)報,它的送達(dá)地址為主機(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的構(gòu)造方法有一個參數(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)絡(luò)非常不可靠,如分組無線電網(wǎng)絡(luò),則要選擇較小的數(shù)據(jù)報,以減少傳輸中遭破壞的可能性。如果網(wǎng)絡(luò)非常可靠,而且傳輸速度很快,就應(yīng)當(dāng)盡可能使用大的數(shù)據(jù)報。對于多數(shù)網(wǎng)絡(luò),8K是一個很好的折衷方案。,.,13,8.2.2讀取和設(shè)置DatagramPacket的屬性,DatagramPacket類包括以下屬性:data:表示數(shù)據(jù)報的數(shù)據(jù)緩沖區(qū)。offset:表示數(shù)據(jù)報的數(shù)據(jù)緩沖區(qū)的起始位置。length:表示數(shù)據(jù)報的長度。address:對于用于發(fā)送的數(shù)據(jù)報,address屬性表示數(shù)據(jù)報的目標(biāo)地址。對于用于接收的數(shù)據(jù)報,address屬性表示發(fā)送者的地址。port:對于用于發(fā)送的數(shù)據(jù)報,address屬性表示數(shù)據(jù)報的目標(biāo)UDP端口。對于用于接收的數(shù)據(jù)報,port屬性表示接收者的UDP端口。,.,14,8.2.2讀取和設(shè)置DatagramPacket的屬性,DatagramPacket類提供了一系列g(shù)et方法,用于讀取各種屬性:publicInetAddressgetAddress()publicintport()publicScoketAddressgetSocketAddress()publicbytegetData()publicintgetLength()publicintgetOffset(),.,15,8.2.2讀取和設(shè)置DatagramPacket的屬性,DatagramPacket類提供了一系列set方法,用于設(shè)置各種屬性:publicvoidsetAddress(InetAddressaddr)publicvoidsetPort(intport)publicvoidsetSocketAddress(SocketAddressaddress)publicvoidsetData(bytedata)publicvoidsetData(bytedata,intoffset,intlength)publicvoidsetLength(intlength),.,16,8.2.3數(shù)據(jù)格式的轉(zhuǎn)換,數(shù)據(jù)報中只能存放字節(jié)形式的數(shù)據(jù)。在發(fā)送方,需要把其他格式的數(shù)據(jù)轉(zhuǎn)換為字節(jié)序列。在接收方,需要把字節(jié)序列轉(zhuǎn)換為原來格式的數(shù)據(jù)。,.,17,8.2.3數(shù)據(jù)格式的轉(zhuǎn)換,在發(fā)送方,可以利用ByteArrayOutputStream和DataOuputStream來把其他格式的數(shù)據(jù)轉(zhuǎn)換為字節(jié)序列。例如以下longToByte()方法把long型數(shù)組中的數(shù)據(jù)轉(zhuǎn)換為字節(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ù)格式的轉(zhuǎn)換,在接收方,可以利用ByteArrayInputStream和DataInputStream來把字節(jié)序列轉(zhuǎn)換為原來格式的數(shù)據(jù)。例如以下byteToLong()方法把byte數(shù)組中的字節(jié)轉(zhuǎn)換為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ù)責(zé)發(fā)送數(shù)據(jù),這段操作由send()方法實現(xiàn)。Receiver線程負(fù)責(zé)接收數(shù)據(jù),這段操作由receive()方法實現(xiàn)。,.,20,8.3DatagramSocket類,DatagramSocket負(fù)責(zé)接收和發(fā)送數(shù)據(jù)報。每個DatagramSocket對象都會與一個本地端口綁定,在此端口監(jiān)聽發(fā)送過來的數(shù)據(jù)報。在客戶程序中,一般由操作系統(tǒng)為DatagramSocket分配本地端口,這種端口也稱為匿名端口;在服務(wù)器程序中,一般由程序顯式的為DatagramSocket指定本地端口。,.,21,8.3.1構(gòu)造DatagramSocket,DatagramSocket的構(gòu)造方法有以下幾種重載形式:(1)DatagramSocket()(2)DatagramSocket(intport)(3)DatagramSocket(intport,InetAddressladdr)(4)DatagramSocket(SocketAddressbindaddr),.,22,8.3.1構(gòu)造DatagramSocket,如果想知道一個DatagramSocket對象所綁定的本地地址,可以調(diào)用它的以下方法:intgetLocalPort():返回DatagramSocket所綁定的端口。InetAddressgetLocalAddress():返回DatagramSocket所綁定的IP地址。SocketAddressgetLocalSocketAddress():返回一個SocketAddress對象,它包含DatagramSocket所綁定的IP地址和端口信息。,.,23,8.3.2接收和發(fā)送數(shù)據(jù)報,DatagramSocket的send()方法負(fù)責(zé)發(fā)送一個數(shù)據(jù)報,該方法的定義如下:publicvoidsend(DatagramPacketdp)throwsIOException值得注意的是,UDP協(xié)議提供不可靠的傳輸,如果數(shù)據(jù)報沒有到達(dá)目的地,send()方法不會拋出任何異常,因此發(fā)送方程序無法知道數(shù)據(jù)報是否被接收方接收到,除非雙方通過應(yīng)用層的特定協(xié)議來確保接收方未收到數(shù)據(jù)報時,發(fā)送方能重發(fā)數(shù)據(jù)報。,.,24,8.3.2接收和發(fā)送數(shù)據(jù)報,DatagramSocket的receive()方法負(fù)責(zé)接收一個數(shù)據(jù)報,該方法的定義如下:publicvoidreceive(DatagramPacketdatagramPacket)throwsIOException此方法從網(wǎng)絡(luò)上接收一個數(shù)據(jù)報。如果網(wǎng)絡(luò)上沒有數(shù)據(jù)報,執(zhí)行該方法的線程會進(jìn)入阻塞狀態(tài),直到收到數(shù)據(jù)報為止。,.,25,8.3.3管理連接,兩個TCPSocket之間存在固定的連接關(guān)系,而一個DatagramSocket可以與其他任意一個DatagramSocket交換數(shù)據(jù)報。在某些場合,一個DatagramSocket可能只希望與固定的另一個遠(yuǎn)程DatagramSocket通信。例如NFS客戶只接收來自與之通信的服務(wù)器的數(shù)據(jù)報,再例如在網(wǎng)絡(luò)游戲中,一個游戲網(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關(guān)閉DatagramSocket,DatagramSocket的close()方法會釋放所占用的本地UDP端口。在程序中及時關(guān)閉不再需要的DatagramSocket,這是好的編程習(xí)慣。,.,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)絡(luò)廣播地址收發(fā)數(shù)據(jù)報。,.,29,8.4DatagramChannel類,從JDK1.4開始,添加了一個支持按照非阻塞方式發(fā)送和接收數(shù)據(jù)報的DatagramChannel。DatagramChannel是SelectableChannel的子類,可以注冊到一個Selector。使用DatagramChannel,可以使得UDP服務(wù)器只需用單個線程就能同時與多個客戶通信。DatagramChannel默認(rèn)情況下采用阻塞模式,如果希望該為非阻塞模式,可以調(diào)用configureBlocking(false)方法。,.,30,8.4.1創(chuàng)建DatagramChannel,DatagramChannel類的靜態(tài)open()方法返回一個DatagramChannel對象,每個DatagramChannel對象都關(guān)聯(lián)了一個DatagramSocket對象,DatagramChannel對象的socket()方法返回這個DatagramSocket對象。DatagramChannel對象創(chuàng)建后,與它關(guān)聯(lián)的DatagramSocket對象還沒有綁定到任何地址,必須調(diào)用DatagramSocket對象的bind()方法來與一個本地地址綁定:DatagramChannelchannel=DatagramChannel.open();DatagramSocketsocket=channel.socket();SocketAddressaddress=newInetSocketAddress(8000);socket.bind(address);,.,31,8.4.2管理連接,與DatagramSocket一樣,DatagramChannel的connect(SocketAddressremote)方法使得通道只能對特定的遠(yuǎn)程地址收發(fā)數(shù)據(jù)報。DatagramChannel的isConnected()方法判斷通道是否只能對特定的遠(yuǎn)程地址收發(fā)數(shù)據(jù)報。只要調(diào)用DatagramChannel的disconnect()方法,就能使得通道能再次對多個遠(yuǎn)程地址收發(fā)數(shù)據(jù)報。UDP客戶程序通常只和特定的UDP服務(wù)器通信,因此可在UDP客戶程序中可以把DatagramChannel與遠(yuǎn)程服務(wù)器連接。UDP服務(wù)器需要與多個UDP客戶程序通信,因此在UDP服務(wù)器中一般不用對DatagramChannel進(jìn)行連接。,.,32,8.4.3用send()方法發(fā)送數(shù)據(jù)報,DatagramChannel的send(ByteBuffersrc,SocketAddresstarget)方法把參數(shù)src中的剩余數(shù)據(jù)作為一個數(shù)據(jù)報寫到通道中,參數(shù)target指定目標(biāo)地址,該方法返回發(fā)送的字節(jié)數(shù):publicintsend(ByteBuffersrc,SocketAddresstarget)throwsIOException如果希望把相同數(shù)據(jù)發(fā)給多個客戶,可以重用源ByteBuffer。在這種情況下,每次都要把ByteBuffer的位置重新設(shè)為零:channel.send(src,target1);src.rewind();/把緩沖區(qū)的位置重設(shè)為零channel.send(src,target2);src.rewind();/把緩沖區(qū)的位置重設(shè)為零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工作于默認(rèn)的阻塞模式,每次發(fā)送的數(shù)據(jù)報的長度為1024個字節(jié)。ReceiveChannel既可以工作于阻塞模式,也可以工作于非阻塞模式,ReceiveChannel的用來存放接收到的數(shù)據(jù)報的緩沖區(qū)buffer的大小既可以為1024個字節(jié),也可以為4個字節(jié),這都取決于運行ReceiveChannel時設(shè)置的命令行參數(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)建立連接,也就是說,程序在調(diào)用DatagramChannel的write()方法之前,要求先調(diào)用connect()方法使通道與特定的遠(yuǎn)程接收方連接。而send()方法則沒有這一限制。(2)在非阻塞模式下,write()方法不保證把ByteBuffer內(nèi)的所有剩余數(shù)據(jù)作為一個數(shù)據(jù)報發(fā)送。假如ByteBuffer的剩余數(shù)據(jù)為r,實際發(fā)送的字節(jié)數(shù)為n,那么0=n=r。而send()方法總是把ByteBuffer內(nèi)的所有剩余數(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)建立連接,也就是說,程序在調(diào)用DatagramChannel的read()方法之前,要求先調(diào)用connect()方法使通道與特定的遠(yuǎn)程發(fā)送方連接。而receive()方法則沒有這一限制。,.,39,8.4.6用read()方法接收數(shù)據(jù)報,例程8-7的EchoClient使用DatagramChannel與EchoServer通信。EchoClient類共使用了兩個線程:主線程和Receiver線程。主線程主要負(fù)責(zé)接收和發(fā)送數(shù)據(jù),這些操作由talk()方法實現(xiàn)。Receiver線程負(fù)責(zé)讀取用戶向控制臺輸入的數(shù)據(jù),該操作由receiveFromUser()方法實現(xiàn)。,.,40,8.5組播Socket,網(wǎng)絡(luò)數(shù)據(jù)傳播按照接收者的數(shù)量,可分為以下三種方式:單播:提供點對點的通信。廣播:發(fā)送者每次發(fā)送的數(shù)據(jù)可以被傳播范圍內(nèi)的所有接收者接收。組播:發(fā)送者每次發(fā)送的數(shù)據(jù)可以被小組內(nèi)的所有接收者接收。,.,41,8.5組播Socket,組播組內(nèi)的所有主機(jī)共享同一個地址,這種地址稱為組播地址。組播地址是范圍在55之間的IP地址。此范圍內(nèi)的所有地址的前4個二進(jìn)制位都是“1110”。組播地址也被稱為D類IP地址,與其他的A類、B類和C類地址相區(qū)別。組播組是開放的,主機(jī)可以在任何時候進(jìn)入或離開組。IANA(InternetAssignedNumbersAuthority)組織負(fù)責(zé)分發(fā)永久組播地址。,.,42,8.5組播Socket,組播與單播UDP的區(qū)別在于,前者必須考慮TTL(TimeToLive)值,它用IP數(shù)據(jù)包的頭部的一個字節(jié)表示。TTL通過限制IP包被丟棄前通過的路由器數(shù)目,來決定IP包的生存時間。IP包每通過一個路由器,TTL就減一,當(dāng)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,無需把它加入到組播組(當(dāng)然也可以把它加入到組播組),就能向一個組播組發(fā)送數(shù),.,45,8.5.1MulticastSocket類,1構(gòu)造MulticastSocketMulticastSocket有以下構(gòu)造方法:(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設(shè)置和獲得MulticastSocket的屬性MuliticastSocket類提供了兩組用于設(shè)置和讀取網(wǎng)絡(luò)接口的方法。MuliticastSocket只會對該網(wǎng)絡(luò)接口中的組收發(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,練習(xí)題1,問題:以下哪些敘述是正確的?選項:a)DatagramSocket的send(DatagramPacketsrc)方法發(fā)送數(shù)據(jù)報時,如果無法送達(dá)接收方,該方法會拋出IOException。b)UDP協(xié)議是無連接的協(xié)議。c)對于用于接收數(shù)據(jù)的DatagramPacket,如果實際接收到的數(shù)據(jù)報的長度大于DatagramPacket的長度,那么多余的數(shù)據(jù)就會被丟棄。d)DatagramSocket的getInputStream()方法用于獲得輸入流。答案:b,c,.,51,練習(xí)題2,問題:以下是DatagramPacket的構(gòu)造方法,哪些用于發(fā)送數(shù)據(jù)報?選項:a)publicDatagramPacket(bytedata,intlength)b)publicDatagramPacket(bytedata,intoffs
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年一月聚丙烯基熒光探針檢測靈敏度協(xié)議
- 個人信貸合同范例
- 房屋租賃合同臺帳
- 東莞會策劃合同樣本
- 住房擔(dān)保貸款合同樣本
- 標(biāo)準(zhǔn)聘用合同
- 乒乓球館租賃服務(wù)合同標(biāo)準(zhǔn)文本
- 二零二五版農(nóng)家樂住宿房裝修合同
- 二零二五危險品運輸駕駛員聘用合同
- 二零二五房屋受損賠償協(xié)議書范例
- 2024年度糖尿病2024年指南版課件
- 2024年鄭州黃河護(hù)理職業(yè)學(xué)院單招職業(yè)技能測試題庫及答案解析文檔版
- 非機(jī)動車交通管理及規(guī)劃研究
- 勞務(wù)派遣及醫(yī)院護(hù)工實施預(yù)案
- 華電行測題庫及答案2024
- 產(chǎn)后病(中醫(yī)婦科學(xué))
- 蘇州市2023-2024學(xué)年高一上學(xué)期期末考試數(shù)學(xué)試題(原卷版)
- 社區(qū)獲得性肺炎教學(xué)演示課件
- 農(nóng)村藍(lán)莓樹補(bǔ)償標(biāo)準(zhǔn)
- 1.3.1 三角函數(shù)的周期性課件
評論
0/150
提交評論