java就業(yè)培訓(xùn)晰版第十一章網(wǎng)絡(luò)編程_第1頁(yè)
java就業(yè)培訓(xùn)晰版第十一章網(wǎng)絡(luò)編程_第2頁(yè)
java就業(yè)培訓(xùn)晰版第十一章網(wǎng)絡(luò)編程_第3頁(yè)
java就業(yè)培訓(xùn)晰版第十一章網(wǎng)絡(luò)編程_第4頁(yè)
java就業(yè)培訓(xùn)晰版第十一章網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡(jiǎn)介

11而沒(méi)有聯(lián)網(wǎng),就等于買(mǎi)了機(jī)卻沒(méi)有接線(xiàn)一樣。計(jì)算機(jī)網(wǎng)絡(luò)就是實(shí)現(xiàn)了多個(gè)計(jì)算機(jī)互聯(lián)的系統(tǒng),相互連接的計(jì)算機(jī)之間彼此能夠進(jìn)行數(shù)據(jù)交TCP/IPInternet于TCP/IP協(xié)議的。TCP/IP網(wǎng)絡(luò)程序的IP地址和端IP使用,現(xiàn)在網(wǎng)絡(luò)上用的還都是Ipv4,我們這里的知識(shí)也只圍繞著Ipv4來(lái)展開(kāi)。0-65535之間。0-1023之間的端口數(shù)是用于一些知名的網(wǎng)絡(luò)服務(wù)和應(yīng)用,用戶(hù)的普通網(wǎng)絡(luò)應(yīng)用程序應(yīng)該使用1024以上的端口數(shù),從而避免端已被另一個(gè)應(yīng)用或系統(tǒng)服后,驅(qū)動(dòng)程序根據(jù)數(shù)據(jù)包中的3150這個(gè)端,就知道要將這個(gè)數(shù)據(jù)包交給這個(gè)網(wǎng)絡(luò)程序。UDP制協(xié)議"(TransmissionControlProtocol,簡(jiǎn)稱(chēng)TCP)和"用戶(hù)數(shù)據(jù)報(bào)協(xié)議"(UserDatagramProtocol,簡(jiǎn)稱(chēng)UDP。把數(shù)據(jù)當(dāng)作一個(gè)雙向字節(jié)流進(jìn)行交換。就像我們打一樣,互相能聽(tīng)到對(duì)方的說(shuō)話(huà),也知道對(duì)方UDPUDP

SocketSocket中提取接收到的數(shù)據(jù)。網(wǎng)絡(luò)應(yīng)用程序就是這樣通過(guò)Socket進(jìn)行數(shù)據(jù)的發(fā)送與接收的。

