ホームページ  >  記事  >  Java  >  Javaネットワークプログラミングを画像と文章で詳しく解説

Javaネットワークプログラミングを画像と文章で詳しく解説

黄舟
黄舟オリジナル
2017-03-04 10:04:442704ブラウズ

この記事では、ネットワーク関連の理論と簡単な Java ネットワーク プログラミングの例を紹介します

この記事では、主にコンピュータ ネットワークの全体的なアーキテクチャと各層の役割を紹介します。

  • コンピュータネットワークの概念

  • OSI参照モデル

  • TCP/IP参照モデル

  • IPプロトコル

  • TCPプロトコルとポート

  • Javaネットワークプログラミング入門プログラム


コンピュータネットワークの概念

ネットワークとは、異なるノード間が接続によって相互接続されているものです。同様に、コンピュータ ネットワークは、地理的に異なる場所にあるコンピュータを通信回線を通じて接続する強力なネットワーク システムです。このネットワークでは、各コンピュータがノードになります。

OSI 参照モデル

OSI (Open System Interconnection) は、ISO 組織によって研究された一連のネットワーク アーキテクチャです。この名前は良いですね
各層の名前と機能を理解する必要があります:

名前 機能
物理層 誤解しないでください、この層にはネットワークケーブルは含まれていませんまたは物理メディアをケーブルで接続します。これは、ネットワークケーブルとケーブルのインターフェースタイプ、信号電圧などを指定するだけです。ビット送信
を使用して、データリンク層 は2つの隣接するノード間のルートを担当し、フレーム単位で送信されます。代表的な機器のスイッチ (スイッチ)
ネットワーク層 2 台のコンピューターが多くのデータ リンクを介してデータを送信する場合があり、ネットワーク層の役割は、最適なルートを選択することです。典型的なデバイスはルーターです
トランスポート層 は、2 つのエンドシステム間のセッションの送信接続を確立、維持、およびキャンセルする機能を提供します。メッセージ送信
セッション層 を使用して、プロセス間のセッションプロセスを管理、つまりプロセス間のセッションの確立、管理、終了を行います。メッセージ送信
プレゼンテーション層 を使用して、データの暗号化、復号化、解凍、フォーマットなどを行います。
アプリケーション層 この層は、ユーザーの特定のアプリケーションと対話します。例:電子メールの送受信など。

TCP/IP参照モデル

OSIネットワーク構造には層が多すぎて複雑すぎるため、TCP/IPプロトコルが誕生しました。 TCP/IP プロトコルも OSI の階層化された概念に依存していますが、次の 4 つの層に分割されているだけです:

名前 機能
ホストネットワーク層 アクセスを提供する上位層のインターフェース
ネットワーク相互接続層 は、IPデータパケットをターゲットホストに送信します。この層は、データ パケットの形式とデータ パケットのルートを見つけるプロセスを指定する IP プロトコルを使用します。
トランスポート層 により、ソースホストとターゲットホスト上のプロセスがセッションを実行できるようになります。この層は、TCP と UDP という 2 つのプロトコルを定義します。
アプリケーション層 TCP/IPモデルは、OSI参照モデルのセッション層とプレゼンテーション層の機能をアプリケーション層に統合します。

TCP プロトコルに基づくアプリケーションには主に次のものが含まれます:

• FTP: ファイル転送プロトコル。ネットワーク上でのファイル転送を可能にします。
• TELNET: 仮想端末プロトコル。ホスト A からリモート ホスト B へのログインを可能にします。
• HTTP: ハイパーテキスト転送プロトコル。ネットワークがハイパーテキストを送信できるようにします。
• HTTPS: 安全なハイパーテキスト転送プロトコル。
• POP3: ユーザーが Wishun サーバー上のメールとメール フォルダーにアクセスして操作できるようにします。
• IMAP4: メッセージング アクセス プロトコル バージョン 4 により、ユーザーは Yuanyun サーバー上のメールとメール フォルダーにアクセスして操作できるようになります。
• SMTP: 電子メールを送信するためのプロトコル。

UDP プロトコルに基づくアプリケーション層プロトコル:

• SNMP: Simple Network Management Protocol は、ローカルおよびリモートのネットワーク デバイスを管理するための標準化された方法を提供し、分散環境における集中管理プロトコルです。
• DNS: ホストのドメイン名を対応する IP アドレスに変換するドメイン ネーム システム プロトコル。

IP プロトコル

IP ネットワーク (IP プロトコルを使用するネットワーク) 内のすべてのホストには一意の IP アドレスがあり、IP アドレスはネットワーク内の各ホストを識別します。 IP アドレスは 32 ビットの 2 進数のシーケンスです。例: 192.168.3.4。ネットワーク アドレスは、IP アドレスとサブネット マスクの AND 演算によって取得されます。サブネットマスクが 255.255.255.0 の場合、ネットワークアドレスは 192.168.3.0 になります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

データパケットの送信プロセス

IP はパケット指向ですプロトコル、つまりデータはいくつかの小さなパケットに分割され、個別に送信されます。 IP ネットワーク上のホストは、ローカル ネットワーク上の他のホスト (つまり、同様の IP アドレスを持つホスト) にのみデータ パケットを直接送信できます。実際、ホストには性質の異なる 2 つの実アドレスがあります。ホスト A が同じネットワーク上の別のホスト B にパケットを送信するとき、ホスト A はアドレス解決プロトコル (ARP) を通じて相手の物理アドレスを取得し、パケットを相手に渡します。 ARP プロトコルの動作メカニズムは、ホスト A が「アドレス 192.166.3.5 のホストを探しています」という ARP メッセージをネットワーク上にブロードキャストし、この IP アドレスを持つホスト B が応答してその物理アドレスを A に通知することです。

ホスト A が別のネットワーク上のホスト B にパケットを送信する場合:

ホスト A は ARP プロトコルを使用してローカル ネットワーク上のルーターの物理アドレスを見つけ、パケットをルーターに転送します。ルーターはデータ パケットを次のように処理します。
データ パケットのライフ サイクルが期限切れになった場合、データ パケットは破棄されます。

  • ルーティング テーブル内のホストを優先して検索し、目的の IP アドレスを持つホストが見つかった場合は、そのホストにデータ パケットが送信されます。

  • 🎜 一致するホストに障害が発生した場合は、ルーティング テーブルの検索を続行し、サブネットのルーティング テーブルと一致し、一致するルーティング テーブルが見つかった場合は、パケットをルーターに転送します。 🎜
  • 🎜 同じサブネット上のルーターの照合に失敗した場合は、同じネットワーク上のルーターと照合するためにルーティング テーブルの検索を続け、一致するルーターが見つかった場合は、データ パケットがルーターに転送されます。 。 🎜
  • 🎜上記のマッチングが失敗した場合、デフォルト ルートが検索され、デフォルト ルートが存在する場合、データ パケットはデフォルト ルートに従って送信され、それ以外の場合、データ パケットは破棄されます。 🎜フローチャートは次のとおりです: 🎜Javaネットワークプログラミングを画像と文章で詳しく解説🎜
  • 🎜🎜ドメイン名🎜🎜🎜 IPは数字の羅列で意味はありません。ドメイン名は、IP に対応する意味のある文字または数字の文字列です。例: www.google.com 🎜 ドメイン名と IP を対応させるには、ドメイン名を IP に変換するドメイン名解決システムが必要です。 DNS サーバーはこの問題を解決できます。 🎜🎜🎜URL (Uniform Resource Locator)🎜🎜🎜 URL (Uniform Resource Location) は、ネットワーク上のリソースの場所を識別するために特別に設定されたアドレス指定方法です。 URL は通常 3 つの部分で構成されます: 🎜
    ServerSocket server = new ServerSocket(8080);
    🎜 例: http://www.php.cn/ ここで、http はハイパーテキスト転送プロトコル、blog を指します。 csdn.net は Web サーバーのドメイン名、/article/details/ は Web ページのパス、54962975 は対応する Web ページです。ファイル。 🎜🎜🎜TCPプロトコルとポート🎜🎜🎜 IPプロトコルがデータを送信する場合、データ送信プロセス中にさまざまな問題が発生します。これにより、パケット損失または不正なパケット順序が発生します。 TCP プロトコルを使用すると、2 つのホスト上のプロセスが、パケット損失やパケットの順序の乱れを心配することなくスムーズに通信できるようになります。 TCP はパケットの順序を追跡し、パケットが混乱している場合は正しい順序に再組み立てします。パケットが失われた場合、TCP は送信元ホストにパケットの再送信を要求します。 🎜🎜🎜ポート🎜🎜🎜 TCP プロトコルを使用すると、2 つのホスト上のプロセスがスムーズに通信できますが、ホスト上には複数のプロセスが存在します。 TCP はポートを使用してプロセスを区別します。ポートは物理デバイスではなく、プロセスを識別するために使用される論理アドレスです。コンピュータのポート範囲は 0 ~ 65535 で、通常、そのうちのポート 0 ~ 1023 が一部のサービスに割り当てられます。詳細は以下の通りです🎜
    服务 端口 协议
    文件传输服务 21 FTP
    远程登录服务 23 TELENET
    邮件传输服务 25 SMTP
    万维网超文本传输服务 80 HTTP
    访问邮件远程邮件服务 110 POP3
    互联网消息存取服务 143 IMAP4
    安全的超文本传输服务 443 HTTPS
    安全的远程登录服务 992 TELNETS
    安全互联网消息存取服务 993 IMAPS

    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 までご連絡ください。