Heim  >  Artikel  >  Java  >  Java-Netzwerkprogrammierung ausführlich mit Bildern und Text erklärt

Java-Netzwerkprogrammierung ausführlich mit Bildern und Text erklärt

黄舟
黄舟Original
2017-03-04 10:04:442643Durchsuche

In diesem Artikel werden netzwerkbezogene Theorien und einfache einführende Beispiele für die Java-Netzwerkprogrammierung vorgestellt.

In diesem Artikel werden hauptsächlich die Gesamtarchitektur eines Computernetzwerks und die Funktionen davon vorgestellt jede Ebene Wirkung.

  • Das Konzept des Computernetzwerks

  • OSI-Referenzmodell

  • TCP/IP-Referenzmodell

  • IP-Protokoll

  • TCP-Protokoll und -Port

  • Einführungsprogramm in die Java-Netzwerkprogrammierung


Computer Das Konzept des Netzwerks

Ein Netzwerk ist eine Sache, die zwischen verschiedenen Knoten durch Verbindungen miteinander verbunden ist. Analog dazu ist ein Computernetzwerk ein leistungsstarkes Netzwerksystem, das Computer an verschiedenen geografischen Standorten über Kommunikationsleitungen verbindet. In diesem Netzwerk ist jeder Computer ein Knoten.

OSI-Referenzmodell

OSI (Open System Interconnection) ist eine Reihe von Netzwerkarchitekturen, die von der ISO-Organisation untersucht wurden. Dieser Name ist gut gewählt
Die Namen und Funktionen jeder Schicht sollten verstanden werden:

名称 功能
物理层 不要理解错了,这一层不包含什么网线、电缆的物理介质。这里只是规定网线和电缆的接口类型,信号电压等。使用bit传输
数据链路层 负责两个相邻节点间的路线,以帧为单位传输。典型设备交换机(Switch)
网络层 两台计算机传输数据可能会经过很多数据链路,网络层的作用就是选择最优的路线。典型设备就是路由器
传输层 提供两个端系统的会话的建立、维护和取消传输连接的功能。使用报文传输
会话层 管理进程间的会话过程,即建立、管理、终止进程间的会话。使用报文传输
表示层 对数据的加解密、解压缩和格式转换等。
应用层 这层就是和用户的具体应用交互。例如:收发E-mail等。

TCP/IP-Referenzmodell

Aufgrund der OSI-Netzwerkstruktur ist vielschichtig Zu viel und zu kompliziert, also wurde das TCP/IP-Protokoll geboren. Das TCP/IP-Protokoll basiert ebenfalls auf der Schichtidee von OSI, ist jedoch nur in vier Schichten unterteilt:

名称 功能
主机网络层 为上层提供一个访问接口
网络互联层 把IP数据包发送到目标主机。这一层使用的是IP协议,IP协议规定了数据包的格式,并且规定了为数据包寻找路由的流程。
传输层 使源主机和目标主机的进程可以进行会话。这一层定义了两种协议TCP和UDP协议。
应用层 TCP/IP模型将OSI参考模型中的会话层和表现层功能合并到应用层。

Die wichtigsten Anwendungen, die auf dem TCP-Protokoll basieren, sind wie folgt:

• FTP: Dateiübertragungsprotokoll, das die Dateiübertragung im Netzwerk ermöglicht.
• TELNET: Virtuelles Terminalprotokoll, das die Anmeldung von Host A an Remote-Host B ermöglicht.
• HTTP: Hypertext Transfer Protocol, ermöglicht dem Netzwerk die Übertragung von Hypertext.
• HTTPS: Hypertext Transfer Protocol Secure.
• POP3: Ermöglicht Benutzern den Zugriff auf und die Verwaltung von E-Mails und E-Mail-Ordnern auf dem Fortune-Server.
• IMAP4: Messaging Access Protocol Version 4, ermöglicht Benutzern den Zugriff und die Verwaltung von E-Mails und E-Mail-Ordnern auf dem Yuanyun-Server.
• SMTP: Protokoll zum Versenden von E-Mails.

Protokoll der Anwendungsschicht basierend auf dem UDP-Protokoll:

• SNMP: Simple Network Management Protocol bietet eine standardisierte Möglichkeit zur Verwaltung lokaler und entfernter Netzwerkgeräte und ist eine verteilte zentrale Verwaltung Protokoll in einer zentralen Umgebung.
• DNS: Domain Name System Protocol, das den Domänennamen des Hosts in die entsprechende IP-Adresse umwandelt.

IP-Protokoll

Jeder Host in einem IP-Netzwerk (einem Netzwerk, das das IP-Protokoll verwendet) hat eine eindeutige IP-Adresse, und die IP-Adresse identifiziert jeden Host im Netzwerk. Eine IP-Adresse ist eine 32-Bit-Binärzahlenfolge. Zum Beispiel: 192.168.3.4. Die Netzwerkadresse wird durch UND-Verknüpfung der IP-Adresse mit der Subnetzmaske ermittelt. Wenn die Subnetzmaske 255.255.255.0 ist, lautet die Netzwerkadresse: 192.168.3.0

Der Prozess des Sendens von Datenpaketen