Java編寫(xiě)UDP看到DatagramSocket類(lèi)的構(gòu)造函數(shù)主要有如下幾種形式:publicDatagramSocket()throwspublicDatagramSocket(intport)throwspublicDatagramSocket(intport,InetAddressladdr)throws用第一個(gè)構(gòu)造函數(shù)創(chuàng)建DatagramSocket對(duì)象,沒(méi)有指定端,系統(tǒng)就會(huì)為我們分配一個(gè)還沒(méi)有被其他網(wǎng)絡(luò)程序所使用的端。用第二個(gè)構(gòu)造函數(shù)創(chuàng)建DatagramSocket對(duì)象,我們就可以指定自己想要的端。用第三個(gè)構(gòu)造函數(shù)創(chuàng)建DatagramSocket對(duì)象,我們除了指定自己想要的們可以明確規(guī)定我們的數(shù)據(jù)通過(guò)哪塊網(wǎng)卡向外發(fā)送和接收哪塊網(wǎng)卡收到的數(shù)據(jù)。如果在創(chuàng)建IP個(gè)網(wǎng)絡(luò)程序只能在具有這個(gè)IP地址的計(jì)算機(jī)上運(yùn)行,而不能在其他的計(jì)算機(jī)上運(yùn)行。DatagramSocket別人打時(shí),你的可以是任意的,最好不要固定,如果你非要用某個(gè),那當(dāng)別人正在用這個(gè)時(shí),你就只有干等的份了。但作為接收程序,須自己指定一個(gè)端,而不要讓系且每一次運(yùn)行所分配的端都不一樣,就象有朋友讓你給他打,可他的不確定是不SocketDatagramSocket.close()方法,關(guān)閉這publicvoidsend(DatagramPacketp)throwspublicvoidreceive(DatagramPacketp)throwspublicDatagramPacket(byte[]buf,intpublicDatagramPacket(byte[]buf,intlength,InetAddressaddress,intDatagramPakcetDatagramPacketSocket創(chuàng)建發(fā)送數(shù)據(jù)的DatagramPakcet對(duì)象。在發(fā)送數(shù)據(jù)時(shí),DatagramPacket構(gòu)造方法需要我們傳遞一個(gè)InetAddress類(lèi)的實(shí)例對(duì)象, 個(gè)靜態(tài)方法能夠根據(jù)我們的條件返回一個(gè)InetAddress類(lèi)的實(shí)例對(duì)象。文檔中,我們又看到了DatagramPacket.getInetAddress()和DatagramPacket.getPort()方法。符串型的IP地址。在JDK文檔中去查InetAddress類(lèi)的幫助,我們又可以看到InetAddress.getHostAddressInetAddressIP地址。import.*;publicclassUdpSend{publicstaticvoidmain(String[]args)throws{DatagramSocketds=newString oDatagramPacketdp=new}}import.*;publicclassUdpRecv{publicstaticvoidmain(String[]args)throws{DatagramSocketds=newDatagramSocket(3000);byte[]buf=newbyte[1024];DatagramPacketdp=newDatagramPacket(buf,1024);StringstrRecv=newString(dp.getData(),0,dp.getLength())+“from”}}String.getBytesbyteStringpublicString(byte[]bytes,intoffset,intlength)構(gòu)造方法,將byte型的數(shù)組轉(zhuǎn)換成publicString(byte[]bytesbyte1024能正好是1024個(gè)字節(jié),如上面程序中,我們只收到的“oworld”,只有11個(gè)字節(jié)的數(shù)據(jù),publicString(byte[]bytes)是將數(shù)組中的所有元素都轉(zhuǎn)換成字符串,即將這1024個(gè)字節(jié)都轉(zhuǎn)換成字符串,包括那些根本沒(méi)有被添充的單元。publicString(byte[]bytes,intoffset,intlength)是將字節(jié)數(shù)組中從offset開(kāi)始,往后一共length個(gè)單元的內(nèi)容轉(zhuǎn)換成字符串,DatagramPacket.getLength()方法可以返回?cái)?shù)據(jù)包中實(shí)際收到的字節(jié)數(shù)。所以,接收程序中的“StringstrRecv=newString(dp.getData(),0,dp.getLength())+"from"+dp.getAddress().getHostAddress()+”:”+dp.getPortUDP數(shù)據(jù)的發(fā)送,類(lèi)似發(fā)送尋呼一樣的道理,發(fā)送者將數(shù)據(jù)發(fā)送出去就不管了,是不可靠的,接收程序,再運(yùn)行UDP接收程序運(yùn)行到DatagramSocket.receive方法接收數(shù)據(jù)時(shí),如果還沒(méi)有可以接收的數(shù)據(jù),在正常情況下,receive方法將阻塞,一直等到網(wǎng)絡(luò)上有數(shù)據(jù)到來(lái),receive接收該數(shù)據(jù)并返回。如果網(wǎng)絡(luò)上沒(méi)有數(shù)據(jù)發(fā)送過(guò)來(lái),receive方法也沒(méi)有阻塞,肯定是你前面的程序出現(xiàn)了問(wèn)題,通常都是使用了一個(gè)還在被其他程序占用的端,你的DatagramSocket綁定沒(méi)有成功。IP設(shè)置成接收數(shù)據(jù)的計(jì)算機(jī)的IP地址。如果將UdpSend程序中發(fā)送的內(nèi)容改為中文,如“我的程序”,接收到的內(nèi)容有問(wèn)題,請(qǐng)先想想DatagramPacketdp=newDatagramPacket(str.getBytes(),str.length(),DatagramPacketdp=newDatagramPacket(str.getBytes(),str.getBytes().length,的網(wǎng)絡(luò)應(yīng)用程序,這個(gè)程序具有圖形用戶(hù)界面,如圖11.4所示:importjava.awt.*;publicclassChat{Framef=newFrame("我的聊天室");TextFieldtfIP=newTextField(15);Listlst=newpublicstaticvoidmain(String[]{Chatchat=newChat();}publicvoid{Panelp=newPanel();p.setLayout(newBorderLayout());TextFieldtfData=newTextField(20);{publicvoidwindowClosing(WindowEvent{}{publicvoidactionPerformed(ActionEvent{}}}importjava.awt.*;import.*;publicclassChat{Framef=newFrame("我的聊天室");TextFieldtfIP=newTextField(15);Listlst=newList(6);DatagramSocketds;publicChat(){{ds=new}publicstaticvoidmain(String[]{Chatchat=newChat();}publicvoid{Panelp=newPanel();p.setLayout(newBorderLayout());TextFieldtfData=newTextField(20);{publicvoidwindowClosing(WindowEvent{}{publicvoidactionPerformed(ActionEvent{byte[]buf;buf DatagramPacketdp=newDatagramPacket(buf,buf.length,{}}}importjava.awt.*;import.*;publicclassChat{Framef=newFrame("我的聊天室");TextFieldtfIP=newTextField(15);Listlst=newList(6);publicChat(){{ds=newnewThread(new{publicvoid{bytebuf[]=newDatagramPacketdp=newDatagramPacket(buf,1024);{{

lst.add(newString(buf,0,dp.getLength())+}}}}在上面的程序中,我們使用的是Listadd(Stringitem,intindex)方法將接收到的消息IPIP指向自己的主機(jī),你就能夠收到自己給自己發(fā)送的數(shù)據(jù)了。IP機(jī)所在的網(wǎng)絡(luò)號(hào)為192.168.0,子網(wǎng)掩碼是,所以,這個(gè)網(wǎng)段的廣播地址就是55。順便給大家補(bǔ)充點(diǎn)兒網(wǎng)絡(luò)方面的知識(shí),如果作者所在網(wǎng)絡(luò)的子網(wǎng)掩碼是,那么這個(gè)網(wǎng)段的廣播地址就是55,讀者要將上面的IP文本框中的目而是直接在main方法中調(diào)用,如下所示:publicstaticvoidmain(String[]{Chatchat=newChat();}publicvoid{bytebuf[]=newDatagramPacketdp=newDatagramPacket(buf,1024);{{

lst.add(newString(buf,0,dp.getLength())+}}mainJava編寫(xiě)TCP者的功能和編寫(xiě)方法大不一樣。TCP服務(wù)器程序類(lèi)似114查號(hào)臺(tái),而TCP客戶(hù)機(jī)程序類(lèi)似普通 必須先有114查號(hào)臺(tái),普通 才能撥打114,在114查號(hào)臺(tái)那邊是先有一個(gè)總機(jī),總機(jī)專(zhuān)門(mén)用來(lái) 直接,而是將接進(jìn)來(lái)的 。Java中提供的ServerSocket類(lèi)用于完成類(lèi)似114查號(hào)臺(tái)總機(jī)的功能,Socket類(lèi)用于完成普通 和114查號(hào)臺(tái)編寫(xiě)TCP.ServerSocketpublicServerSocket()throwspublicServerSocket(intport)throwspublicServerSocket(intport,intbacklog)throws續(xù)調(diào)用bind方法,才能完成其他構(gòu)造函數(shù)所完成的功能。的端口上,就象為我們的呼叫中心安排一個(gè)一樣,如果在這里指定的端為0,系統(tǒng)就其他客戶(hù)才能根據(jù)這個(gè)號(hào)碼進(jìn)行連接,所以將端指定為0的情況并不常見(jiàn)。用第三個(gè)構(gòu)造函數(shù)創(chuàng)建ServerSocket對(duì)象,就是在第二個(gè)構(gòu)造函數(shù)的基礎(chǔ)上,我們根據(jù)有指定這個(gè)參數(shù),則使用默認(rèn)的數(shù)量,大小為50。用第四個(gè)構(gòu)造函數(shù)創(chuàng)建ServerSocket對(duì)象,我們除了指定第三個(gè)構(gòu)造函數(shù)中的參數(shù)外,還可第二個(gè)構(gòu)造方法來(lái)創(chuàng)建我們的ServerSocket對(duì)象是非常合適和方便的。publicpublicSocket(Stringhost,intport)throwsUnknownHostException,IOExceptionpublicSocket(InetAddressaddress,intport)throwsIOExceptionpublicSocket(Stringhost,intport,InetAddresslocalAddr,intlocalPort)throwsIOExceptionpublicSocket(InetAddressaddress,intport,InetAddresslocalAddr,intlocalPort)throwsIOExceptionSocketSocketSocket造函數(shù)來(lái)創(chuàng)建客戶(hù)端的Socket對(duì)象并與服務(wù)器建立連接,是非常簡(jiǎn)單和方便的。Socketimport.*;importjava.io.*;publicclassTcpServer{publicstaticvoidmain(String[]{{ServerSocketss=newServerSocket(8001);Sockets=ss.accept();InputStreamips=s.getInputStream(); eto byte[]buf=newbyte[1024];intlen=ips.read(buf);}}Socket然后才能夠運(yùn)行TCP客戶(hù)程序。程序占用的端,你的ServerSocket綁定沒(méi)有成功。完服務(wù)程序后,都還要自己編寫(xiě)一個(gè)客戶(hù)端程序來(lái)測(cè)試,顯然是不太現(xiàn)實(shí)的。其實(shí),Windows試。我們只要在運(yùn)行net時(shí),指定所要連接的服務(wù)器程序的IP地址和端,net程序就會(huì)按照指定參數(shù)去與服務(wù)器程序建立連接。連接建立后,在net程序窗口中鍵盤(pán)輸入的內(nèi)容調(diào)整,結(jié)果如11.6所示:import.*;importjava.io.*;publicclassTcpServer{publicstaticvoidmain(String[]{{ServerSocketss=newServerSocket(8001);Sockets=ss.accept();InputStreamips=s.getInputStream(); e BufferedReaderbr=newBufferedReader(newInputStreamReader(ips));}}行本地回顯,我們只能用盲打的方式鍵入我們的字符,很不方便。其實(shí),我們可以對(duì)net程序程序的本地回顯功能,最后執(zhí)行quit退出。以后,我們?cè)趎et程序令窗口中的鍵盤(pán)輸入就能獨(dú)的線(xiàn)程與客戶(hù)進(jìn)行。這程序是每個(gè)TCP服務(wù)器程序的基本框架和雛形,如戶(hù)端向服務(wù)器端發(fā)送quit命令,結(jié)束兩端的?,F(xiàn)服務(wù)器端與客戶(hù)段的功能,這個(gè)類(lèi)就叫Servicer吧!importjava.io.*;classServicerimplements{SocketpublicServicer(Socket{this.s=}publicvoid{{

InputStreamips=s.getInputStream();BufferedReaderbr=newBufferedReader(newInputStreamReader(ips));DataOutputStreamdos=newDataOutputStream(ops);{

StringstrWord=//System.out.println(strWord+":"+strWord.length());if(strWord.equalsIgnoreCase("quit"))//dos.writeBytes(strWord+"---->"+strEcho+"\r\n");dos.writeBytes(strWord+"---->"+strEcho+ br.close關(guān)閉包裝類(lèi),會(huì)自動(dòng)關(guān)閉包裝類(lèi)中所包裝的底層類(lèi)。所以不用調(diào)用}}class{publicstaticvoidmain(String[]{{

ServerSocketss=newServerSocket(8001);{SocketnewThread(new}}}如圖11.8所示:

dc,最后回車(chē)發(fā)送給服務(wù)器。發(fā)現(xiàn)服務(wù)器回送的結(jié)果如下:abc>dba形式保留給了讀者參考。對(duì)上面的情況,服務(wù)器上打印的結(jié)果是abc:5,盡管顯示的內(nèi)容是abc,但服務(wù)器程序?qū)嶋H收到了5個(gè)字符,說(shuō)明字符串的內(nèi)容就是abd{backspace}c,由于{backspace}的特殊顯示效果,這個(gè)五個(gè)字符在窗口上的顯示結(jié)果就是abc,這個(gè)字符串的反向排序結(jié)果是c{backspace}dba,服務(wù)器程序回送的結(jié)果實(shí)際上是abd{backspace}c>c{backspace}dba,由于{backspace}的特殊顯示效果,所以我們?cè)趎et窗口中顯示的是abc>dba??梢?jiàn),我們通過(guò)網(wǎng).*;importjava.io.*;publicclassTcp{publicstaticvoidmain(String[]{{

//Sockets=newSocket(InetAddress.getByName("13"),8001);if(args.length<2){System.out.println("Usage:javaTcp ServerIPServerPort");}Sockets=newInputStreamips=s.getInputStream();OutputStreamBufferedReaderbrKeynewBufferedReader(newInputStreamReader(System.in));DataOutputStreamdos=newDataOutputStream(ops);{StringstrWord=dos.writeBytes(strWord+System.getProperty("line.separator"));}}}在上面的程序中,客戶(hù)端要連接的服務(wù)器的IP地址和端都是在運(yùn)行程序時(shí)通過(guò)參數(shù)指定java 13命令后結(jié)束。我們也可以同時(shí)運(yùn)行幾個(gè)這樣的客戶(hù)端程序和幾個(gè)net程序,對(duì)服務(wù)器端來(lái)說(shuō)都況的原因大都屬于該網(wǎng)絡(luò)程序的端被別的程序占用了。我們?cè)趺粗雷约旱挠?jì)算機(jī)上有哪些端netstat命令,查看已被別的程序使用過(guò)的端口,關(guān)于這個(gè)命令的使用,讀者可以運(yùn)行netstat–help獲得幫助。如果我們已經(jīng)運(yùn)行了前面的服務(wù)程序,這時(shí),我們使用netstat–na就能看到該程序所使用的端口正處于狀態(tài),如圖11.9所定,在萬(wàn)一與某些程序時(shí),我們可以調(diào)整程序的端,而不用修改程序。為了避免用戶(hù)每次publicclass{publicstaticvoidmain(String[]{if(args.length<1)ss=new}}

時(shí),用戶(hù)也只需重新指定一次端的問(wèn)題,程序如何實(shí)現(xiàn),對(duì)認(rèn)真學(xué)過(guò)本書(shū)前面所有章節(jié)的讀者原理方面的知識(shí)幾乎就等于零。TCP協(xié)議保證收發(fā)雙方正確地?cái)?shù)據(jù)傳送,但沒(méi)法保證接收方正確理解發(fā)送方的數(shù)據(jù)的意義。就如我們的能保證一個(gè)人能傳遞到一個(gè)法國(guó)人的耳邊,但卻沒(méi)法讓這個(gè)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論