熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

使用 Java 編寫 B/S 網絡通信程序

2013-11-23 19:20:15  來源: Java核心技術 

  
  網絡上的系統結構多為客戶/服務器模式服務器端負責數據和圖像等的存儲維護管理以及傳遞客戶端則負責人機界面的操作送出需求及顯示收回的數據
  
  下面介紹一下如何使用JAVA來進行網絡編程
  
  ) 由於客戶端通過IE同服務器建立聯系所以客戶端使用Applet服務器端使用Application
  
  ) 服務器應設置成多線程應答多個客戶的請求
  
  ) 兩端通信使用SOCKET機制
  
  Java中輸入/輸出流概念
  
  過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外還分別實現了接口DataInput 和DataOutput接口DataInput 中定義的方法主要包括從流中讀取基本類型的數據讀取一行數據或者讀取指定長度的字節數如readBoolean() readInt()readLine()readFully()等接口DataOutput中定義的方法主要是向流中寫入基本類型的數據或者寫入一定長度的字節數組如writeChar()writeDouble() DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數據用以實現一種獨立於具體平台的輸入方式DataInputStream 可以向所連接的輸出流寫入基本類型的數據
  
  Socket 機制
  

  Socket是面向客戶/服務器模型設計的網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換這個雙向鏈路的一端稱為一個Socket Socket通常用來實現客戶方和服務方的連接客戶程序可以向Socket寫請求服務器將處理此請求然後通過Socket將結果返回給用戶
  
  Socket通信機制提供了兩種通訊方式有聯接和無聯接方式分別面向不同的應用需求使用有聯接方式時通信鏈路提供了可靠的全雙工的字節流服務在該方式下通信雙方必須創建一個聯接過程並建立一條通訊鏈路以後的網絡通信操作完全在這一對進程之間進行通信完畢關閉此聯接過程使用無聯接方式時其系統開銷比無聯接方式小但通信鏈路提供了不可靠的數據報服務不能保證信源所傳輸的數據一定能夠到達信宿在該方式下通信雙方不必創建一個聯接過程和建立一條通訊鏈路網絡通信操作在不同的主機和進程之間轉發進行
  
  Java語言簡介
  Java語言的優點主要表現在簡單面向對象多線程分布性體系結構中立安全性等方面
  
  () 簡單性
  
  Java與C++語言非常相近但Java比C++簡單它拋棄了C++中的一些不是絕對必要的功能如頭文件預處理文件指針結構運算符重載多重繼承以及自動強迫同型Java實現了自動的垃圾收集簡化了內存管理的工作這使程序設計更加簡便同時減少了出錯的可能
  
  () 面向對象
  
  Java提供了簡單的類機制和動態的構架模型對象中封裝了它的狀態變量和方法很好地實現了模塊化和信息隱藏而類則提供了一類對象的原型通過繼承和重載機制子類可以使用或重新定義父類或超類所提供的方法從而既實現了代碼的復用又提供了一種動態的解決方案
  
  Java是一種完全面向對象的程序設計語言它除了數組布爾和字符三個基本數據類型外的其它類都是對象它不再支持全局變量在Java中如果不創建新類就無法創建程序Java程序在運行時必須先創建一個類的實例然後才能提交運行
  
  Java同樣支持繼承特性Java的類可以從其它類中繼承行為但Java只支持類的單重繼承即每個類只能從一個類中繼承
  
  Java支持界面界面允許程序員定義方法但又不立即實現一個類可以實現多個界面利用界面可以得到多重繼承的許多優點而又沒有多重繼承的問題
  
  () 多線程
  
  多線程使應用程序可以同時進行不同的操作處理不同的事件在多線程機制中不同的線程處理不同的任務他們之間互不干涉不會由於一處等待影響其他部分這樣容易實現網絡上的實時交互操作
  
  Java程序可以有多個執行線程如可以讓一個線程進行復雜的計算而讓另一個線程與用戶進行交互這樣用戶可以在不中斷計算線程的前提下與系統進行交互多線程保證了較高的執行效率
  
  () 分布性
  
  Java是面向網絡的語言通過它提供的類庫可以處理TCP/IP協議用戶可以通過URL地址在網絡上很方便的訪問其他對象
  
  () 體系結構中立
  
  Java是一種網絡語言為使Java程序能在網絡的任何地方運行Java解釋器生成與體系結構無關的字節碼結構的文件格式Java為了做到結構中立除生成機器無關的字節碼外還制定了完全統一的語言文本如Java的基本數據類型不會隨目標機的變化而變化一個整型總是一個長整型總是
  
  為了使Java的應用程序能不依賴於具體的系統Java語言環境還提供了用於訪問底層操作系統功能的類組成的包當程序使用這些包時可以確保它能運行在各種支持Java的平台上
  
  javalang: 一般的語言包其中包括用於字符串處理多線程異常處理和數字函數等的類該包是實現Java程序運行平台的基本包
  
  javautil: 實用工具包其中包括哈希表堆棧時間和日期等
  
  javaio: 基於流模型的輸入/輸出包該包用統一的流模型實現了各種格式的輸入/輸出包括文件系統網絡和設備的輸入/輸出等
  
  : 網絡包該包支持TCP/IP協議其中提供了socketURL和WWW的編程接口
  
  javaawt: 抽象窗口工具集其中實現了可以跨平台的圖形用戶界面組件包括窗口菜單滾動條和對話框等
  
  javaapplet: 支持applet程序設計的基本包
  
  () 安全性
  
  用於網絡分布環境下的Java必須要防止病毒的入侵Java不支持指針一切對內存的訪問都必須通過對象的實例變量來實現這樣就防止了程序員使用欺騙手段訪問對象的私有成員同時也避免了指針操作中容易產生的錯誤
  
  JAVA工具
  () JDK
  
  ) Java編譯器
  
  Java編譯器將Java源代碼文件編譯成可執行的Java字節碼Java源代碼文件的擴展名為 javaJava編譯器把這種擴展名的文件編譯成擴展名為class的文件源文件中的每個類在編譯後都將產生一個class文件這意味一個Java源代碼文件可能編譯生成多個class文件
  
  ) Java解釋器
  
  Java解釋器對編譯生成的字節碼格式的可執行程序的運行提供支持它是運行非圖形Java程序的命令行工具
  
  ) Appletviewer
  
  它是Java Applet的簡單測試工具可使用它來測試Java Applet程序而不需要WWW浏覽器的支持
  
  () Visual J++
  
  Visual J++ 集成了可視化界面設計交互式調試代碼編輯聯機幫助信息和介紹如何快速掌握該開發環境的實用向導等多項功能同時具有能充分利用Active X和COM新技術的優勢利用Visual J++可創建交互性很強的Internet應用程序是難得的Java 開發系統
  客戶機/服務器通信的實現
  
  () Application 同 Applet 的通信
  
  兩端通過Socket機制進行連接
  
  ) 客戶端的編程流程:
  
  i打開Socket新建一個套接字
  
  ii為套接字建立一個輸入和輸出流
  
  iii根據服務器協議從套接字讀入或向套接字寫入
  
  iiii清除套接字和輸入/輸出流
  
  )服務器端的編程流程:
  
  打開Server Socket創建一個服務器型套接字和一個普通套接字服務器型套接字在指定端口為客戶端請求的Socket 服務
  
  i使用ServerSocket類的accept()方法使服務器型套接字處於監聽狀態並把監聽結果返回給普通套接字
  
  ii為該普通套接字創建輸入和輸出流
  
  iii從輸入和輸出流中讀入或寫入字節流進行相應的處理並將結果返回給客戶端
  
  iiii在客戶端和服務器工作結束後關閉所有的對象如服務器型的套接字普通套接字輸入和輸出流
  
  正是由於Java系統具有基於Socket的靈活通信機制因而其應用程序能自由地打開和訪問網絡上的對象就象在本地文件系統中一樣
  
  () Applet之間的通信
  
  Applet之間的通信使用Applet Context類的getApplet()方法
  
  
  
  只要在程序中加入
  Applet oneapplet=getAppletContext()getApplet(first);便可使用name為first的Applet中的方法了
  在該課題中大量使用了該種通信方法因為專門同服務器端通信的 Applet中包含接收信息方法和發送信息方法所有客戶端的Applet都要使用負責通信的Applet中的方法所以客戶端的Applet同負責通信的Applet必須進行通信
  
  程序
  //服務器端程序Sjava 負責與客戶端通信
  import javaio*;
  import *;
  import javalang*;
  import T;
  
  class ThreadEchoHandler extends Thread //創建線程
  {
  T theT=new T();
  
  Socket incoming;
  int counter;
  
  ThreadEchoHandler(Socket iint c)
  {
  incoming=i;
  counter=c;
  }
  
  public void run()
  {
  try
  {
  DataInputStream in=new DataInputStream(incominggetInputStream
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26680.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.