IP ist ein paketorientiertes Protokoll. Das heißt, die Daten werden in mehrere kleine Pakete aufgeteilt und separat übertragen. Hosts im IP-Netzwerk können Datenpakete nur direkt an andere Hosts im lokalen Netzwerk senden (also Hosts mit ähnlichen IP-Adressen). Der Host verfügt tatsächlich über zwei reale Adressen unterschiedlicher Natur. Wenn Host A ein Paket an einen anderen Host B im selben Netzwerk sendet, erhält er die physische Adresse der anderen Partei über das Address Resolution Protocol (ARP) und gibt das Paket dann an die andere Partei weiter. Der Funktionsmechanismus des ARP-Protokolls besteht darin, dass Host A eine ARP-Nachricht im Netzwerk sendet: „Suche nach einem Host mit der Adresse 192.166.3.5.“ Host B mit dieser IP-Adresse antwortet und teilt A seine physische Adresse mit.

Wenn Host A ein Paket an Host B in einem anderen Netzwerk sendet:
Host A verwendet das ARP-Protokoll, um die physische Adresse des Routers im lokalen Netzwerk zu finden und leitet das Paket an den Router weiter. Der Router verarbeitet das Datenpaket wie folgt:

  1. Wenn der Lebenszyklus des Datenpakets abgelaufen ist, wird das Datenpaket verworfen.

  2. Durchsuchen Sie die Routing-Tabelle und geben Sie den Hosts in der Routing-Tabelle Priorität. Wenn ein Host mit der Ziel-IP-Adresse gefunden wird, wird das Datenpaket an den Host gesendet.

  3. Wenn der Host-Abgleich fehlschlägt, durchsuchen Sie die Routing-Tabelle weiter, gleichen Sie die Routing-Tabelle des Subnetzes ab und leiten Sie das Paket an diesen Router weiter, wenn eine passende Routing-Tabelle gefunden wird.

  4. Wenn die Zuordnung des Routers im selben Subnetz fehlschlägt, durchsuchen Sie die Routing-Tabelle weiter, um eine Übereinstimmung mit dem Router im selben Netzwerk zu finden. Wenn ein passender Router gefunden wird, wird das Datenpaket weitergeleitet zum Router.

  5. Wenn der obige Abgleich fehlschlägt, wird die Standardroute gesucht. Wenn die Standardroute vorhanden ist, wird das Datenpaket gemäß der Standardroute gesendet, andernfalls wird das Datenpaket verworfen.
    Das Flussdiagramm sieht wie folgt aus:
    Java-Netzwerkprogrammierung ausführlich mit Bildern und Text erklärt

Domainname

IP ist eine Folge von Zahlen und hat keine Bedeutung. Ein Domainname ist eine aussagekräftige Zeichenfolge aus Zeichen oder Zahlen, die einer IP entspricht. Beispiel: www.google.com
Die Entsprechung zwischen Domänenname und IP erfordert ein System zur Auflösung von Domänennamen, um den Domänennamen in IP umzuwandeln. Ein DNS-Server kann dieses Problem lösen.

URL (Uniform Resource Locator)

URL (Uniform Resource Location) ist eine Adressierungsmethode, die speziell zur Identifizierung des Standorts von Ressourcen im Netzwerk eingerichtet wurde. Die URL besteht im Allgemeinen aus 3 Teilen:

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

Beispiel: http://www.php.cn/ wobei sich http auf das Hypertext Transfer Protocol bezieht, blog.csdn.net der Domänenname des Webservers ist und /article/details/ der Pfad ist der Webseite, 54962975 Dies ist die entsprechende Webseitendatei.

TCP-Protokoll und -Port

Wenn das IP-Protokoll Daten sendet, treten während des Datenübertragungsprozesses verschiedene Probleme auf. Dies führt zu Paketverlust oder einer falschen Paketreihenfolge. Das TCP-Protokoll ermöglicht eine reibungslose Kommunikation von Prozessen auf zwei Hosts, ohne sich um Paketverluste oder Pakete außerhalb der Reihenfolge sorgen zu müssen. TCP verfolgt die Reihenfolge der Pakete und setzt sie in der richtigen Reihenfolge wieder zusammen, wenn sie fehlerhaft sind. Wenn das Paket verloren geht, fordert TCP den Quellhost auf, das Paket erneut zu senden.

Port

Das TCP-Protokoll ermöglicht eine reibungslose Kommunikation von Prozessen auf zwei Hosts, es gibt jedoch mehr als einen Prozess auf dem Host. TCP verwendet Ports, um Prozesse zu unterscheiden. Ein Port ist kein physisches Gerät, sondern eine logische Adresse, die zur Identifizierung eines Prozesses verwendet wird. Der Portbereich des Computers reicht von 0 bis 65535, wobei die Ports 0 bis 1023 im Allgemeinen einigen Diensten zugewiesen sind. Die Details lauten wie folgt:

服务 端口 协议
文件传输服务 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-Netzwerkprogrammierung ausführlich mit Bildern und Text erklärt

在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-Netzwerkprogrammierung ausführlich mit Bildern und Text erklärt
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-Netzwerkprogrammierung ausführlich mit Bildern und Text erklärt

总结

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

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


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn