目錄
本文介紹網路相關理論和簡單入門的Java網路程式設計範例
計算機網路的概念
OSI參考模型
TCP/IP參考模型
基於TCP協定的應用主要有以下幾種:
基於UDP協定的應用層協定:
IP協定
TCP協定和連接埠
連接埠
Java网络编程入门程序
创建EchoServer类
创建EchoClient
总结
首頁 Java java教程 Java網路程式設計由淺入深一圖文詳解

Java網路程式設計由淺入深一圖文詳解

Mar 04, 2017 am 10:04 AM

本文介紹網路相關理論和簡單入門的Java網路程式設計範例

#這篇文章主要介紹電腦網路的一個整體架構和每一層的作用。

  • 電腦網路的概念

  • #OSI參考模型

  • #TCP/IP參考模型

  • #IP協定

  • TCP協定與連接埠

  • Java網路程式入門程式


計算機網路的概念

網絡,就是不同節點之間經由連線互聯起來的一個事物。以此類推,電腦網絡,就是將不同地理位置的電腦透過通訊線路連接起來的一個具有強大功能的網路系統。在這個網路中每台電腦就是一個節點。

OSI參考模型

OSI(Open System Interconnection)是由ISO組織研究的一套網路體系結構。這名字起的好
各層的名稱和作用,當做了解:

#功能
物理層 不要理解錯了,這一層不包含什麼網路線、電纜的實體媒體。這裡只是規定網路線和電纜的介面類型,訊號電壓等。使用bit傳輸
資料鏈結層 負責兩個相鄰節點間的路線,以訊框為單位傳輸。典型設備交換器(Switch)
網路層 兩台電腦傳輸資料可能會經過許多資料鏈路,網路層的作用就是選擇最優的路線。典型設備就是路由器
傳輸層 提供兩個端系統的會話的建立、維護和取消傳輸連線的功能。使用封包傳輸
會話層 管理進程間的會話過程,也就是建立、管理、終止進程間的會話。使用封包傳輸
表示層 對資料的加解密、解壓縮和格式轉換等。
應用層 這層就是和使用者的具體應用互動。例如:收發E-mail等。

TCP/IP參考模型

因為OSI網路結構分層太多過於複雜,所以TCP/IP協定橫空出世。 TCP/IP協定同樣借助了OSI的分層思想,但只是分成四層:

主機網路層為上層提供一個存取介面網路互聯層把IP數據包發送到目標主機。這一層使用的是IP協議,IP協議規定了資料包的格式,並且規定了為資料包尋找路由的流程。 傳輸層使來源主機和目標主機的程序可以進行會話。這一層定義了兩種協定TCP和UDP協定。 應用層TCP/IP模型將OSI參考模型中的會話層和表現層功能合併到應用層。
#功能
#########

基於TCP協定的應用主要有以下幾種:

•   FTP:檔案傳輸協議,允許在網路上傳輸檔案。
•   TELNET:虛擬終端協議,允許從主機A登錄遠端主機B。
•   HTTP:超文本傳輸協議,允許網路是傳輸超文本。
•   HTTPS:安全超文本傳輸協定。
•   POP3:允許使用者存取和操作運程伺服器上的郵件和郵件夾。
•   IMAP4:訊息存取協定版本4,允許使用者存取和操作運送伺服器上的郵件和郵件夾。
•   SMTP:發送郵件的協定。

基於UDP協定的應用層協定:

•   SNMP:簡單網路管理協議,為管理本地和遠端的網路設備提供了一個標準化途徑,是分佈式環境中的集中化管理協定。
•   DNS:網域名稱系統協議,將主機的網域轉換為對應的IP位址。

IP協定

IP網路(採用IP協定的網路)中每一台主機都有唯一的IP位址,IP位址識別網路中的每個主機。 IP位址是一個32位元的二進位數序列。例如:192.168.3.4。 IP位址與子網路遮罩進行與運算得到的是網路位址。如果子網路遮罩為255.255.255.0 那網路位址就是:192.168.3.0

##傳送封包的程序

#IP是面向包的協議,即資料被分成若干小資料包,然後分別傳輸它們。 IP網路上的主機只能直接傳送封包至本地網路上的其他主機(也就是具有相通IP網址的主機)。主機實際上具有兩個不同性質的真實位址。主機A向同一個網路上的另一個主機B發包時,會透過位址解析協定(ARP,Address Resolution Protocol)取得對法的實體位址,然後把包給對方。 ARP協定的運作機制為,主機A在網路上廣播一個ARP訊息:”要找位址為192.166.3.5的主機”,具有這個IP位址的主機B就會作回應,把自身的實體位址告訴A。

當主機A傳送封包給另一個網路的主機B:

主機A利用ARP協定找到本地網路上的路由器的實體位址,把封包轉給路由。路由器依照下列步驟處理封包:

  1. 如果封包的生命週期已到,則封包被拋棄。

  2. 搜尋路由表,優先搜尋路由表中的主機,如果找到具有目標IP位址的主機,則將封包傳送給該主機。

  3. 如果符合主機失敗,則繼續搜尋路由表,符合子網路的路由表,如果找到符合的路由表,則將封包轉送給該路由器。

  4. 如果符合同子網路的路由器失敗,則繼續搜尋路由表,符合相同網路的路由器,如果找到符合的路由器,則將封包轉送給該路由器。

  5. 如果以上匹配都失敗,就搜尋預設路由,如果預設路由存在,則按照預設路由發送資料包,否則丟棄資料包。

    流程圖如下:

    Java網路程式設計由淺入深一圖文詳解

網域

IP是一串數字沒有任何意義。網域名稱就是與IP對應的有意義的一串字元或數字。例如:

www.google.com 網域和IP的對應需要一個網域解析系統來實現將網域轉換成IP。 DNS伺服器就是就可以解決這個問題。

URL(統一資源定位器)

URL(Uniform Resource Location)是一種專門識別網路上資源位置而設定的一種編址方式。 URL一般由3個部分組成:

应用层协议://主机IP地址或域名/资源所在路径/资源名
登入後複製

例如:

http://www.php.cn/ 其中http 指超文本傳輸協議, blog.csdn.net 是Web伺服器的域名,/article/details/ 是網頁所在路徑,54962975 這個才是對應的網頁檔案。

TCP協定和連接埠

IP協定在傳送資料時,在資料傳輸過程中會出現各種問題。導致包遺失或包的順序不對。 TCP協定使兩台主機上的進程順利通信,不必擔心包遺失或包順序不對。 TCP追蹤包順序,如果包順序被搞亂時按照正確的順序進行重新組合。如果包遺失,則TCP會請求來源主機重發包。

連接埠

TCP協定讓兩台主機上的行程順利通信,但是主機不只一個行程。 TCP就採取連接埠來區分進程。連接埠不是實體設備,而是用來標識進程的邏輯位址。電腦的連接埠範圍是0到65535,其中0到1023的連接埠一般固定分配給一些服務。具體如下:

服务端口协议
文件传输服务21FTP
远程登录服务23TELENET
邮件传输服务25SMTP
万维网超文本传输服务80HTTP
访问邮件远程邮件服务110POP3
互联网消息存取服务143IMAP4
安全的超文本传输服务443HTTPS
安全的远程登录服务992TELNETS
安全互联网消息存取服务993IMAPS

Java网络编程入门程序

Java网络程序都建立在TCP/IP协议基础上,在应用层实现。传输层向应用层提供了套接字Socket接口,Socket封装了下层的数据传细节,应用层的程序通过Socket来建立与远程主机的连接,以及数据传输,如下图所示:
Java網路程式設計由淺入深一圖文詳解

在Java中,有3种套接字类:java.net.Socketjava.net.ServerSocketjava.net.DatagramSocket 。其中SocketServerSocket 建立在TCP协议上,DatagramSocket 类建立在UDP协议基础上。我们创建EchoServer和EchoClient两个类,我们通过ServerSocketSocket来编写。

创建EchoServer类

在服务端通过一直监听端口,来接收客户程序的连接请求。在服务器程序中,先创建一个ServerSocket对象,在构造方法中指定监听的端口:

ServerSocket server = new ServerSocket(8080);
登入後複製

ServerSocket构造器负责在操作系统中将当前进程注册为服务进程。服务器程序调用ServerSocketaccept()方法来监听端口,等待客户端的连接,如果接收到连接,则accept()方法返回一个Socket对象,这个Socket对象与客户端的Socket对象形成了一条通信线路:

Socket socket = server.accept();
登入後複製

Socket提供了getInputStream()方法和getOutputStream()方法,分别返回输入流InputStream对象和输出流OutputStream对象。程序只需向输出流写入东西,就能向对方发送数据;只需从输入流读取数据,就能接收到数据。如下图:
Java網路程式設計由淺入深一圖文詳解
EchoServer 类代码如下:

