JAVA-網絡編程_第1頁
JAVA-網絡編程_第2頁
JAVA-網絡編程_第3頁
JAVA-網絡編程_第4頁
JAVA-網絡編程_第5頁
已閱讀5頁,還剩94頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、Java程序設計程序設計第第1414章章 網絡編程網絡編程Java程序設計程序設計本章主要內容:本章主要內容: HTTPHTTP概述概述 URLURL URLConnection URLConnection讀寫讀寫 InetAddres類類 SocketSocket 數據報數據報 Java程序設計程序設計1.1.統一資源定位器統一資源定位器URLURL URL- URL- Uniform Resource Locator,表示表示InternetInternet上某一資源的地址。上某一資源的地址。 瀏覽器通過解析給定的瀏覽器通過解析給定的URLURL可以在網絡上查找可以在網絡上查找相應的文件或

2、其他資源。相應的文件或其他資源。 Java程序設計程序設計u2 2URLURL的組成的組成u protocol:/:port_number/file_nameprotocol:/:port_number/file_name u其中:其中:u協議名(協議名(protocolprotocol): :指明獲取資源所使用的傳輸協議,指明獲取資源所使用的傳輸協議, 如如httphttp、ftpftp、gophergopher、filefile等。等。u Host_nameHost_name:資源名(:資源名(resourceNameresourceName)所在的主機。)所在的主機。 Port_nubm

3、erPort_nubmer:連接時所使用的通信端口號:連接時所使用的通信端口號u File_nameFile_name:該資源在主機的完整文件名。:該資源在主機的完整文件名。 Java程序設計程序設計例例1:http:/ - -協議名協議名:/:/主機名端口號文件名主機名端口號文件名文件文件Java程序設計程序設計u3基于基于TCP/IP編程的兩個協議編程的兩個協議u目前在Internet上使用最為廣泛的協議是TCP/IP協議 1)TCPu 是一種面向連接的保證可靠傳輸的協議。通過是一種面向連接的保證可靠傳輸的協議。通過TCP協議傳輸,得到的是一個順序的無差錯的數據流。協議傳輸,得到的是一個順

4、序的無差錯的數據流。u 發送方和接收方在進行數據傳輸前必須進行連接發送方和接收方在進行數據傳輸前必須進行連接(成對的兩個(成對的兩個socket之間必須建立連接)。之間必須建立連接)。Java程序設計程序設計u2)UDPuUDP是是User Datagram Protocol的簡稱,是一種無連的簡稱,是一種無連接的協議,每個數據報都是一個獨立的信息,包括完整接的協議,每個數據報都是一個獨立的信息,包括完整的源地址或目的地址。的源地址或目的地址。u 它在網絡上以任何可能的路徑傳往目的地,因此能否到它在網絡上以任何可能的路徑傳往目的地,因此能否到達目的地,到達目的地的時間以及內容的正確性都是不達目

5、的地,到達目的地的時間以及內容的正確性都是不能被保證的。能被保證的。 Java程序設計程序設計u在在JavaJava語言中,可以使用三種方式實現網絡編語言中,可以使用三種方式實現網絡編程:程: (1 1)URLURL編程(獲取編程(獲取URLURL屬性信息)屬性信息) (2 2)SocketSocket編程(基于編程(基于TCP TCP 的的C/SC/S) (3)Datagram(3)Datagram編程(編程(UDPUDP)Java程序設計程序設計包 -URL類 -URLconnection類 -Socket類 -ServerSocket類 -DatagramPacket類 -Datagra

6、mSocket類 -MulticastSocket類TCPTCP實現實現網絡通信網絡通信UDP實現實現網絡通信網絡通信Java程序設計程序設計14.2 URL本節主要內容:本節主要內容:URLURL構造方法構造方法URLURL類的其他方法類的其他方法URLURL相關的異常相關的異常從從URLURL讀取讀取WWWWWW網絡數據網絡數據 Java程序設計程序設計1 1)public URL (String spec);public URL (String spec); 使用使用URLURL對象的字符串對象的字符串specspec來構造一個來構造一個URLURL對象。對象。例例1 1: URL ur

7、l=new URL(httpURL url=new URL(http:/www. :/www. ) ) 14.2.1 URL14.2.1 URL構造方法構造方法Java程序設計程序設計2) public URL(URL baseurl, String spec); 通過基地址通過基地址URL和表示相對路徑的字符串構和表示相對路徑的字符串構造一個造一個URL對象。對象。例例2:URL net263=new URL (http:/ URL index263=new URL(net263, index.html) 基地址基地址Java程序設計程序設計3)public URL(String proto

8、col, String host, String file); 通過協議名、主機名和文件名構造一個通過協議名、主機名和文件名構造一個URL對象。對象。例例3:URL u1=new URL(http, , /pages/G. html); Java程序設計程序設計4)public URL(String protocol,String host, int port, String file); 通過協議名、主機名、端口號和文件名構造一個通過協議名、主機名、端口號和文件名構造一個URL對象。對象。例例4:URL g1=new URL(http, “, 80, “07/1208/16/3v2007j.

9、html);Java程序設計程序設計14.2.2 URL14.2.2 URL類的其他方法類的其他方法獲取獲取URL對象屬性的方法對象屬性的方法: public String getProtocol(): 獲取該獲取該URL的協議名的協議名 public String getHost() : 獲取該獲取該URL的主機名的主機名 public String getPort() : 獲取該獲取該URL的端口號的端口號 public String getPath() : 獲取該獲取該URL的文件路徑的文件路徑Java程序設計程序設計 public String getFile() : 獲取該獲取該UR

10、L的文件名的文件名 public String getRef() : 獲取該獲取該URL在文件中的相對位置在文件中的相對位置 public String getQuery() : 獲取該獲取該URL的查詢名的查詢名也可使用下列方法將也可使用下列方法將URLURL對象的內容以字符串對象的內容以字符串的形式來表示:的形式來表示: String toStringString toString();(); String toExternalForm String toExternalForm();();Java程序設計程序設計14.2.3 14.2.3 與與URLURL相關的異常相關的異常 URL U

11、RL類的每個構造方法在類的每個構造方法在URLURL地址殘缺或無法解地址殘缺或無法解釋時,都將拋出釋時,都將拋出MalformedURLExceptionMalformedURLException異常異常。 一一般將相關語句放入般將相關語句放入trycatchtrycatch語句塊中。格式如語句塊中。格式如下:下: try URL myURL= new URL()catch (MalformedURLException e)/exception handler code here Java程序設計程序設計URLURL編程步驟:編程步驟: 1 1)導入)導入包;包; 2 2)創建)創建URLUR

12、L對象(對象(URLURL構造方法)構造方法) 3 3)獲取)獲取URLURL對象屬性對象屬性 或利用或利用URLURL對象讀入數據對象讀入數據Java程序設計程序設計 例例5: URL url1,url2,url3; try url1 = new URL(“file:/D:/image/example.gif”); url2 = new URL(“http:/ url3 = new URL(url2, “test.gif”);catch(MalformedURLException e) DisplayErrorMessage(); .Java程序設計程序設計例例6 6:獲取:獲取URLURL

13、對象屬性對象屬性try /創建創建URL對象對象URL ur1=new URL(http:/ /輸出輸出URL對象的有關信息對象的有關信息System.out.println(URL對象字符串:對象字符串:+ur1.toString();System.out.println(URL對象文件:對象文件:+ur1.getFile();Java程序設計程序設計System.out.println(URL對象地址:對象地址:+ur1.getHost();System.out.println(URL對象端口:對象端口:+ur1.getPort();System.out.println(URL對象協議:對

14、象協議:+ur1.getProtocol();catch(MalformedURLException e)System.out.println(錯誤的錯誤的URL對象。對象。);Java程序設計程序設計geturl.javageturl.java 圖圖14.1 14.1 獲取獲取URLURL對象屬性的運行結果對象屬性的運行結果Java程序設計程序設計14.2.4 14.2.4 從從URLURL讀取讀取WWWWWW網絡數據網絡數據 URL URL類定義了類定義了openStreamopenStream()()方法用以讀取方法用以讀取URLURL地址的數據,其定義為地址的數據,其定義為: :pub

15、lic final InputStream openStreampublic final InputStream openStream() () thorws IOException thorws IOException ;URLJava 程序程序InputStreamJava程序設計程序設計例例7:從:從URL中讀取數據中讀取數據 URL google = new URL(“http:/); BufferedReader in = new BufferedReader(new InputStreamReader(google.openStream(); String inputLine; w

16、hile(inputLine=in.readLine() != null) System.out.println(inputLine); in.close(); .Java程序設計程序設計圖圖14.2 14.2 從從URLURL中讀取數據的運行結果中讀取數據的運行結果URLReader.javaURLReader.javaJava程序設計程序設計14.3 14.3 基于基于URLConnectionURLConnection的讀寫的讀寫1.URLConnection1.URLConnection類類 URLURL的方法的方法openStreamopenStream() ()只能從網絡上只能從網

17、絡上讀取數據,而不能寫。讀取數據,而不能寫。 URLConnectionURLConnection是封裝訪問遠程網絡資是封裝訪問遠程網絡資源一般方法類,通過它可以建立與遠程服務源一般方法類,通過它可以建立與遠程服務器的連接,檢查遠程資源的一些屬性。器的連接,檢查遠程資源的一些屬性。 Java程序設計程序設計uURL類中的方法類中的方法openConnection()可以對可以對URL指向的網絡指向的網絡資源進行讀寫。資源進行讀寫。upublic URLConnetion openConnection();u作用:嘗試連接作用:嘗試連接URL指向的網絡資源,然后返回封裝了操作指向的網絡資源,然后

18、返回封裝了操作該連接的類該連接的類.URLConnection的一個實例。的一個實例。 Java程序設計程序設計例例8: try /先創建一個先創建一個URL對象對象url1 URL url1=new URL(http:/); /創建到創建到url1的一個連接對象的一個連接對象con URLConnection con=url1.openConnection(); catch(MalformedURLException) catch(IOException) Java程序設計程序設計2URLConnetion類中的常用方法類中的常用方法 u public InputStream getInpu

19、tStream();u public OutputStream getOutputStrem();u public URl getURL(); Java程序設計程序設計3. URLConnection讀讀/寫編程步驟寫編程步驟 1)創建一個)創建一個URL對象對象u1; 2)使用)使用URLConnection類中的類中的openConnection()方法方法創建到創建到URL的一個連接對象的一個連接對象: URLConnection u1.openConnection()成功,返回一個成功,返回一個URLConnection對象對象不成功,拋出不成功,拋出IOException異常異常 3

20、)進行數據的讀或寫操作)進行數據的讀或寫操作; 4)關閉流關閉流Java程序設計程序設計u4從URLConnection讀URL資源4URLConnectionURLConnection類的讀寫渠道類的讀寫渠道 getInputStreamgetInputStream()()Java程序設計程序設計例例9:采用:采用URLConection 從從URL讀取數據讀取數據 String inputLine; System.out.println(gl.getContentLength(); System.out.println(gl.getDate(); System.out.println(gl

21、.getLastModified(); System.out.println(gl.getURL(); System.out.println(gl.toString();Java程序設計程序設計URL google = new URL(http:/localhost:8080/examples/jsp/datatreat.jsp); BufferedReader in = new BufferedReader(new InputStreamReader(google.openStream(); String inputLine; while (inputLine = in.readLine()

22、 != null) System.out.println(inputLine);in.close();Java程序設計程序設計圖圖12.3 12.3 從從URLConectionURLConection讀取數據的運行結果讀取數據的運行結果URLConnectionReader.javaURLConnectionReader.javaJava程序設計程序設計CGICGI程序程序POSTPOST信息信息有動態特性的有動態特性的HTMLHTML網頁網頁標準輸入標準輸入標準輸出標準輸出4.4.對對RLConnectionRLConnection寫寫setDoOutput(true), getOutpu

23、tStream( ) 什么情況下有必要向什么情況下有必要向URLURL寫信息呢?寫信息呢? - -表單(表單(Form)Form)與與CGICGI有交互的網頁有交互的網頁 - -使用使用POSTPOST方式向方式向CGICGI傳送信息傳送信息 Java程序設計程序設計例例10:向一個:向一個RLConnection寫寫 URL url = new URL(http:/);URLConnection connection = url.openConnection(); connection.setDoOutput(true); PrintWriter out = new PrintWriter

24、( connection.getOutputStream(); out.println(string); out.close(); Java程序設計程序設計14.4 InetAddres14.4 InetAddres類類u類.InetAddress表示一個 Internet Protocol (IP) 地址。 u 應用程序必須使用方法 getLocalHost, getByName, 或 getAllByName 來創建新的 InetAddress 實例。 u例11: InetAddress ia = new InetAddress (); Java程序設計程序設計u其他方法其他方法 1) p

25、ublic byte getAddress() 返回這個返回這個 InetAddress 對象的原始對象的原始 IP 地址。地址。 2) public static InetAddress getAllByName(String) throws UnknownHostException 給定主機名,確定該主機的所有給定主機名,確定該主機的所有 IP 地址。地址。 3) public static InetAddress getByName(String host) throws UnknownHostException 給定主機名,確定該主機的所有給定主機名,確定該主機的所有 IP 地址。地址

26、。 4) public String getHostAddress() 返回返回IP 地址串地址串 %d.%d.%d.%dJava程序設計程序設計 5) public String getHostName() 返回此地址的全限定主機名。返回此地址的全限定主機名。 6) public static InetAddress getLocalHost() 返回本地主機。返回本地主機。 7) public String toString() 把此把此IP 地址轉換為地址轉換為 String 類型。類型。 上述上述1)-4)方法均要拋出方法均要拋出UnknownHostException 異常。異常。J

27、ava程序設計程序設計例例12: InetAddress 獲取獲取 IP地址地址import .*; public class getip public static void main(String args) throws UnknownHostException InetAddress ad=InetAddress.getByName(localhost);System.out.println(主機名:主機名:+ad.getHostName();System.out.println(主機地址:主機地址: +ad.getHostAddress();System.out.println(ad

28、.getCanonicalHostName();System.out.println(本地地址:本地地址: +ad.getAddress();System.out.println(本地主機名:本地主機名: +ad.getLocalHost(); Java程序設計程序設計u圖14.4 InetAddress類獲取IP地址 Java程序設計程序設計14.5 socket14.5 socketnSocketSocket是網絡程序中最常用的方式,用是網絡程序中最常用的方式,用于建立兩個不同程序之間通過網絡進行通于建立兩個不同程序之間通過網絡進行通信的信道。信的信道。nJavaJava語言提供了兩種語言

29、提供了兩種SocketSocket通信方式:通信方式:nTCP SocketTCP SocketnUDP SocketUDP SocketJava程序設計程序設計網絡服務網絡服務Mailftpfinger20telnet數據結構數據結構I/O緩沖區緩沖區端口端口2123客戶程序客戶程序SocketIP,port套接字是套接字是IP與端口的組與端口的組合合,可以分辨在可以分辨在internet上運行的程序上運行的程序Java程序設計程序設計14.4.1 socket14.4.1 socket通信一般過程通信一般過程 SocketSocket通常用來實現客戶通常用來實現客戶/ /服務器程序服務器程

30、序。為了讓客戶機知道如何與相應的服務進程建為了讓客戶機知道如何與相應的服務進程建立通信聯系,一般系統為一些常用的服務類立通信聯系,一般系統為一些常用的服務類型分配了默認端口號:型分配了默認端口號: 表表1 1 常用服務端口號常用服務端口號 服務類型服務類型 端口號端口號 EchoEcho FTPFTP TELNETTELNET SMTPSMTP FingerFinger HTTPHTTP POP3POP3 7 7 2121 2323 2525 7979 8080 110110 Java程序設計程序設計 Socket Socket進行進行C/SC/S程序設計的一般連接過程序設計的一般連接過程:程

31、:q ServerServer端監聽某個端口是否有連接請求;端監聽某個端口是否有連接請求;qClientClient端向端向ServerServer端發出連接請求;端發出連接請求;qServerServer端向端向ClientClient端發回端發回accpetaccpet消息。消息。 這樣一個連接就建立起來,這樣一個連接就建立起來,ServerServer端和端和ClientClient端都可以通過端都可以通過sendsend、writewrite等方法與等方法與對方通信。對方通信。Java程序設計程序設計ServerServerSocket(port #)Socket socket = S

32、erverSocket.accept()接收連接接收連接OutputStreamInputStreamClose SocketClientSocket(host, port #)與服務器建立連接與服務器建立連接OutputStreamInputStreamClose Socketsocket TCP TCP協議協議 SocketSocket通信通信Java程序設計程序設計u例例13:13:顯示服務器與客戶機間的通信顯示服務器與客戶機間的通信( (服務器端服務器端) )PrintStream ps=null;DataInputStream dis=null;String username;Ser

33、verSocket serverSocket=null;Socket clientSocket=null;try serverSocket=new ServerSocket(1111);catch (IOException e) System.out.println( “Error”+e);System.exit(1);try clientSocket=serverSocket.accept();catch (IOException e) System.out.println(Accept failed.); System.exit(1); 創建服務器創建服務器(端口號端口號)定義數據成員定義

34、數據成員服務器等待服務器等待網絡連接網絡連接Java程序設計程序設計 SocketSocket編程步驟編程步驟 應用應用SocketSocket進行網絡編程,基本結構都是包括進行網絡編程,基本結構都是包括下面下面4 4個步驟:個步驟: :(1 1) 創建創建SocketSocket;(2 2) 打開連接到打開連接到SocketSocket的輸入的輸入/ /出流;出流;(3 3) 按照一定的協議對按照一定的協議對SocketSocket進行讀進行讀/ /寫操寫操作;作;(4 4) 關閉關閉SocketSocket。Java程序設計程序設計14.5.2 .socket14.5.2 .socket

35、java在包在包中提供了中提供了Socket類,表示客戶類,表示客戶端創建對象來建立與服務器的連接。端創建對象來建立與服務器的連接。1.socket構造方法構造方法 Socket(InetAddress address, int port); Socket(String host, int port); Socket(String host, int port, InetAddress localAddr,int localPort); Socket(InetAddress address,int port, InetAddress localaddr,int localPort);Java程

36、序設計程序設計例例14:Socket client = new Socket(127.0.01., 80); Socket cc=new Socket(“”,80);2.讀讀/寫方法寫方法 1)public InputStream getInputStream() throws IOException 功能:從功能:從 Socket 中獲得一個輸入流,用于從中獲得一個輸入流,用于從 Socket 中讀數據,拋出中讀數據,拋出 I/O 異常。異常。 2)public OutputStream getOutputStream() throws IOException 功能:從功能:從 Socket

37、 中獲得一個輸出流,用于從中獲得一個輸出流,用于從 Socket 中寫數據,拋出中寫數據,拋出 I/O 異常。異常。 3)public void close(); 關閉流關閉流Java程序設計程序設計3基于基于TCP協議的的客戶端編程步驟協議的的客戶端編程步驟 1)創建一個指向一個服務器固定端口的)創建一個指向一個服務器固定端口的Socket。 例例15:Socket sock=new Socket(“7”,8000); 2)獲得輸入獲得輸入/輸出流,進行數據的讀輸出流,進行數據的讀/寫操作。寫操作。 例例16:/獲取輸入流獲取輸入流 BufferedReader in

38、 =new BufferedReader(new InputStreamReader(socket.getInputStream(); /獲取輸出流獲取輸出流 PrintWriter out =new PrintWriter(new BufferedWriter(new OutputStreamWriter (socket.getOutputStream(),Java程序設計程序設計 Java 語言為服務器端程序設計提供了 ServerSocket 類。該類允許程序綁定一個端口,等待客戶端程序請求,然后根據客戶端的請求執行相應操作,并對請求作出響應。 14.5.3 .ServerSocket1

39、4.5.3 .ServerSocketJava程序設計程序設計1. ServerSocket的構造方法的構造方法 ServerSocket(int port); ServerSocket(int port, int backlog); ServerSocket(int port, int backlog, InetAddress bindAddr);例例17:ServerSocket server = new ServerSocket(4460); ServerSocket sr = new ServerSocket(4460,10); Java程序設計程序設計2 2監聽方法監聽方法 publ

40、ic Socket accept()public Socket accept();功能:功能: 等待客戶端的連接等待客戶端的連接, ,在等待客戶請求在等待客戶請求的過程中,方法的過程中,方法 accept() accept() 將處于阻塞狀將處于阻塞狀態(即無限循環狀態),直到接收到連態(即無限循環狀態),直到接收到連接請求,返回一個用于連接客戶端接請求,返回一個用于連接客戶端 Socket Socket 的的 Socket Socket 實例。實例。 Java程序設計程序設計例例18:ServerSocket server=null; try server=new ServerSocket(

41、4700); /創建一個創建一個ServerSocket在端口在端口4700監聽客戶請求監聽客戶請求catch(IOException e) System.out.println(can not listen to :+e); Socket socket=null;try socket=server.accept(); /監聽監聽catch(IOException e) System.out.println(Error:+e);Java程序設計程序設計3基于基于Socket編程服務器端編程步驟編程服務器端編程步驟 1)以某端口號為參數調用)以某端口號為參數調用ServerSocket類類的構造

42、方法,創建一個的構造方法,創建一個ServerSocket對象,服務對象,服務器端程序將在這個端口上監聽、等待客戶程序發器端程序將在這個端口上監聽、等待客戶程序發來的請求。如上例。來的請求。如上例。Java程序設計程序設計2服務程序使用服務程序使用ServerSocket對象的方法對象的方法accept(),等,等待接收某客戶端程序發出的連接請求。待接收某客戶端程序發出的連接請求。例例19:Socket soc=server.accept(); 通過通過Socket對象可獲取客戶端的相關信息。對象可獲取客戶端的相關信息。例例20:clientIp=soc.getInetAddress(); 也

43、可以利用也可以利用Socket類提供的方法類提供的方法 getInputStream()和和getOutputStream() 來創建輸入來創建輸入/輸出流。輸出流。例例21: InputStream is=soc.getInputStream(); OutputStream os=soc.getOutputStream();Java程序設計程序設計3輸入輸入/輸出輸出 程序對程序對socket的輸入的輸入/輸出流進行讀輸出流進行讀/寫操作都和對寫操作都和對普通的輸入普通的輸入/輸出流進行讀輸出流進行讀/寫基本一樣。但是需要在寫基本一樣。但是需要在這兩個流對象的基礎上建立易于操作的數據流如這兩

44、個流對象的基礎上建立易于操作的數據流如DataInputStream、DataOutputStream或或PrintStream。例例22:DataInputStream in=new DataInputStream(is);DataOutputStream out=new DataOutputStream(os);PrintStream pout=new PrintStream(os);Java程序設計程序設計另外為了便于輸出字符或漢字,可以使用下列輸出另外為了便于輸出字符或漢字,可以使用下列輸出/輸入輸入流:流: BufferedReader in=new BufferedReader(

45、new InputStreamReader(is);BufferedWriter out=new BufferedWriter( new OutputStremWriter(os);PrintWriter pout=new PrintWriter(new BufferedWriter(new OutputStreamWriter(os),true);Java程序設計程序設計14.5.4 14.5.4 Socket應用應用 例例23:基于連接的:基于連接的Client/Server程序程序1.Client端程序端程序import .*;import java.io.*;public class

46、JabberClient public static void main(String args) throws IOException InetAddress addr = InetAddress.getByName(null); System.out.println(addr = + addr); BufferedReader fin=new BufferedReader(new InputStreamReader(System.in); Socket socket = new Socket(addr, 8080);Java程序設計程序設計 try System.out.println(s

47、ocket = + socket); BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream(); PrintWriter out =new PrintWriter( new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(),true);Java程序設計程序設計while(true) String str =fin.readLine();if (str.equals(exit) out.println(exit

48、);break;else out.println(str); String s=in.readLine();System.out.println(server response:+s); Java程序設計程序設計/關閉連接關閉連接 finally System.out.println(closing.);socket.close(); Java程序設計程序設計2.2.服務器端程序服務器端程序public class JabberServer public static void main(String args) throws IOException ServerSocket s = new

49、ServerSocket(8080);Socket socket;System.out.println(Started: + s);Java程序設計程序設計try socket = s.accept(); try System.out.println(Connection accepted: + socket); BufferedReader in =new BufferedReader( new InputStreamReader(socket.getInputStream(); PrintWriter out =new PrintWriter( new BufferedWriter(new

50、 OutputStreamWriter(socket.getOutputStream(),true);Java程序設計程序設計while (true) String str = in.readLine(); if (str.equals(exit)break; System.out.println(Echoing: + str); out.println(server received +str); finally System.out.println(closing.);socket.close(); finally s.close(); Java程序設計程序設計u圖12-4 客戶/服務器通

51、信Java程序設計程序設計Java程序設計程序設計例例24:24:多線程服務實現多線程服務實現 基本方法:基本方法: 在服務器程序里創建單個在服務器程序里創建單個ServerSocketServerSocket對象,并調對象,并調用用accept()accept()方法來等候一個新連接。一旦調用方法來等候一個新連接。一旦調用accept()accept()方法成功,就會獲得一個方法成功,就會獲得一個socketsocket對象,并用它新建一對象,并用它新建一個線程,令其只為那個特定的客戶服務。然后再調用個線程,令其只為那個特定的客戶服務。然后再調用acceptaccept方法,等候下一個新的連

52、接請求。方法,等候下一個新的連接請求。Java程序設計程序設計多線程服務器程序:多線程服務器程序:import java.io.*;import .*; public class MultiTalkServer /靜態成員變量,記錄當前客戶的個數靜態成員變量,記錄當前客戶的個數 static int clientnum=0; public static void main(String args) throws IOException ServerSocket serverSocket=null; boolean listening=true; try serverSocket=new Ser

53、verSocket(4700); /創建一個創建一個ServerSocket在端口在端口4700監聽客戶請求監聽客戶請求catch(IOException e)Java程序設計程序設計 System.out.println(Could not listen on port:4700.); /出錯,打印出錯信息出錯,打印出錯信息 System.exit(-1); /退出退出 while(listening) /永遠循環監聽永遠循環監聽 new ServerThread(serverSocket.accept(),clientnum).start();/監聽到客戶請求,根據得到的監聽到客戶請求,根

54、據得到的Socket對象和客戶計數創建服務線對象和客戶計數創建服務線程,并啟動之程,并啟動之clientnum+; /增加客戶計數增加客戶計數serverSocket.close(); /關閉關閉ServerSocketJava程序設計程序設計線程程序線程程序:public class ServerThread extends Thread Socket socket=null; /保存與本線程相關的保存與本線程相關的Socket對象對象 int clientnum; /保存本進程的客戶計數保存本進程的客戶計數 public ServerThread(Socket socket,int num

55、) /構造函數構造函數 this.socket=socket; /初始化初始化socket變量變量 clientnum=num+1; /初始化初始化clientnum變量變量 public void run() /線程主體線程主體try String line; BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream();/由由Socket對象得到輸入流,并構造相應的對象得到輸入流,并構造相應的BufferedReader對象對象Java程序設計程序設計 PrintWriter os=ne

56、w PrintWriter(socket.getOutputStream(); /由由Socket對象得到輸出流,并構造對象得到輸出流,并構造PrintWriter對象對象 BufferedReader sin=new BufferedReader(new InputStreamReader(System.in); /由系統標準輸入設備構造由系統標準輸入設備構造BufferedReader對象對象 System.out.println(Client:+ clientnum +is.readLine(); /在標準輸出上打印從客戶端讀入的字符串在標準輸出上打印從客戶端讀入的字符串 line=si

57、n.readLine(); /從標準輸入讀入一字符串從標準輸入讀入一字符串while(!line.equals(bye) /如果該字符串為如果該字符串為 bye,則停止循環,則停止循環 os.println(line); /向客戶端輸出該字符串向客戶端輸出該字符串 os.flush(); /刷新輸出流,使刷新輸出流,使Client馬上收到該字符串馬上收到該字符串Java程序設計程序設計System.out.println(Server:+line); /在系統標準輸出上打印該字符串在系統標準輸出上打印該字符串 System.out.println(Client:+ clientnum +is.

58、readLine(); /從從Client讀入一字符串,并打印到標準輸出上讀入一字符串,并打印到標準輸出上line=sin.readLine(); /從系統標準輸入讀入一字符串從系統標準輸入讀入一字符串 /繼續循環繼續循環os.close(); /關閉關閉Socket輸出流輸出流is.close(); /關閉關閉Socket輸入流輸入流socket.close(); /關閉關閉Socket/server.close(); /關閉關閉ServerSocketcatch(Exception e)System.out.println(Error:+e); /出錯,打印出錯信息出錯,打印出錯信息Jav

59、a程序設計程序設計2.客戶端程序客戶端程序 try Socket socket=new Socket(,4700); BufferedReader sin=new BufferedReader(new InputStreamReader(System.in); PrintWriter os=new PrintWriter(socket.getOutputStream(); BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream(); String readline;rea

60、dline=sin.readLine(); /從系統標準輸入讀入一字符串從系統標準輸入讀入一字符串Java程序設計程序設計while(!readline.equals(bye) os.println(readline); os.flush(); System.out.println(Client:+readline); System.out.println(Server:+is.readLine(); readline=sin.readLine(); os.close(); /關閉關閉Socket輸出流輸出流is.close(); /關閉關閉Socket輸入流輸入流socket.close()

溫馨提示

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

評論

0/150

提交評論