當前位置:學問君>學習教育>畢業論文>

計算機網絡畢業論文-使用JAVA編寫網絡通信程序

學問君 人氣:9.36K
計算機網絡畢業論文-使用JAVA編寫網絡通信程序
摘要 本文闡述了使用JAVA編程語言對基於客戶/服務器模式的編寫通信程序,討論了SOCKET機制、輸入輸出流以及程序實碼。關鍵詞 JAVA,網絡,SOCKET,APPLET 網絡上的系統結構多爲客戶/服務器模式,服務器端負責數據和圖像等的存儲、維護、管理以及傳遞,客戶端則負責人機介面的操作、送出需求及顯示收回的數據。
     下面介紹一下如何使用JAVA來進行網絡編程:
1)      由於客戶端透過IE同服務器建立聯繫,所以客戶端使用Applet,服務器端使用Application;
2)      服務器應設定成多線程,應答多個客戶的請求;
3)      兩端通信使用SOCKET機制。
 1  Java中輸入/輸出流概念:
過濾流DataInputStream 和DataOutputStream 除了分別作爲FilterInputStream 和FilterOutputStream的子類外,還分別實現了接口DataInput 和DataOutput。接口DataInput 中定義的主要包括從流中讀取基本類型的數據、讀取一行數據、或者讀取指定長度的字節數,如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數據或者寫入一定長度的字節數組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數據,用以實現一種獨立於具體平臺的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數據。
 2  Socket 機制
   Socket是面向客戶/服務器模型設計的,網絡上的兩個程序透過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱爲一個Socket。 Socket通常用來實現客戶方和服務方的連接。客戶程序可以向Socket寫請求,服務器將處理此請求,然後透過Socket將結果返回給用戶。
Socket通信機制提供了兩種通訊方式:有聯接和無聯接方式,分別面向不同的應用需求。使用有聯接方式時,通信鏈路提供了可靠的,全雙工的字節流服務。在該方式下,通信雙方必須創建一個聯接過程並建立一條通訊鏈路,以後的網絡通信操作完全在這一對進程之間進行,通信完畢關閉此聯接過程。使用無聯接方式時其系統開銷比無聯接方式小,但通信鏈路提供了不可靠的數據報服務,不能保證信源所傳輸的數據一定能夠到達信宿。在該方式下,通信雙方不必創建一個聯接過程和建立一條通訊鏈路,網絡通信操作在不同的主機和進程之間轉發進行。
3  Java語言
Java語言的優點主要表現在:簡單、面向對象、多線程、分佈性、體系結構中立、安全性等方面。
(1) 簡單性
Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭檔案、預處理檔案、指針、結構、運算符重載、多重繼承以及自動強迫同型。 Java實現了自動的垃圾收集,簡化了內存管理的工作。這使程序設計更加簡便,同時減少了出錯的可能。
(2) 面向對象
Java提供了簡單的類機制和動態的構架模型。對象中封裝了它的狀態變量和方法,很好地實現了模組化和資訊隱藏;而類則提供了一類對象的原型,透過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現了代碼的複用,又提供了一種動態的解決方案。
Java是一種完全面向對象的程序設計語言,它除了數組、布爾和字元三個基本數據類型外的其它類都是對象,它不再支援全局變量。在Java中,如果不創建新類就無法創建程序,Java程序在執行時必須先創建一個類的實例,然後才能提交執行。
Java同樣支援繼承特性,Java的類可以從其它類中繼承行爲,但Java只支援類的單重繼承,即每個類只能從一個類中繼承。
Java支援介面,介面允許程序員定義方法但又不立即實現,一個類可以實現多個介面,利用介面可以得到多重繼承的許多優點而又沒有多重繼承的。
(3) 多線程
多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由於一處等待其他部分,這樣容易實現網絡上的實時交互操作。
Java程序可以有多個執行線程,如可以讓一個線程進行復雜的,而讓另一個線程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統進行交互。多線程保證了較高的執行效率。 (4) 分佈性
Java是面向網絡的語言。透過它提供的類庫可以處理TCP/IP協議,用戶可以透過URL地址在網絡上很方便的訪問其他對象。
(5) 體系結構中立
Java是一種網絡語言,爲使Java程序能在網絡的任何地方執行,Java解釋器生成與體系結構無關的字節碼結構的檔案格式。Java爲了做到結構中立,除生成機器無關的字節碼外,還制定了完全統一的語言文字,如Java的基本數據類型不會隨目標機的變化而變化,一個整型總是32位,一個長整型總是64位。
爲了使Java的應用程序能不依賴於具體的系統,Java語言環境還提供了用於訪問底層操作系統功能的類組成的包,當程序使用這些包時,可以確保它能執行在各種支援Java的平臺上。
 java.lang: 一般的語言包。其中包括用於字元串處理、多線程、異常處理和數字函數等的類,該包是實現Java程序執行平臺的基本包
java.util: 實用工具包。其中包括哈希表、堆棧、時間和日期等
java.io: 基於流模型的輸入/輸出包。該包用統一的流模型實現了各種格式的輸入/輸出,包括檔案系統、網絡和設備的輸入/輸出等
java.net: 網絡包。該包支援TCP/IP協議,其中提供了socket、URL和WWW的編程接口
java.awt: 抽象視窗工具集。其中實現了可以跨平臺的圖形用戶介面組件,包括視窗、選單、滾動條和對話框等
java.applet: 支援applet程序設計的基本包
(6) 安全性
用於網絡、分佈環境下的Java必須要防止病毒的入侵,Java不支援指針,一切對內存的訪問都必須透過對象的實例變量來實現,這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。
4  JAVA工具
(1) JDK
1)      Java編譯器
Java編譯器將Java原始碼檔案編譯成可執行的Java字節碼。Java原始碼檔案的副檔名爲 .java,Java編譯器把這種副檔名的檔案編譯成副檔名爲.class的檔案。源檔案中的每個類在編譯後都將產生一個class檔案,這意味一個Java原始碼檔案可能編譯生成多個class檔案。
2)      Java解釋器
Java解釋器對編譯生成的字節碼格式的可執行程序的執行提供支援,它是執行非圖形Java程序的命令行工具。
3)      Appletviewer
它是Java Applet的簡單測試工具,可使用它來測試Java Applet程序,而不需要WWW瀏覽器的支援。
(2) Visual J++
Visual J++ 集成了可視化介面設計、交互式調試、代碼編輯、聯機幫助資訊和介紹如何快速掌握該開發環境的實用嚮導等多項功能,同時具有能充分利用Active X和COM新技術的優勢。利用Visual J++可創建交互性很強的Internet應用程序,是難得的Java 開發系統。 5  客戶機/服務器通信的實現:
(1) Application 同 Applet 的通信
兩端透過Socket機制進行連接:
1)      客戶端的編程流程:
      開啟Socket,新建一個套接字;
      爲套接字建立一個輸入和輸出流;
      根據服務器協議從套接字讀入或向套接字寫入;
      清除套接字和輸入/輸出流;
2)服務器端的編程流程:
      開啟Server Socket,創建一個服務器型套接字和一個普通套接字,服務器型套接字在指定端口爲客戶端請求的Socket 服務;
      使用ServerSocket類的accept()方法使服務器型套接字處於監聽狀態並把監聽結果返回給普通套接字;
      爲該普通套接字創建輸入和輸出流;
      從輸入和輸出流中讀入或寫入字節流,進行相應的處理,並將結果返回給客戶端;
      在客戶端和服務器工作結束後關閉所有的對象,如服務器型的套接字,普通套接字,輸入和輸出流。
正是由於Java系統具有基於Socket的.靈活通信機制,因而其應用程序能自由地開啟和訪問網絡上的對象,就象在本地檔案系統中一樣。
(2) Applet之間的通信:
Applet之間的通信使用Applet Context類的getApplet()方法。
<applet  code=applet1.class  width=200  height=200  name=first>
只要在程序中加入 
Applet  oneapplet=getAppletContext().getApplet(“first”);便可使用name爲first的Applet中的方法了。
在該課題中大量使用了該種通信方法,因爲專門同服務器端通信的 Applet中包含接收資訊方法和發送資訊方法,所有客戶端的Applet都要使用負責通信的Applet中的方法,所以客戶端的Applet同負責通信的Applet必須進行通信。

6 程序
//服務器端程序S.java 負責與客戶端通信
import java.io.*;
import java.net.*;
import java.lang.*;
import T2;
class ThreadEchoHandler extends Thread   //創建線程
{
     T2 theT2=new T2();
    
     Socket  incoming;
     int counter;
 
     ThreadEchoHandler(Socket i,int c)
     {  incoming=i;
        counter=c;  }      public void run()
     {
           try
           {
           DataInputStream  in=new DataInputStream(incoming.getInputStream());
             DataOutputStream out=new DataOutputStream(incoming.getOutputStream());
             System.out.println ("hello");     
             boolean done=false;                  while(!done)
                 {   String aa="";
                       String str=in.readUTF();     //從客戶端得到字元串                             
                           //在此加入各自的服務程序
                
                             System.out.println (str);
                    theT2.pass(str);  //解碼
                             theT2.tongji();   //修改監控庫中的資訊                            aa=theT2.guan();   //操縱數據庫
                             System.out.println ("string z is:"+aa);                     if(aa.compareTo("null")!=0 ) 
                                      //若是查詢數據庫,返回查詢後的結果
                             {                   //若不是查詢數據庫,不向客戶端輸出資訊
                               out.writeUTF(aa);
                               out.flush();  }
                 }//while                  incoming.close();    //線程關閉
          
           }//try            catch(IOException e)
           {System.out.println(e);}
     }//end run
} //----------------------------------------
class S

     public static void main(String[] args)
     {     
                 int i=1;
           try
           {
                 ServerSocket s=new ServerSocket(1111);
                 for(;;)
                 {
                       Socket  incoming=s.accept();
                       System.out.println("connect:  "+i);
                       new ThreadEchoHandler(incoming,i).start();
                       i++;
                 }
           }
           catch(Exception e)
           { System.out.println(e); }
     }     
}
//客戶端通信小程序 Echo.java import java.io.*;
import java.net.*;
import java.awt.*;
import java.applet.*; public class Echo extends Applet
{
     TextArea ta;
     Socket echoSocket;
     DataOutputStream  os;
     DataInputStream  is;
     String    Line;      public void init()           
     { 
        setBackground(Color.white);
        ta=new TextArea(5,80);
        ta.setEditable(false);
        add(ta);
        try
            {echoSocket=new Socket("10.102.4.41",1111);}  //與服務器建立連接
        catch(IOException e)
         {System.out.println("error");}
      
     }      public void st(String stri)     //發送字元串的
     {
         try
      {  DataOutputStream os=new  DataOutputStream(echoSocket.getOutputStream());
           DataInputStream is=new DataInputStream(echoSocket.getInputStream());
             os.writeUTF(""+ stri );       //向服務器輸送string
           os.flush();
        }
       catch(IOException e)
       {System.out.println(" error:"+e);  }
     }     
    
     public String  st1()     //接收字元串的方法
     {
      String Line="";
         try
      {  DataOutputStream os=new  DataOutputStream(echoSocket.getOutputStream());
           DataInputStream is=new DataInputStream(echoSocket.getInputStream());
              Line=is.readUTF();        //從服務器讀來的資訊
           ta.appendText(""+Line);         //在文字域中輸出資訊
            }
       catch(IOException e)
       {System.out.println(" error:"+e);  }
       return Line;
     }
} 7  程序調試心得:
1)      在建立Socket連接時,兩端的端口號必須設爲一致,否則建立不了連接。服務器端必須有主機IP位址或主機名參數。
2)      連接建立好之後應確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結果只能傳輸,傳輸中文時產生亂碼,將PrintStream改爲DataOutputStream,使用readUTF()和writeUTF()方法後,中文傳輸得到解決。
3)      如果一個使用某端口的程序沒有關閉,另一個程序就不能使用這個端口。
4)      開始進行通信的程序均爲 Application,因不符合客戶機/服務器機制,應將客戶端的Application改爲Applet。其轉化的主要步驟如下:
      創建一個包含APPLET標籤的HTML檔案;
      去掉應用程序中的main()方法;
      類名應繼承Applet類,而不是Frame類,並在程序開頭加入
    import  java.applet.*;語句;
      用init()方法代替Application程序中的構造方法,當瀏覽器創建Applet類對象的時候,它自動執行init()方法;
      如Application中缺省使用了BorderLayout佈局管理器,應在Applet的init()方法中重新設定;
      如果Application中有setTitle()方法,必須將其去掉,如Application中使用了選單,在Applet 中用按鈕來替換。
5)      懂得了在一程序中如何引用自訂的類中的方法和變量,在程序開頭加入import  類名;在程序中加入    類名  實例=new 類名();  然後使用
  實例.方法(),實例.變量即可。:
[1] 廖雷等,Java程序設計教程,電力出版社,2003
[2]  Warton,Java多線程編程初步,電腦報,2004.4.10
[3] 張立等,基於Client/Server模式的數據庫應用軟件的設計與實現,機應用,1999(4)