溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解Socket的低層次Java網(wǎng)絡(luò)編程

發(fā)布時間:2021-11-26 10:06:11 來源:億速云 閱讀:113 作者:柒染 欄目:編程語言

這篇文章將為大家詳細講解有關(guān)如何理解Socket的低層次Java網(wǎng)絡(luò)編程,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

Socket的低層次Java網(wǎng)絡(luò)編程

1 Socket通訊

網(wǎng)絡(luò)上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現(xiàn)客戶方和服務(wù)方的連接。Socket是TCP/IP協(xié)議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號唯一確定。
在Java環(huán)境下,Socket編程主要是指基于TCP/IP協(xié)議的網(wǎng)絡(luò)編程。

2 Socket通訊的一般過程

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

對于一個功能齊全的Socket,都要包含以下基本結(jié)構(gòu),其工作過程包含以下四個基本的步驟:
 ?。?) 創(chuàng)建Socket;
  (2) 打開連接到Socket的輸入/出流;
 ?。?) 按照一定的協(xié)議對Socket進行讀/寫操作;
 ?。?) 關(guān)閉Socket.

3 創(chuàng)建Socket

java在包java.net中提供了兩個類Socket和ServerSocket,分別用來表示雙向連接的客戶端和服務(wù)端。這是兩個封裝得非常好的類,使用很方便。其構(gòu)造方法如下:
  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還是數(shù)據(jù)報socket,localPort表示本地主機的端口號,localAddr和bindAddr是本地機器的地址(ServerSocket的主機地址),impl是socket的父類,既可以用來創(chuàng)建serverSocket又可以用來創(chuàng)建Socket。count則表示服務(wù)端所能支持的最大連接數(shù)。例如:
  Socket client = new Socket("127.0.0.1", 80);
  ServerSocket server = new ServerSocket(80);
  注意,在選擇端口時,必須小心。每一個端口提供一種特定的服務(wù),只有給出正確的端口,才能獲得相應(yīng)的服務(wù)。0~1023的端口號為系統(tǒng)所保留,例如http服務(wù)的端口號為80,telnet服務(wù)的端口號為21,ftp服務(wù)的端口號為23, 所以我們在選擇端口號時,最好選擇一個大于1023的數(shù)以防止發(fā)生沖突。
  在創(chuàng)建socket時如果發(fā)生錯誤,將產(chǎn)生IOException,在程序中必須對之作出處理。所以在創(chuàng)建Socket或ServerSocket是必須捕獲或拋出例外。

4簡單的Client/Server程序設(shè)計

下面給出一個用Socket實現(xiàn)的客戶和服務(wù)器交互的典型的C/S結(jié)構(gòu)的演示程序,會對前面所討論的各個概念有更深刻的認識。程序的意義請參考注釋。

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端口發(fā)出客戶請求
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
        //由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象
        PrintWriter os=new PrintWriter(socket.getOutputStream());
        //由Socket對象得到輸出流,并構(gòu)造PrintWriter對象
       BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象
        String readline;
        readline=sin.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=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); //出錯,則打印出錯信息
      }
  }
}

 2. 服務(wù)器端程序
  import java.io.*;
  import java.net.*;
  import java.applet.Applet;
  public class TalkServer{
    public static void main(String args[]) {
      try{
        ServerSocket server=null;
        try{
          server=new ServerSocket(4700);
        //創(chuàng)建一個ServerSocket在端口4700監(jiān)聽客戶請求
        }catch(Exception e) {
          System.out.println("can not listen to:"+e);
        //出錯,打印出錯信息
        }

        Socket socket=null;
        try{
          socket=server.accept();
          //使用accept()阻塞等待客戶請求,有客戶
          //請求到來則產(chǎn)生一個Socket對象,并繼續(xù)執(zhí)行
        }catch(Exception e) {
          System.out.println("Error."+e);
          //出錯,打印出錯信息
        }
        String line;
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
         //由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象
        PrintWriter os=newPrintWriter(socket.getOutputStream());
         //由Socket對象得到輸出流,并構(gòu)造PrintWriter對象
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
         //由系統(tǒng)標(biāo)準(zhǔn)輸入設(shè)備構(gòu)造BufferedReader對象

        System.out.println("Client:"+is.readLine());
        //在標(biāo)準(zhǔn)輸出上打印從客戶端讀入的字符串
        line=sin.readLine();
        //從標(biāo)準(zhǔn)輸入讀入一字符串
        while(!line.equals("bye")){
        //如果該字符串為 "bye",則停止循環(huán)
          os.println(line);
          //向客戶端輸出該字符串
          os.flush();
          //刷新輸出流,使Client馬上收到該字符串
          System.out.println("Server:"+line);
          //在系統(tǒng)標(biāo)準(zhǔn)輸出上打印讀入的字符串
          System.out.println("Client:"+is.readLine());
          //從Client讀入一字符串,并打印到標(biāo)準(zhǔn)輸出上
          line=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
        server.close(); //關(guān)閉ServerSocket
      }catch(Exception e){
        System.out.println("Error:"+e);
        //出錯,打印出錯信息
      }
    }
  }

關(guān)于如何理解Socket的低層次Java網(wǎng)絡(luò)編程就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI