java教程socket網絡編程ppt課件_第1頁
java教程socket網絡編程ppt課件_第2頁
java教程socket網絡編程ppt課件_第3頁
java教程socket網絡編程ppt課件_第4頁
java教程socket網絡編程ppt課件_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第9章,Socket網絡編程,Sunny Liu weiliu_,本課教學內容,客戶/服務器模型 協(xié)議 Socket Socket概況 IP地址和端口 創(chuàng)建Socket 輸入包 創(chuàng)建服務器應用程序 用于服務器的類和方法,本課教學內容,創(chuàng)建服務器 監(jiān)聽客戶請求 啟動服務器 創(chuàng)建網絡客戶機所需的類和方法 創(chuàng)建Socket類的對象 從套接字讀和寫入套接字 關閉連接,問題陳述,應用場景 需要在Java中開發(fā)一個服務器應用程序,其功能說明如下: 服務器應該能從客戶機的Frame窗口接收用戶登錄信息。 服務器應該能夠將用戶信息返回給客戶。 服務器應支持多線程,同時應該能為任何數量的客戶機提供服務。 服務器

2、運行在端口#1432上,客戶/服務器模型,簡介 客戶/服務器模型是一種內部數據處理和存儲與數據顯示相分離的應用程序開發(fā)結構。 客戶請求服務器而服務器完成這些請求。這些請求通過網絡傳到服務器。 由于服務器所作的處理對客戶是隱藏的。一個服務器可以服務多臺客戶機,客戶/服務器模型,通信原理 客戶機與服務器之間使用的大部分通信組件都是基于Socket接口來實現(xiàn)的 Socket是兩個程序之間進行雙向數據傳輸的網絡通信端點,由一個IP地址和一個端口號來標識 每個服務器程序在提供服務時都要在一個端口進行,而想使用該服務的客戶機也必須連接到該端口,客戶/服務器模型,客戶機/服務器工作模式,協(xié)議,定義 數據以包

3、的形式從一臺機器傳到另一臺機器。規(guī)則負責把打包數據放進包里,傳送速度以及重建數據回到其原來形式。這些規(guī)則稱為網絡協(xié)議,協(xié)議,TCP 協(xié)議和UDP 協(xié)議 TCP是Tranfer Control Protocol的簡稱,是一種面向連接的保證可靠傳輸的協(xié)議。通過TCP協(xié)議傳輸,得到的是一個順序的無差錯的數據流。 UDP是User Datagram Protocol的簡稱,是一種無連接的協(xié)議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址,它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不能被保證的,Socket,Socket概況 Socket是