/**
 * 服务端 服务端类
 *
 */public class EchoServer {


    private ServerSocket serverSocket;    
    public EchoServer(int port) {        
    try {            this.serverSocket = new ServerSocket(port);
            System.out.println("start server success,start port:"+port);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    /**
     * 获取BufferedReader包装类
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private BufferedReader getReader(Socket socket) throws IOException {        
    return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }    /**
     * 获取PrintWriter包装类,
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private PrintWriter getWriter(Socket socket) throws IOException {        
    // 每写一行自动刷新
        return new PrintWriter(socket.getOutputStream(), true);
    }    public void service() {        while (true) {
            Socket socket = null;            try {
                socket = serverSocket.accept();
                System.out.println("new connect,address is:" + socket.getInetAddress() + " port is:" + socket.getPort());
                BufferedReader reader = getReader(socket);
                PrintWriter writer = getWriter(socket);
                String msg = null;                
                while ((msg = reader.readLine()) != null) {                    
                // 读取一行
                    System.out.println("client request  msg: " + msg);
                    writer.println(echo(msg));                    
                    if ("bye".equalsIgnoreCase(msg)) {                        
                    break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally{                
            if(socket!=null){                    
            try {                        
            //关闭会话连接
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }    private String echo(String msg) {        return "get request msg is '" + msg+"'";
    }    public static void main(String[] args) {        new EchoServer(8080).service();
    }
}
登入後複製

EchoServer类的最主要的方法就是service()方法,它不断登录客户的连接请求。当serverSocket.accept()返回一个Socket对象时,表示与一个客户端建立了连接。

创建EchoClient

在EchoClient程序中,为了与EchoClient通信,需要先创建一个Socket对象:

String host="localhost";int port = 8080;new Socket(host, port);
登入後複製

host表示Server进程所在服务器的地址,port表示Server进程监听的端口。当参数host为’localhost’时,表示服务端和客户端在同一台机器上。下面是EchoClient类的源码:

public class EchoClient {
    private Socket socket;    
    public EchoClient(String host,int port){        
    try {            this.socket = new Socket(host, port);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }    /**
     * 获取BufferedReader包装类
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private BufferedReader getReader(Socket socket) throws IOException {        
    return new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }    /**
     * 获取PrintWriter包装类,
     * 
     * @param socket
     * @return
     * @throws IOException
     */
    private PrintWriter getWriter(Socket socket) throws IOException {        
    // 每写一行自动刷新
        return new PrintWriter(socket.getOutputStream(), true);
    }    public void talk(){        try {
            BufferedReader reader = getReader(socket);
            PrintWriter writer = getWriter(socket);
            BufferedReader localReader = new BufferedReader(new InputStreamReader(System.in));
            String msg = null;            
            while((msg=localReader.readLine())!=null){
                writer.println(msg);
                System.out.println("server response msg:"+reader.readLine());                
                if("bye".equalsIgnoreCase(msg)){                    
                break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{            
        if(socket!=null){                
        try {
                    socket.close();
                    System.out.println("has been disconnected");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }    public static void main(String[] args) {        
    new EchoClient("localhost", 8080).talk();
    }
}
登入後複製

在EchoClient类中最重要的是talk()方法,该方法不断读取用户从控制台输入的字符串,然后将它发送到EchoServer,在把EchoServer返回的数据打印在控制台。如果输入’bye’字符串,就会结束与EchoServer的通信,调用socket.close()方法端口连接。
具体运行如下图,一个是服务端一个是客户端的控制台:
Java網路程式設計由淺入深一圖文詳解

总结

简单介绍了一下网络的理论知识和TCP/IP协议。并使用Java实现了一个网络通信程序。

 以上就是Java网络编程由浅入深一图文详解的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

手機上如何將XML轉換成PDF? 手機上如何將XML轉換成PDF? Apr 02, 2025 pm 10:18 PM

直接在手機上將XML轉換為PDF並不容易,但可以藉助雲端服務實現。推薦使用輕量級手機App上傳XML文件並接收生成的PDF,配合雲端API進行轉換。雲端API使用無服務器計算服務,選擇合適的平台至關重要。處理XML解析和PDF生成時需要考慮複雜性、錯誤處理、安全性和優化策略。整個過程需要前端App與後端API協同工作,需要對多種技術有所了解。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP與Python:核心功能 PHP與Python:核心功能 Apr 13, 2025 am 12:16 AM

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles