六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

JAVA圖文說明教程 第8講 Java網絡編程(二)

[摘要]8.3 基于Socket(套接字)的低層次Java網絡編程   8.3.1 Socket通訊   網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個...
8.3 基于Socket(套接字)的低層次Java網絡編程

  8.3.1 Socket通訊

  網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號唯一確定。

  在傳統的UNIX環境下可以操作TCP/IP協議的接口不止Socket一個,Socket所支持的協議種類也不光TCP/IP一種,因此兩者之間是沒有必然聯系的。在Java環境下,Socket編程主要是指基于TCP/IP協議的網絡編程。

  說Socket編程是低層次網絡編程并不等于它功能不強大,恰恰相反,正因為層次低,Socket編程比基于URL的網絡編程提供了更強大的功能和更靈活的控制,但是卻要更復雜一些。由于Java本身的特殊性,Socket編程在Java中可能已經是層次最低的網絡編程接口,在Java中要直接操作協議中更低的層次,需要使用Java的本地方法調用(JNI),在這里就不予討論了。

  8.3.2 Socket通訊的一般過

  前面已經提到Socket通常用來實現C/S結構。

  使用Socket進行Client/Server程序設計的一般連接過程是這樣的:Server端Listen(監聽)某個端口是否有連接請求,Client端向Server端發出Connect(連接)請求,Server端向Client端發回Accept(接受)消息。一個連接就建立起來了。Server端和Client端都可以通過Send,Write等方法與對方通信。

  對于一個功能齊全的Socket,都要包含以下基本結構,其工作過程包含以下四個基本的步驟:
  (1) 創建Socket;
  (2) 打開連接到Socket的輸入/出流;
  (3) 按照一定的協議對Socket進行讀/寫操作;
  (4) 關閉Socket.

  第三步是程序員用來調用Socket和實現程序功能的關鍵步驟,其他三步在各種程序中基本相同。

  以上4個步驟是針對TCP傳輸而言的,使用UDP進行傳輸時略有不同,在后面會有具體講解。

  8.3.3 創建Socket

  java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務端。這是兩個封裝得非常好的類,使用很方便。其構造方法如下:
  Socket(InetAddress address, int port);
  Socket(InetAddress address, int port, boolean stream);
  Socket(String host, int prot);
  Socket(String 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 backlog, InetAddress bindAddr)

  其中address、host和port分別是雙向連接中另一方的IP地址、主機名和端口號,stream指明socket是流socket還是數據報socket,localPort表示本地主機的端口號,localAddr和bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創建serverSocket又可以用來創建Socket。count則表示服務端所能支持的最大連接數。例如:
  Socket client = new Socket("127.0.01.", 80);
  ServerSocket server = new ServerSocket(80);

  注意,在選擇端口時,必須小心。每一個端口提供一種特定的服務,只有給出正確的端口,才能獲得相應的服務。0~1023的端口號為系統所保留,例如http服務的端口號為80,telnet服務的端口號為21,ftp服務的端口號為23, 所以我們在選擇端口號時,最好選擇一個大于1023的數以防止發生沖突。

  在創建socket時如果發生錯誤,將產生IOException,在程序中必須對之作出處理。所以在創建Socket或ServerSocket是必須捕獲或拋出例外。

  8.3.4 客戶端的Socket

  下面是一個典型的創建客戶端Socket的過程。
   try{
     Socket socket=new Socket("127.0.0.1",4700);
     //127.0.0.1是TCP/IP協議中默認的本機地址
   }catch(IOException e){
     System.out.println("Error:"+e);
   }

  這是最簡單的在客戶端創建一個Socket的一個小程序段,也是使用Socket進行網絡通訊的第一步,程序相當簡單,在這里不作過多解釋了。在后面的程序中會用到該小程序段。


  8.3.5 服務器端的ServerSocket

  下面是一個典型的創建Server端ServerSocket的過程。
  ServerSocket server=null;
  try {
     server=new ServerSocket(4700);
     //創建一個ServerSocket在端口4700監聽客戶請求
  }catch(IOException e){
     System.out.println("can not listen to :"+e);
  }
  Socket socket=null;
  try {
    socket=server.accept();
    //accept()是一個阻塞的方法,一旦有客戶請求,它就會返回一個Socket對象用于同客戶進行交互
  }catch(IOException e){
    System.out.println("Error:"+e);
  }

  以上的程序是Server的典型工作模式,只不過在這里Server只能接收一個請求,接受完后Server就退出了。實際的應用中總是讓它不停的循環接收,一旦有客戶請求,Server總是會創建一個服務線程來服務新來的客戶,而自己繼續監聽。程序中accept()是一個阻塞函數,所謂阻塞性方法就是說該方法被調用后,將等待客戶的請求,直到有一個客戶啟動并請求連接到相同的端口,然后accept()返回一個對應于客戶的socket。這時,客戶方和服務方都建立了用于通信的socket,接下來就是由各個socket分別打開各自的輸入/輸出流。

  8.3.6 打開輸入/出流

  類Socket提供了方法getInputStream ()和getOutStream()來得到對應的輸入/輸出流以進行讀/寫操作,這兩個方法分別返回InputStream和OutputSteam類對象。為了便于讀/寫數據,我們可以在返回的輸入/輸出流對象上建立過濾流,如DataInputStream、DataOutputStream或PrintStream類對象,對于文本方式流對象,可以采用InputStreamReader和OutputStreamWriter、PrintWirter等處理。

  例如:
  PrintStream os=new PrintStream(new BufferedOutputStreem(socket.getOutputStream()));
  DataInputStream is=new DataInputStream(socket.getInputStream());
  PrintWriter out=new PrintWriter(socket.getOutStream(),true);
  BufferedReader in=new ButfferedReader(new InputSteramReader(Socket.getInputStream()));

  輸入輸出流是網絡編程的實質性部分,具體如何構造所需要的過濾流,要根據需要而定,能否運用自如主要看讀者對Java中輸入輸出部分掌握如何。

  8.3.7 關閉Socket

   每一個Socket存在時,都將占用一定的資源,在Socket對象使用完畢時,要其關閉。關閉Socket可以調用Socket的Close()方法。在關閉Socket之前,應將與Socket相關的所有的輸入/輸出流全部關閉,以釋放所有的資源。而且要注意關閉的順序,與Socket相關的所有的輸入/輸出該首先關閉,然后再關閉Socket。
  os.close();
  is.close();
  socket.close();

  盡管Java有自動回收機制,網絡資源最終是會被釋放的。但是為了有效的利用資源,建議讀者按照合理的順序主動釋放資源。

  8.3.8 簡單的Client/Server程序設計

  下面我們給出一個用Socket實現的客戶和服務器交互的典型的C/S結構的演示程序,讀者通過仔細閱讀該程序,會對前面所討論的各個概念有更深刻的認識。程序的意義請參考注釋。

  1. 客戶端程序

  import java.io.*;
  import java.net.*;
  public class TalkClient {
    public static void main(String args[]) {
      try{
        Socket socket=new Socket("127.0.0.1",4700);
        //向本機的4700端口發出客戶請求
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
        //由系統標準輸入設備構造BufferedReader對象
        PrintWriter os=new PrintWriter(socket.getOutputStream());
        //由Socket對象得到輸出流,并構造PrintWriter對象
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //由Socket對象得到輸入流,并構造相應的BufferedReader對象
        String readline;
        readline=sin.readLine(); //從系統標準輸入讀入一字符串
        while(!readline.equals("bye")){
        //若從標準輸入讀入的字符串為 "bye"則停止循環
          os.println(readline);
          //將從系統標準輸入讀入的字符串輸出到Server
          os.flush();
          //刷新輸出流,使Server馬上收到該字符串
          System.out.println("Client:"+readline);
          //在系統標準輸出上打印讀入的字符串
          System.out.println("Server:"+is.readLine());
          //從Server讀入一字符串,并打印到標準輸出上
          readline=sin.readLine(); //從系統標準輸入讀入一字符串
        } //繼續循環
        os.close(); //關閉Socket輸出流
        is.close(); //關閉Socket輸入流
        socket.close(); //關閉Socket
      }catch(Exception e) {
        System.out.println("Error"+e); //出錯,則打印出錯信息
      }
  }
  }



主站蜘蛛池模板: 天天爽天天狼久久久综合 | 日本在线免费观看视频 | 色综色天天综合网 | 伊人首页 | 色涩在线| 日韩久草| 日本综合欧美一区二区三区 | 日本中文在线视频 | 中文国产成人精品久久一 | 伊人网视频在线 | 中文字幕伦伦精品 | 涩五月婷婷 | 欧美在线观看黄色 | 日韩欧美精品中文字幕 | 天堂美女| 视频午夜| 色综合久久久高清综合久久久 | 午夜三级在线观看 | 天天爱天天干天天操 | 热久久最新视频 | 日韩性黄色一级 | 日本一区二区高清免费不卡 | 青青草视频在线观看免费 | 特黄一级真人毛片 | 一二三四在线手机观看视频 | 三级中文有码中文字幕 | 色综合综合色综合色综合 | 午夜久久久久久网站 | 亚洲日本国产 | 日韩高清在线日韩大片观看网址 | 婷婷免费在线 | 色吧综合网 | 无码中文资源在线播放 | 色综合88| 涩涩涩涩涩涩涩 | 日韩三级影院 | 欧美特黄一级大黄录像 | 在线视频a | 亚洲天堂一区二区 | 热思思久久 | 午夜在线影院 |