4、基類,支持TCP協(xié)議。 Socket類提供流I/O方法,使從Socket讀出和寫進方便。 Server Socket是由因特網服務器程序用于響應客戶請求的類。Server Socket實際上并不完成服務,而是為客戶創(chuàng)建Socket對象。通信在創(chuàng)建的對象之間進行,Socket,Socket類和ServerSocket類的構造方法: Socket(InetAddress address, int port); Socket(InetAddress address, int port, boolean stream); Socket(String host, int prot); Socket(St

5、ring host, int prot, boolean stream); Socket(SocketImpl impl) Socket(String host, int port, InetAddress localAddr, int localPort) Socket(InetAddress address, int port, InetAddress localAddr, int localPort) ServerSocket(int port); ServerSocket(int port, int backlog); ServerSocket(int port, int backlo

6、g, InetAddress bindAddr,Socket,IP地址和端口 TCP協(xié)議需要兩個數據項:IP地址和端口號。 每個協(xié)議都有缺省的端口號,如果端口號未指定,就使用它,Socket,創(chuàng)建Socket 下面是一個典型的創(chuàng)建客戶端Socket的代碼,try Socket socket=new Socket(127.0.0.1,1432); /127.0.0.1是TCP/IP協(xié)議中默認的本機地址 catch(IOException e) System.out.println(Error:+e);,Socket,輸入包 使用import語句,為網絡輸入必要的包。例如: import .*;

7、import java.io.,創(chuàng)建服務器應用程序,用于服務器的類和方法 要創(chuàng)建服務器,你需要創(chuàng)建ServerSocket對象監(jiān)聽客戶請求的特定端口。 當它認出有效請求,服務器Socket獲得客戶創(chuàng)建的Socket對象。用這Socket產生位于服務器和客戶機之間的通信,創(chuàng)建服務器應用程序,ServerSocket類 ServerSocket類的構造函數帶兩個參數 :第一個是端口號碼 ;第二個參數表示可連接的最大數。 ServerSocket類提供如下方法: 監(jiān)聽連接 返回地址和本機端口 返回表示Socket的串,創(chuàng)建服務器應用程序,創(chuàng)建服務器 構造函數的代碼給出如下,try server =

8、new ServerSocket(1432); /創(chuàng)建一個ServerSocket在端口1432監(jiān)聽客戶請求 catch (Exception e) System.out.println(can not listen to: + e); /出錯,打印出錯信息 System.out.println(Server started); this.start(); /啟動線程,創(chuàng)建服務器應用程序,監(jiān)聽客戶請求 ServerSocket對象通過accept()方法來監(jiān)聽客戶的請求,如果接收到客戶的請求,則產生一個Socket對象,并繼續(xù)執(zhí)行后面的代碼;如果沒有接收到客戶請求,則產生一個錯誤信息,創(chuàng)建服務

9、器應用程序,代碼,Socket socket = null; try socket = server.accept(); /使用accept()阻塞等待客戶請求,有客戶 /請求到來則產生一個Socket對象,并繼續(xù)執(zhí)行 catch (Exception e) System.out.println(can not listen to: + e); /出錯,打印出錯信息,創(chuàng)建服務器應用程序,服務器的輸入和輸出流 服務器端用到了以下的輸入和輸出流: BufferedReader對象用來表示從客戶端輸入到服務器的流 PrintWriter對象表示服務器端輸出到客戶端的流 BufferedReader對

10、象表示從系統(tǒng)標準輸入設備輸入到服務器端的流,創(chuàng)建服務器應用程序,代碼如下,BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream(); /由Socket對象得到輸入流,并構造相應的BufferedReader對象 PrintWriter os = new PrintWriter(socket.getOutputStream(); /由Socket對象得到輸出流,并構造PrintWriter對象 BufferedReader sin = new BufferedReader(new In

11、putStreamReader(System.in); /由系統(tǒng)標準輸入設備構造BufferedReader對象 new Server();,創(chuàng)建服務器應用程序,完整的服務器程序 服務器程序創(chuàng)建了一個BufferedReader對象(is)和一個PrintStream對象(os)。is使用getInputStream()方法檢索客戶端的輸入;os使用getOutputStream()方法使得服務器可以把輸出寫到客戶端。這樣一來,就開始了雙向通信。 當客戶連接到服務器時,服務器在標準輸出上打印從客戶端讀入的字符串,然后由BufferedReader對象sin的readline()方法從標準輸入讀

12、入一字符串,并發(fā)送到客戶端程序。當有一方輸入”bye”時,通信結束,創(chuàng)建服務器應用程序,到了結束的時候,服務器中斷循環(huán)。關閉客戶套接字。關閉套接字很重要,如果讓連接開著,很快就將耗盡服務器的內存,創(chuàng)建服務器應用程序,ObjectInputStream類 ObjectInputStream類中包含從持久的存儲介質中讀出類的對象的功能。持久的存儲介質可以是磁盤或套接字。 這由ObjectInputStream類的readObject()方法來完成。readObject()方法的語法如下: FileInputStream fp=new FileInputStream(“data.txt”); Obj

13、ectInputStream istream = new ObjectInputStream(fp); Date date = (Date)istream.readObject(,實例分析,解題思路 步驟1:選擇創(chuàng)建網絡服務器應用程序所需的類和方法。 步驟2:確定用戶定義的類,它們的目的,方法。 步驟3:確定用戶定義的類中的數據類型和變量。 步驟4:確定服務器的IP地址和端口號。 步驟5:確定查詢參數。 步驟6:確定要處理的異常。 步驟7:確定異常的出錯信息,任務求解,步驟1:選擇創(chuàng)建網絡服務器應用程序所需的類和方法 創(chuàng)建服務器應用程序需要用到:ServerSocket類的accept()方法

14、;Thread類的start()和run()方法;Socket類的getInputStream()方法;以及ObjectInputStream類的readObject()方法,任務求解,步驟2:確定用戶定義的類,它們的目的,方法 用戶定義了FrameServer類,用于監(jiān)聽客戶請求,包含run()方法;定義了Connection類,用于從客戶端檢索數據,包含Connection(),run()方法;定義了User類,用于保留登錄信息,任務求解,步驟3:確定用戶定義的類中的數據類型和變量 用戶在FrameServer類中定義了serverSocket一個變量 在Connection類中定義了ne

15、tClient, fromClient, toClient三個變量 在User類中定義了name, passwords兩個變量,任務求解,步驟4:確定服務器的IP地址和端口號 服務器的IP地址是:127.0.0.1,端口是1432。 步驟5:確定提交的參數 提交的參數是: name, passwords,任務求解,步驟6:確定要處理的異常 NotSerializableException異常 當一個對象需要實現(xiàn)Serializable接口時,發(fā)生NotSerializableException異常。 IOException異常 IONotSerializableException異常意味著發(fā)生

16、了某類輸入/輸出異常。所以當調用readObject()方法時,分別處理IOException異常,NotSerializableException異常。當創(chuàng)建Thread對象,調用accept()方法以及調用getInputStream()方法時,處理Exception異常,任務求解,步驟7:確定異常的出錯信息 NotSerializableException異常的出錯信息是:”讀取對象出錯”后跟異常對象。 IOException(for thread) 異常的出錯信息是:” 不能打開服務器?!焙蟾惓ο?。 IOException(for accept() 異常的出錯信息是:” 沒有監(jiān)聽”

17、后跟異常對象。 IOException(for getInputStream()異常的出錯信息是:” 不能建立雙向流管道”后跟異常對象,任務求解,編寫服務器程序,問題陳述,應用場景 需要修改UserFrame,使其連接到現(xiàn)有的網絡服務器應用程序上,并發(fā)送用戶信息。用戶登錄的代碼模板如下所示,import java.awt.*; import javax.swing.*; public class UserFrame extends JFrame JPanel panel; JLabel labelName; JLabel labelPass; JTextField texName; JPass

18、wordField textPass; JButton butLogin,butCancel; GridLayout gl,問題陳述,public UserFrame() gl=new GridLayout(2,3); panel=new JPanel(); getContentPane().add(panel); panel.setLayout(gl); labelName=new JLabel(用戶名); labelPass=new JLabel(密碼); texName=new JTextField(20); textPass=new JPasswordField(20); butLog

19、in=new JButton(登錄); butCancel=new JButton(取消); panel.add(labelName); panel.add(texName); panel.add(butLogin); panel.add(labelPass); panel.add(textPass,問題陳述,panel.add(butCancel); public static void main(String args) UserFrame= new UserFrame();,所需的類和方法,創(chuàng)建Socket類對象 創(chuàng)建一個套接字客戶機的第一步是創(chuàng)建Socket對象。Socket類的構造函

20、數帶兩個參數IP地址和服務器監(jiān)聽的端口號。例如: Socket socket=new Socket(127.0.0.1,1432,所需的類和方法,從套接字讀和寫入套接字 從套接字讀和寫類似于從文件中讀和寫。說明兩個對象,分別是PrintStream類和BufferedReader類。這些對象將用于從Socket讀和寫。 PrintStream out = null; /寫入套接字 BufferedReader in = null; /從套接字讀,所需的類和方法,從套接字讀和寫入套接字 連接PrintStream和BufferedReader對象至socket。例如: PrintStream o

21、ut = new PrintWriter(socket.getOutputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(); Socket類的getInputStream()和getOutputStream()方法使客戶能和服務器通信。 getInputStream()方法用于從Socket讀 getOutputStream()方法用于寫進Socket,所需的類和方法,從套接字讀和寫入套接字 為了和標準輸入相聯(lián)系,需要說明另一個BufferedReader

22、類的對象,以致輸入客戶的數據能被傳送至服務器,BufferedReader sin = new BufferedReader(new InputStreamReader(System.in); String readline; readline = sin.readLine(); /從系統(tǒng)標準輸入讀入一字符串 while (!readline.equals(bye),所需的類和方法,關閉連接 下列語句關閉流以及和服務器的連接: os.close(); /關閉Socket輸出流 is.close(); /關閉Socket輸入流 socket.close(); /關閉Socket,所需的類和方法,

23、程序示例 下列程序實現(xiàn)簡單的連接到服務器的Socket客戶機,套接字客戶機接收用戶輸入的字符串并允許雙向通信。為終止連接,用戶必須輸入bye,所需的類和方法,程序代碼,import java.io.*; import .*; public class TalkClient public static void main(String args) try Socket socket = new Socket(127.0.0.1, 1001); /向本機的1001端口發(fā)出客戶請求 BufferedReader sin = new BufferedReader(new InputStreamRead

24、er(System.in); /由系統(tǒng)標準輸入設備構造BufferedReader對象 PrintWriter os = new PrintWriter(socket.getOutputStream(); /由Socket對象得到輸出流,并構造PrintWriter對象 BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream(); /由Socket對象得到輸入流,并構造相應的BufferedReader對象,所需的類和方法,String readline; readline = sin

25、.readLine(); /從系統(tǒng)標準輸入讀入一字符串 while (!readline.equals(bye) /若從標準輸入讀入的字符串為 bye則停止循環(huán) os.println(readline); /將從系統(tǒng)標準輸入讀入的字符串輸出到Server os.flush(); /刷新輸出流,使Server馬上收到該字符串 System.out.println(Client: + readline); /在系統(tǒng)標準輸出上打印讀入的字符串 System.out.println(Server: + is.readLine(); /從Server讀入一字符串,并打印到標準輸出上 readline =

26、 sin.readLine(); /從系統(tǒng)標準輸入讀入一字符串 /繼續(xù)循環(huán) os.close(); /關閉Socket輸出流 is.close(); /關閉Socket輸入流 socket.close(); /關閉Socket,所需的類和方法,catch (Exception e) System.out.println(Error + e); /出錯,則打印出錯信息,所需的類和方法,ObjectOutputStream類 ObjectOutputStream類具有將類的對象寫入持久存儲介質的功能 . 持久的存儲介質可以是磁盤或套接字。這由ObjectOutputStream類的writeObj

27、ect()方法完成 . writeObject()方法的語法如下: FileOutputStream fp = new FileOutputStream(“data.txt”); ObjectOutputStream ostream = new ObjectOutputStream(fp); Date date = new Date(); Ostream.writeObject(Date)date,實例分析,任務單,實例分析,實例分析,步驟1:選擇創(chuàng)建網絡客戶機所需的類和方法。 創(chuàng)建網絡客戶機,用到了Socket類的getOutputStream()方法和ObjectOutputStream類的writeObject()方法。 步驟2:確定用戶定義的類,它們的目的,方法 用戶定義了User類,來保留申請人的信息;定義了UserFrame類,實例分析,步驟3:確定用戶定義類中的數據類型和變量 用戶在程序中定義了如下數據變量: class User

溫馨提示

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

評論

0/150

提交評論