




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第9章,Socket網(wǎng)絡(luò)編程,Sunny Liu weiliu_,本課教學(xué)內(nèi)容,客戶/服務(wù)器模型 協(xié)議 Socket Socket概況 IP地址和端口 創(chuàng)建Socket 輸入包 創(chuàng)建服務(wù)器應(yīng)用程序 用于服務(wù)器的類和方法,本課教學(xué)內(nèi)容,創(chuàng)建服務(wù)器 監(jiān)聽(tīng)客戶請(qǐng)求 啟動(dòng)服務(wù)器 創(chuàng)建網(wǎng)絡(luò)客戶機(jī)所需的類和方法 創(chuàng)建Socket類的對(duì)象 從套接字讀和寫入套接字 關(guān)閉連接,問(wèn)題陳述,應(yīng)用場(chǎng)景 需要在Java中開(kāi)發(fā)一個(gè)服務(wù)器應(yīng)用程序,其功能說(shuō)明如下: 服務(wù)器應(yīng)該能從客戶機(jī)的Frame窗口接收用戶登錄信息。 服務(wù)器應(yīng)該能夠?qū)⒂脩粜畔⒎祷亟o客戶。 服務(wù)器應(yīng)支持多線程,同時(shí)應(yīng)該能為任何數(shù)量的客戶機(jī)提供服務(wù)。 服務(wù)器
2、運(yùn)行在端口#1432上,客戶/服務(wù)器模型,簡(jiǎn)介 客戶/服務(wù)器模型是一種內(nèi)部數(shù)據(jù)處理和存儲(chǔ)與數(shù)據(jù)顯示相分離的應(yīng)用程序開(kāi)發(fā)結(jié)構(gòu)。 客戶請(qǐng)求服務(wù)器而服務(wù)器完成這些請(qǐng)求。這些請(qǐng)求通過(guò)網(wǎng)絡(luò)傳到服務(wù)器。 由于服務(wù)器所作的處理對(duì)客戶是隱藏的。一個(gè)服務(wù)器可以服務(wù)多臺(tái)客戶機(jī),客戶/服務(wù)器模型,通信原理 客戶機(jī)與服務(wù)器之間使用的大部分通信組件都是基于Socket接口來(lái)實(shí)現(xiàn)的 Socket是兩個(gè)程序之間進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通信端點(diǎn),由一個(gè)IP地址和一個(gè)端口號(hào)來(lái)標(biāo)識(shí) 每個(gè)服務(wù)器程序在提供服務(wù)時(shí)都要在一個(gè)端口進(jìn)行,而想使用該服務(wù)的客戶機(jī)也必須連接到該端口,客戶/服務(wù)器模型,客戶機(jī)/服務(wù)器工作模式,協(xié)議,定義 數(shù)據(jù)以包
3、的形式從一臺(tái)機(jī)器傳到另一臺(tái)機(jī)器。規(guī)則負(fù)責(zé)把打包數(shù)據(jù)放進(jìn)包里,傳送速度以及重建數(shù)據(jù)回到其原來(lái)形式。這些規(guī)則稱為網(wǎng)絡(luò)協(xié)議,協(xié)議,TCP 協(xié)議和UDP 協(xié)議 TCP是Tranfer Control Protocol的簡(jiǎn)稱,是一種面向連接的保證可靠傳輸?shù)膮f(xié)議。通過(guò)TCP協(xié)議傳輸,得到的是一個(gè)順序的無(wú)差錯(cuò)的數(shù)據(jù)流。 UDP是User Datagram Protocol的簡(jiǎn)稱,是一種無(wú)連接的協(xié)議,每個(gè)數(shù)據(jù)報(bào)都是一個(gè)獨(dú)立的信息,包括完整的源地址或目的地址,它在網(wǎng)絡(luò)上以任何可能的路徑傳往目的地,因此能否到達(dá)目的地,到達(dá)目的地的時(shí)間以及內(nèi)容的正確性都是不能被保證的,Socket,Socket概況 Socket是
4、基類,支持TCP協(xié)議。 Socket類提供流I/O方法,使從Socket讀出和寫進(jìn)方便。 Server Socket是由因特網(wǎng)服務(wù)器程序用于響應(yīng)客戶請(qǐng)求的類。Server Socket實(shí)際上并不完成服務(wù),而是為客戶創(chuàng)建Socket對(duì)象。通信在創(chuàng)建的對(duì)象之間進(jìn)行,Socket,Socket類和ServerSocket類的構(gòu)造方法: 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é)議需要兩個(gè)數(shù)據(jù)項(xiàng):IP地址和端口號(hào)。 每個(gè)協(xié)議都有缺省的端口號(hào),如果端口號(hào)未指定,就使用它,Socket,創(chuàng)建Socket 下面是一個(gè)典型的創(chuàng)建客戶端Socket的代碼,try Socket socket=new Socket(127.0.0.1,1432); /127.0.0.1是TCP/IP協(xié)議中默認(rèn)的本機(jī)地址 catch(IOException e) System.out.println(Error:+e);,Socket,輸入包 使用import語(yǔ)句,為網(wǎng)絡(luò)輸入必要的包。例如: import .*;
7、import java.io.,創(chuàng)建服務(wù)器應(yīng)用程序,用于服務(wù)器的類和方法 要?jiǎng)?chuàng)建服務(wù)器,你需要?jiǎng)?chuàng)建ServerSocket對(duì)象監(jiān)聽(tīng)客戶請(qǐng)求的特定端口。 當(dāng)它認(rèn)出有效請(qǐng)求,服務(wù)器Socket獲得客戶創(chuàng)建的Socket對(duì)象。用這Socket產(chǎn)生位于服務(wù)器和客戶機(jī)之間的通信,創(chuàng)建服務(wù)器應(yīng)用程序,ServerSocket類 ServerSocket類的構(gòu)造函數(shù)帶兩個(gè)參數(shù) :第一個(gè)是端口號(hào)碼 ;第二個(gè)參數(shù)表示可連接的最大數(shù)。 ServerSocket類提供如下方法: 監(jiān)聽(tīng)連接 返回地址和本機(jī)端口 返回表示Socket的串,創(chuàng)建服務(wù)器應(yīng)用程序,創(chuàng)建服務(wù)器 構(gòu)造函數(shù)的代碼給出如下,try server =
8、new ServerSocket(1432); /創(chuàng)建一個(gè)ServerSocket在端口1432監(jiān)聽(tīng)客戶請(qǐng)求 catch (Exception e) System.out.println(can not listen to: + e); /出錯(cuò),打印出錯(cuò)信息 System.out.println(Server started); this.start(); /啟動(dòng)線程,創(chuàng)建服務(wù)器應(yīng)用程序,監(jiān)聽(tīng)客戶請(qǐng)求 ServerSocket對(duì)象通過(guò)accept()方法來(lái)監(jiān)聽(tīng)客戶的請(qǐng)求,如果接收到客戶的請(qǐng)求,則產(chǎn)生一個(gè)Socket對(duì)象,并繼續(xù)執(zhí)行后面的代碼;如果沒(méi)有接收到客戶請(qǐng)求,則產(chǎn)生一個(gè)錯(cuò)誤信息,創(chuàng)建服務(wù)
9、器應(yīng)用程序,代碼,Socket socket = null; try socket = server.accept(); /使用accept()阻塞等待客戶請(qǐng)求,有客戶 /請(qǐng)求到來(lái)則產(chǎn)生一個(gè)Socket對(duì)象,并繼續(xù)執(zhí)行 catch (Exception e) System.out.println(can not listen to: + e); /出錯(cuò),打印出錯(cuò)信息,創(chuàng)建服務(wù)器應(yīng)用程序,服務(wù)器的輸入和輸出流 服務(wù)器端用到了以下的輸入和輸出流: BufferedReader對(duì)象用來(lái)表示從客戶端輸入到服務(wù)器的流 PrintWriter對(duì)象表示服務(wù)器端輸出到客戶端的流 BufferedReader對(duì)
10、象表示從系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備輸入到服務(wù)器端的流,創(chuàng)建服務(wù)器應(yīng)用程序,代碼如下,BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream(); /由Socket對(duì)象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對(duì)象 PrintWriter os = new PrintWriter(socket.getOutputStream(); /由Socket對(duì)象得到輸出流,并構(gòu)造PrintWriter對(duì)象 BufferedReader sin = new BufferedReader(new In
11、putStreamReader(System.in); /由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對(duì)象 new Server();,創(chuàng)建服務(wù)器應(yīng)用程序,完整的服務(wù)器程序 服務(wù)器程序創(chuàng)建了一個(gè)BufferedReader對(duì)象(is)和一個(gè)PrintStream對(duì)象(os)。is使用getInputStream()方法檢索客戶端的輸入;os使用getOutputStream()方法使得服務(wù)器可以把輸出寫到客戶端。這樣一來(lái),就開(kāi)始了雙向通信。 當(dāng)客戶連接到服務(wù)器時(shí),服務(wù)器在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串,然后由BufferedReader對(duì)象sin的readline()方法從標(biāo)準(zhǔn)輸入讀
12、入一字符串,并發(fā)送到客戶端程序。當(dāng)有一方輸入”bye”時(shí),通信結(jié)束,創(chuàng)建服務(wù)器應(yīng)用程序,到了結(jié)束的時(shí)候,服務(wù)器中斷循環(huán)。關(guān)閉客戶套接字。關(guān)閉套接字很重要,如果讓連接開(kāi)著,很快就將耗盡服務(wù)器的內(nèi)存,創(chuàng)建服務(wù)器應(yīng)用程序,ObjectInputStream類 ObjectInputStream類中包含從持久的存儲(chǔ)介質(zhì)中讀出類的對(duì)象的功能。持久的存儲(chǔ)介質(zhì)可以是磁盤或套接字。 這由ObjectInputStream類的readObject()方法來(lái)完成。readObject()方法的語(yǔ)法如下: FileInputStream fp=new FileInputStream(“data.txt”); Obj
13、ectInputStream istream = new ObjectInputStream(fp); Date date = (Date)istream.readObject(,實(shí)例分析,解題思路 步驟1:選擇創(chuàng)建網(wǎng)絡(luò)服務(wù)器應(yīng)用程序所需的類和方法。 步驟2:確定用戶定義的類,它們的目的,方法。 步驟3:確定用戶定義的類中的數(shù)據(jù)類型和變量。 步驟4:確定服務(wù)器的IP地址和端口號(hào)。 步驟5:確定查詢參數(shù)。 步驟6:確定要處理的異常。 步驟7:確定異常的出錯(cuò)信息,任務(wù)求解,步驟1:選擇創(chuàng)建網(wǎng)絡(luò)服務(wù)器應(yīng)用程序所需的類和方法 創(chuàng)建服務(wù)器應(yīng)用程序需要用到:ServerSocket類的accept()方法
14、;Thread類的start()和run()方法;Socket類的getInputStream()方法;以及ObjectInputStream類的readObject()方法,任務(wù)求解,步驟2:確定用戶定義的類,它們的目的,方法 用戶定義了FrameServer類,用于監(jiān)聽(tīng)客戶請(qǐng)求,包含run()方法;定義了Connection類,用于從客戶端檢索數(shù)據(jù),包含Connection(),run()方法;定義了User類,用于保留登錄信息,任務(wù)求解,步驟3:確定用戶定義的類中的數(shù)據(jù)類型和變量 用戶在FrameServer類中定義了serverSocket一個(gè)變量 在Connection類中定義了ne
15、tClient, fromClient, toClient三個(gè)變量 在User類中定義了name, passwords兩個(gè)變量,任務(wù)求解,步驟4:確定服務(wù)器的IP地址和端口號(hào) 服務(wù)器的IP地址是:127.0.0.1,端口是1432。 步驟5:確定提交的參數(shù) 提交的參數(shù)是: name, passwords,任務(wù)求解,步驟6:確定要處理的異常 NotSerializableException異常 當(dāng)一個(gè)對(duì)象需要實(shí)現(xiàn)Serializable接口時(shí),發(fā)生NotSerializableException異常。 IOException異常 IONotSerializableException異常意味著發(fā)生
16、了某類輸入/輸出異常。所以當(dāng)調(diào)用readObject()方法時(shí),分別處理IOException異常,NotSerializableException異常。當(dāng)創(chuàng)建Thread對(duì)象,調(diào)用accept()方法以及調(diào)用getInputStream()方法時(shí),處理Exception異常,任務(wù)求解,步驟7:確定異常的出錯(cuò)信息 NotSerializableException異常的出錯(cuò)信息是:”讀取對(duì)象出錯(cuò)”后跟異常對(duì)象。 IOException(for thread) 異常的出錯(cuò)信息是:” 不能打開(kāi)服務(wù)器?!焙蟾惓?duì)象。 IOException(for accept() 異常的出錯(cuò)信息是:” 沒(méi)有監(jiān)聽(tīng)”
17、后跟異常對(duì)象。 IOException(for getInputStream()異常的出錯(cuò)信息是:” 不能建立雙向流管道”后跟異常對(duì)象,任務(wù)求解,編寫服務(wù)器程序,問(wèn)題陳述,應(yīng)用場(chǎng)景 需要修改UserFrame,使其連接到現(xiàn)有的網(wǎng)絡(luò)服務(wù)器應(yīng)用程序上,并發(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,問(wèn)題陳述,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,問(wèn)題陳述,panel.add(butCancel); public static void main(String args) UserFrame= new UserFrame();,所需的類和方法,創(chuàng)建Socket類對(duì)象 創(chuàng)建一個(gè)套接字客戶機(jī)的第一步是創(chuàng)建Socket對(duì)象。Socket類的構(gòu)造函
20、數(shù)帶兩個(gè)參數(shù)IP地址和服務(wù)器監(jiān)聽(tīng)的端口號(hào)。例如: Socket socket=new Socket(127.0.0.1,1432,所需的類和方法,從套接字讀和寫入套接字 從套接字讀和寫類似于從文件中讀和寫。說(shuō)明兩個(gè)對(duì)象,分別是PrintStream類和BufferedReader類。這些對(duì)象將用于從Socket讀和寫。 PrintStream out = null; /寫入套接字 BufferedReader in = null; /從套接字讀,所需的類和方法,從套接字讀和寫入套接字 連接PrintStream和BufferedReader對(duì)象至socket。例如: PrintStream o
21、ut = new PrintWriter(socket.getOutputStream(); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(); Socket類的getInputStream()和getOutputStream()方法使客戶能和服務(wù)器通信。 getInputStream()方法用于從Socket讀 getOutputStream()方法用于寫進(jìn)Socket,所需的類和方法,從套接字讀和寫入套接字 為了和標(biāo)準(zhǔn)輸入相聯(lián)系,需要說(shuō)明另一個(gè)BufferedReader
22、類的對(duì)象,以致輸入客戶的數(shù)據(jù)能被傳送至服務(wù)器,BufferedReader sin = new BufferedReader(new InputStreamReader(System.in); String readline; readline = sin.readLine(); /從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串 while (!readline.equals(bye),所需的類和方法,關(guān)閉連接 下列語(yǔ)句關(guān)閉流以及和服務(wù)器的連接: os.close(); /關(guān)閉Socket輸出流 is.close(); /關(guān)閉Socket輸入流 socket.close(); /關(guān)閉Socket,所需的類和方法,
23、程序示例 下列程序?qū)崿F(xiàn)簡(jiǎn)單的連接到服務(wù)器的Socket客戶機(jī),套接字客戶機(jī)接收用戶輸入的字符串并允許雙向通信。為終止連接,用戶必須輸入bye,所需的類和方法,程序代碼,import java.io.*; import .*; public class TalkClient public static void main(String args) try Socket socket = new Socket(127.0.0.1, 1001); /向本機(jī)的1001端口發(fā)出客戶請(qǐng)求 BufferedReader sin = new BufferedReader(new InputStreamRead
24、er(System.in); /由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對(duì)象 PrintWriter os = new PrintWriter(socket.getOutputStream(); /由Socket對(duì)象得到輸出流,并構(gòu)造PrintWriter對(duì)象 BufferedReader is = new BufferedReader(new InputStreamReader(socket.getInputStream(); /由Socket對(duì)象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對(duì)象,所需的類和方法,String readline; readline = sin
25、.readLine(); /從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串 while (!readline.equals(bye) /若從標(biāo)準(zhǔn)輸入讀入的字符串為 bye則停止循環(huán) os.println(readline); /將從系統(tǒng)標(biāo)準(zhǔn)輸入讀入的字符串輸出到Server os.flush(); /刷新輸出流,使Server馬上收到該字符串 System.out.println(Client: + readline); /在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串 System.out.println(Server: + is.readLine(); /從Server讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上 readline =
26、 sin.readLine(); /從系統(tǒng)標(biāo)準(zhǔn)輸入讀入一字符串 /繼續(xù)循環(huán) os.close(); /關(guān)閉Socket輸出流 is.close(); /關(guān)閉Socket輸入流 socket.close(); /關(guān)閉Socket,所需的類和方法,catch (Exception e) System.out.println(Error + e); /出錯(cuò),則打印出錯(cuò)信息,所需的類和方法,ObjectOutputStream類 ObjectOutputStream類具有將類的對(duì)象寫入持久存儲(chǔ)介質(zhì)的功能 . 持久的存儲(chǔ)介質(zhì)可以是磁盤或套接字。這由ObjectOutputStream類的writeObj
27、ect()方法完成 . writeObject()方法的語(yǔ)法如下: FileOutputStream fp = new FileOutputStream(“data.txt”); ObjectOutputStream ostream = new ObjectOutputStream(fp); Date date = new Date(); Ostream.writeObject(Date)date,實(shí)例分析,任務(wù)單,實(shí)例分析,實(shí)例分析,步驟1:選擇創(chuàng)建網(wǎng)絡(luò)客戶機(jī)所需的類和方法。 創(chuàng)建網(wǎng)絡(luò)客戶機(jī),用到了Socket類的getOutputStream()方法和ObjectOutputStream類的writeObject()方法。 步驟2:確定用戶定義的類,它們的目的,方法 用戶定義了User類,來(lái)保留申請(qǐng)人的信息;定義了UserFrame類,實(shí)例分析,步驟3:確定用戶定義類中的數(shù)據(jù)類型和變量 用戶在程序中定義了如下數(shù)據(jù)變量: class User
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- GA/T 2183-2024法庭科學(xué)足跡檢驗(yàn)實(shí)驗(yàn)室建設(shè)規(guī)范
- 訂購(gòu)合同協(xié)議書模板范本
- 貿(mào)易簽約協(xié)議書模板
- 賽事服務(wù)協(xié)議書范本
- 購(gòu)買手工亮片合同協(xié)議
- 訂書協(xié)議書范本
- 費(fèi)用變更合同補(bǔ)充協(xié)議
- 設(shè)計(jì)公司月結(jié)合同協(xié)議
- 購(gòu)買品牌貨車合同協(xié)議
- 財(cái)務(wù)勞動(dòng)保密合同協(xié)議
- 2025衡水市武強(qiáng)縣輔警考試試卷真題
- 山西省太原市2025年高三年級(jí)模擬考試(二)語(yǔ)文試題及答案
- 湖北省武漢市2025屆高中畢業(yè)生二月調(diào)研考試數(shù)學(xué)試題及答案
- 2025年高三語(yǔ)作文模擬題分析+材料+范文:關(guān)心人本身應(yīng)成為一切技術(shù)上奮斗的主要目標(biāo)
- 2025中考二輪專題復(fù)習(xí):古詩(shī)文主題默寫匯編(2)(含答案)
- 長(zhǎng)城汽車2025人才測(cè)評(píng)答案
- 河道的管理和防護(hù)課件
- 綠化作業(yè)安全教育培訓(xùn)
- GB/T 45282-2025IPv6地址分配和編碼規(guī)則總體要求
- 二便失禁病人的護(hù)理措施
- 浙江省金華義烏市稠州中學(xué)2024-2025學(xué)年九年級(jí)下學(xué)期3月獨(dú)立作業(yè)英語(yǔ)試卷(原卷版+解析版)
評(píng)論
0/150
提交評(píng)論