Java語言實現(xiàn)基于消息傳遞的網(wǎng)絡通信_第1頁
Java語言實現(xiàn)基于消息傳遞的網(wǎng)絡通信_第2頁
Java語言實現(xiàn)基于消息傳遞的網(wǎng)絡通信_第3頁
Java語言實現(xiàn)基于消息傳遞的網(wǎng)絡通信_第4頁
Java語言實現(xiàn)基于消息傳遞的網(wǎng)絡通信_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、網(wǎng)絡操作系統(tǒng)課程設計報告課程設計題目 java語言實現(xiàn)基于消息傳遞的網(wǎng)絡通信系統(tǒng)設計姓 名 黃偉 專 業(yè) 09網(wǎng)絡工程 學 號 09539070 成 績 網(wǎng)絡工程系 2011年12 月15日java sock實現(xiàn)基于消息傳遞的網(wǎng)絡通信系統(tǒng)及簡單文件傳輸功能的實現(xiàn)摘要:socket(套接字)是一種基于tcp/ip的編程接口。它采用客戶/服務器通信機制,使客戶端和服務器端通過socket接口在網(wǎng)絡上實現(xiàn)連接和數(shù)據(jù)交換。它提供了一系列系統(tǒng)調用,使用戶可以方便地實現(xiàn)tcp和udp等多種網(wǎng)絡協(xié)議的通信。它使用戶可以在網(wǎng)絡協(xié)議上工作而不必對該網(wǎng)絡協(xié)議有非常深入的了解。這樣編寫的程序可被迅速移植到任何支持s

2、ocket的網(wǎng)絡系統(tǒng)中去。 本程序主要利用java socket來實現(xiàn)雙機通信,實現(xiàn)一個簡單的服務器,客戶端聊天小程序。通過本次實驗加深對javasocket機制及其原理的進一步了解。關鍵詞:套接字、 socketserver類、客戶機/服務器模式 一 理論基礎:1.1 套接字通信 套接字(socket)是網(wǎng)絡通信的基本單元操作,又被稱作端口,通常用來實現(xiàn)客戶方向和服務器的連接。網(wǎng)上的兩個程序通過一個雙向的通信連接實現(xiàn)數(shù)據(jù)的交換,在實現(xiàn)雙向通信前鏈路的每一個端都建立一個socket,通過對socket的讀/寫操作實現(xiàn)網(wǎng)絡通信功能。套接字是網(wǎng)絡通信的一個標準。套接字分為以下三種類型。(1) 流套

3、接字這是最常用的套接字類型,tcp/ip協(xié)議中的tcp協(xié)議用此類接口,它提供面向連接的(建立虛電路),無差錯的、發(fā)送先后順序一致的,包長度不限和非重復的網(wǎng)絡信包傳輸。(2) 數(shù)據(jù)報套接字tcp/ip協(xié)議族中的udp協(xié)議使用此類接口,它是無連接的服務,以獨立的信包進行網(wǎng)絡傳輸,信包最大長度為32kb,傳輸不保證順序性、可靠性和無重復性,它通常用于單個報文傳輸或可靠性不重要的場合。(3) 原始數(shù)據(jù)包套接字提供對網(wǎng)絡下層通信協(xié)議的直接訪問,它一般不是提供給普通用戶的,主要用于開發(fā)新的協(xié)議或者用于協(xié)議教隱蔽的功能。 所有socket通信程序的基本結構都是一樣的,主要有創(chuàng)建socket、打開連接到soc

4、ket的輸入流和輸出流、按照一定的協(xié)議對socket進行讀寫操作。關閉socket這四個步驟,通過這四個步驟可以完成一般的socket通信。1.2 java sockets編程簡介:用java語言編程實現(xiàn)socket通信,其原理與使用其他語言基本相同,不同之處是:(1)java是跨平臺的編程語言,所以用java編寫的socket通信程序可以工作在所有支持tcp/ip協(xié)議和java的軟硬件平臺上;(2)因為java是面向對象的語言,所以在編程中需要使用一些與socket有關的系統(tǒng)類,其中用于實現(xiàn)流socket的類主要有:inetaddress類,socke類。inetaddress類的對象用來保

5、存ip地址,socket類的對象用來創(chuàng)建socket通信的客戶端,socket通信的服務器端則有serversocket類的對象來實現(xiàn),用上述幾個類就可以很方便的生成用戶自己的tcp/ip通信程序。這幾個類都屬于j包,大部分用來處理網(wǎng)絡操作的系統(tǒng)類都包含在這個包中,所以用java編寫程序是,一般要在程序開始部分用import語句加載這個包,以便引入這些類。用java語言編寫socket程序的過程就是創(chuàng)建和定義socket類和serversocket類的子類的過程, 包中提供了豐富的類用于tcp和udp編程 ,其中socket和serversocket類主要用與tcp連接,其中datagramp

6、acket和datagramsocket類主要用于udp編程。 1.3 java 有關概1.3.1 java中輸入/輸出流概念過濾流datainputstream 和dataoutputstream 除了分別作為filterinputstream 和filteroutputstream的子類外,還分別實現(xiàn)了接口 datainput 和dataoutput。接口datainput 中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長度的字節(jié)數(shù),如readboolean()readint()、readline()、readfully()等。接口dataoutput中定義的方法

7、主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長度的字節(jié)數(shù)組,如writechar()、writedouble() datainputstream可以從所連接的輸入流中讀取與機器無關的基本數(shù)據(jù)類型用以實現(xiàn)一種獨立于具體平臺的輸datainputstream 可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。1.3.2 java語言介紹java語言的優(yōu)點主要表現(xiàn)在:簡單、面向對象、多線程、分布性、體系結構中立、安全性等方面。(1) 簡單性 java與c+語言非常相近,但java比c+簡單,它拋棄了c+中的一些不是絕對必要的功能,如頭文件、預處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。 java

8、實現(xiàn)了自動的垃圾收集,簡化了內存管理的工作這使程序設計更加簡便,同時減少了出錯的可能。 (2) 面向對象java提供了簡單的類機制和動態(tài)的構架模型。對象中封裝了它的狀態(tài)變量和方法,很好地實現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現(xiàn)了代碼的復用,又提供了一種動態(tài)的解決方案。java是一種完全面向對象的程序設計語言,它除了數(shù)組、布爾和字符三個基本數(shù)據(jù)類型外的其它類都是對象,它不再支持全局變量。在java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,java程序在運行時必須先創(chuàng)建一個類的實例,然后才能提交運行。java同樣支持繼

9、承特性,java的類可以從其它類中繼承行為,但java只支持類的單重繼承,即每個類只能從一個類中繼承。java支持界面,界面允許程序員定義方法但又不立即實現(xiàn),一個類可以實現(xiàn)多個界面,利用界面可以得到多重繼承的許多優(yōu)點而又沒有多重繼承的問題。(3) 多線程 多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現(xiàn)網(wǎng)絡上的實時交互操作。 java程序可以有多個執(zhí)行線程,如可以讓一個線程進行復雜的計算,而讓另一個線程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統(tǒng)進行交互。多線程保證了較高

10、的執(zhí)行效率。(4) 分布性java是面向網(wǎng)絡的語言。通過它提供的類庫可以處理tcp/ip協(xié)議,用戶可以通過url地址在網(wǎng)絡上很方便的訪問其他對象。(5) 體系結構中立 java是一種網(wǎng)絡語言,為使java程序能在網(wǎng)絡的任何地方運行,java解釋器生成與體系結構無關的字節(jié)碼結構的文件格式。java為了做到結構中立,除生成機器無關的字節(jié)碼外,還制定了完全統(tǒng)一的語言文本,如java的基本數(shù)據(jù)類型不會隨目標機的變化而變化,一個整型總是32位,一個長整型總是64位。為了使java的應用程序能不依賴于具體的系統(tǒng),java語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,當程序使用這些包時,可以確保它能

11、運行在各種支持java的平臺上。java.lang: 一般的語言包。其中包括用于字符串處理、多線程、異常處理和數(shù)字函數(shù)等的類,該包是實現(xiàn)java程序運行平臺的基本包。 java.util: 實用工具包。其中包括哈希表、堆棧、時間和日期等 。java.io: 基于流模型的輸入/輸出包。該包用統(tǒng)一的流模型實現(xiàn)了各種格式的輸入/輸出,包括文件系統(tǒng)、網(wǎng)絡和設備的輸入/輸出等 。: 網(wǎng)絡包。該包支持tcp/ip協(xié)議,其中提供了socket、url和www的編程接口。java.awt: 抽象窗口工具集。其中實現(xiàn)了可以跨平臺的圖形用戶界面組件,包括窗口、菜單、滾動條和對話框等 ,java.applet: 支

12、持applet程序設計的基本包.(6) 安全性 用于網(wǎng)絡、分布環(huán)境下的java必須要防止病毒的入侵,java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現(xiàn),這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。1.3.3 與socket有關的java類: 1.inetaddress類: 用來保存因特網(wǎng)上的ip地址的類,它含有很多成員變量和方法,其中比較常用的有getlocalhost,getbyname和getallbyname,利用它們都可以創(chuàng)建該類的對象,獲得一個java程序操縱、處理的ip地址。例如下面的程序段可以根據(jù)主機名獲取其ip地址 t

13、ryinetaddress remoteip=inetaddress.getbyname(“”); catch(unknownhostexception e) system.out.println(“獲取主機ip錯誤!”);2.socket類: 用來實現(xiàn)tcp/ip通信的端口套接字類,所有希望通過socket來完成與遠程主機進行tcp/ip連接和通信的程序,都必須創(chuàng)建一個socket類的對象。這個類對象的作用首先是根據(jù)遠程主機的ip地址和端口號在本地主機創(chuàng)建一個與遠程主機的聯(lián)接;其次,在連接建立后,本地主機程序就可以使用這個類對象提供的輸入/輸出通道與遠程主機實現(xiàn)通信當一個socket被創(chuàng)建時

14、,它所指定的連接也將同時被建立并打開,若連接成功,調用這個socket對象的有關方法就可以實現(xiàn)與遠程主機的讀寫通信操作. 當一個socket被創(chuàng)建時,它所指定的連接也將同時建立并打開,若連接成功,調用這個socket對象的有關方法就可以實現(xiàn)與遠程主機的讀寫通信操作;若連接失敗,則構造函數(shù)會拋出異常,表示沒有成功創(chuàng)建對象。socket對象的方法getinputstream()和getoutputstream()用來實現(xiàn)程序通過socket對遠程的方的讀寫。調用getinputstream()方法返回一個抽象的getinputstream()對象??梢詮倪h程主機讀取二進制數(shù)據(jù),調用getoutpu

15、tstream()方法可以返回一個抽象的getoutputstream()對象,實現(xiàn)遠程方的寫入操作。由getinputstream()和getoutputstream()都只是對二進制的原始數(shù)據(jù)讀寫。而不能實現(xiàn)對復雜的數(shù)據(jù)結構直接操作,所以在實際應用中一般要先對getinputstream()和getoutputstream()方法返回輸入輸出流加工變換后在使用.當socket通信結束后,可以調用close()方法來關閉連接,此外調用getloaclport()和getinetaddress()可以得知socket連接服務器的有關服務器端口號和ip地址等有關信息。3 serversocket

16、類 它是java用來實現(xiàn)tcp/ip通信服務器端的主要機制,當一個serversocket對象被創(chuàng)建時,程序在本機的指定端口處提供服務并開始監(jiān)聽可能來自客戶端的服務請求。當一個客戶請求連接并被接受時,服務器程序創(chuàng)建一個socket對象與遠程的客戶機相連實現(xiàn)通信操作。 該類的accept()方法用來等待并接受客戶端的連接,當這個方法被調用時,并與之成功連接,這時方法返回一個新創(chuàng)建的服務器端的socket對象,這個對象已經(jīng)和遠程主機連接成功。并可以和客戶機的socket實現(xiàn)讀寫操作。若服務器可以同時提供的連接數(shù)超過一個則服務器程序應該創(chuàng)建一個新的進程來完成和客戶端的通信,而保留原有監(jiān)聽線程接著準備

17、接受其他客戶機的請求。當serversocket對象要結束它在特定的端口上提供的服務,可調用close()方法實現(xiàn)。二客戶機服務器通信的實現(xiàn):21 開發(fā)環(huán)境 netbeans 2.2 服務器端程序的實現(xiàn):import java.awt.*;import java.awt.event.*;import .*;import java.io.*;import java.util.*;public class myserver extends frame textarea area = new textarea(); serversocket server = null; socket client

18、= null; datainputstream in = null; dataoutputstream out = null; private boolean status = false; textfield path=null; java.util.list<clientlister> clienlist = new arraylist<clientlister>(); public static void main(string args) new myserver().lanchframe(); public void lanchframe() this.set

19、location(300, 300); /this.setsize(400, 400); this.add(area, borderlayout.center); this.settitle("server"); this.pack(); this.setvisible(true); panel p1 = new panel(); /p1.setsize(300, 100); p1.setlayout(new borderlayout(); label lab1 = new label("path"); button button = new butto

20、n("send!"); path = new textfield(); p1.add(lab1, borderlayout.west); p1.add(path, borderlayout.center); p1.add(button, borderlayout.east); p1.setvisible(true); button.addactionlistener(new mybuttonliser(); this.pack(); this.add(p1, borderlayout.south); start(); this.addwindowlistener( new

21、windowadapter() public void windowclosing(windowevent e) /disconnect(); system.exit(0); ); public void disconnect() try server.close(); in.close(); out.close(); client.close(); catch (ioexception e) e.printstacktrace(); public void start() try server = new serversocket(8888); catch (bindexception e)

22、 system.out.println("此程序已經(jīng)運行,端口已經(jīng)被占用!請重新運行!"); system.exit(0); catch (ioexception e) e.printstacktrace(); try status = true; while (status) client = server.accept(); / in=new datainputstream(client.getinputstream(); area.append("a client from ip: " + client.getinetaddress() + &qu

23、ot; port: " + client.getlocalport() + " connectedn"); / status=true; clientlister c = new clientlister(client); new thread(c).start(); clienlist.add(c); catch (ioexception e) e.printstacktrace(); private class clientlister implements runnable /用于接受客戶端傳送數(shù)據(jù) private socket s = null; priv

24、ate datainputstream in = null; private dataoutputstream out = null; public clientlister(socket s) this.s = s; try in = new datainputstream(s.getinputstream(); out = new dataoutputstream(s.getoutputstream(); status = true; catch (ioexception e) e.printstacktrace(); public void send(string s) try out.

25、writeutf(s); catch (ioexception e) e.printstacktrace(); public void run() try while (status) string s = in.readutf(); area.append(s + "n"); for (int i = 0; i < clienlist.size(); i+) clientlister c = clienlist.get(i); c.send(s); catch (eofexception e) area.append("one client close!&

26、quot; + "n"); catch (ioexception e) e.printstacktrace(); finally try s.close(); in.close(); out.close(); catch (ioexception e) e.printstacktrace(); private class mybuttonliser implements actionlistener public void actionperformed(actionevent e)/文件傳輸模塊 area.append("server begin listen

27、port 5555 to send file!"+"n"+ "server now is listinging.!"+"n"); string str=path.gettext(); file file=new file(str); try fileinputstream fos = new fileinputstream(file); serversocket paths=new serversocket(5555); socket client=paths.accept(); outputstream netout=cl

28、ient.getoutputstream(); outputstream doc = new dataoutputstream(new bufferedoutputstream(netout); byte buf = new byte2048; int num = fos.read(buf); while (num != (-1) doc.write(buf, 0, num); doc.flush(); num = fos.read(buf); area.append("file send complete!"); catch(filenotfoundexception f

29、err) area.append("file not found!n"); / system.exit(0); catch(bindexception port_err) area.append("文件傳輸端口5555已被占用,請關閉后在運行!"); system.exit(0); catch (ioexception ef) ef.printstacktrace(); 2.3 客戶端程序的實現(xiàn) import java.awt.*;import java.awt.event.*;import .*;import java.io.*;public clas

30、s client extends frame textarea area=new textarea(); textfield tline=new textfield(); socket client=null; dataoutputstream out=null; datainputstream in=null; private boolean status=false;public static void main(string args) new client().lanchframe();public void lanchframe() setlocation(300,400); /se

31、tsize(300,300); this.settitle("client"); this.add(area,borderlayout.north); this.setvisible(true); panel panel=new panel(); panel.setlayout(new borderlayout(); panel.add(tline,borderlayout.center); button button=new button("recive"); button.addactionlistener(new mybuttonliser();

32、panel.add(button,borderlayout.east); panel.setvisible(true); this.add(panel,borderlayout.south); /this this.pack(); this.addwindowlistener( new windowadapter() public void windowclosing(windowevent e) disconnect(); system.exit(0); ); tline.addactionlistener(new mylister(); connect(); new thread(new

33、reciveinfo().start();public void connect() try client=new socket("",8888); out=new dataoutputstream(client.getoutputstream(); in=new datainputstream(client.getinputstream(); status=true; catch(ioexception e) e.printstacktrace(); public void disconnect() try out.close(); catch(ioex

34、ception e) e.printstacktrace(); private class mylister implements actionlistener public void actionperformed(actionevent e) string s=tline.gettext(); area.append(s+"n"); tline.settext(""); try out.writeutf(s); catch(ioexception e2) e2.printstacktrace(); private class reciveinfo i

35、mplements runnable public void run() while(status) try string s=in.readutf(); area.append(s+"n"); catch(socketexception e) system.out.println("客戶端退出!"); system.exit(0); catch (ioexception e) e.printstacktrace(); private class mybuttonliser implements actionlistener/文件接受類 public v

36、oid actionperformed(actionevent e) area.append("client start to get file."+"n"); file file = new file("d:"+file.separator+"backup.txt"); / area.append("ok1"); try file.createnewfile(); randomaccessfile raf = new randomaccessfile(file, "rw")

37、; / area.append("ok2"); socket server = new socket(inetaddress.getlocalhost(),5555); inputstream netin = server.getinputstream(); inputstream iner = new datainputstream(new bufferedinputstream(netin); /area.append("ok4"); byte buf = new byte2048; int num = iner.read(buf); / area.append("ok3"); while (num != (-1) raf.write(buf, 0, num); raf.skipbytes(num);

溫馨提示

  • 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

提交評論