• JavaSE Day16


    本节内容

      1.ISO模型

     2.七层模型与协议的对应关系

     3.IP地址和端口号

     4.TCP和UDP

     5.URL访问网上资源

     6.InetAddress

     7.Socket通信基于TCP

     8.基于URDP网络通信

    一、ISO模型

    二、七层模型与协议的对应关系

            网络层   ------------     IP(网络之间的互联协议)

           传输层   ------------     TCP(传输控制协议)、UDP(用户数据报协议)

           应用层   ------------     Telnet(Internet远程登录服务的标准协议和主要方式)、FTP(文本传输协议)、HTTP(超文本传送协议)

    三、IP地址和端口号

    1、ip地址用于唯一标示网络中的一个通信实体,这个通信实体可以是一台主机,可以是一台打印机,或者是路由器的某一个端口。而在基于IP协议网络中传输的数据包,必须使用IP      地址来进行标示。ip地址就像写一封信,必须指定收件人的地址一样。每个被传输的数据包中都包括了一个源IP和目标IP。

    2、ip地址唯一标示了通信实体,但是一个通信实体可以有多个通信程序同时提供网络服务。这个时候就要通过端口来区分开具体的通信程序。一个通信实体上不能有两个通信程序        使用同一个端口号。

    四、TCP和UDP

    1、TCP是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。它能够提供两台计算机之间的可靠的数据流,HTTP、FTP、Telnet等应      用都需要这种可靠的通信通道。

    2、UDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传送目的地,至于能够达到目的地,达到目的地的时     间以及内容的正确性都是不能保证的。

    既然有了保证可靠传输的TCP协议,为什么还要非可靠传输的UDP协议呢?原因有两个:

    1、可靠的传输是要付出代价的,对数据内容的正确性的检验必然会占用计算机处理时间和网络带宽。因此TCP的传输效率不如UDP高。

    2、许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求视频音频数据绝对正确,只要能够连贯就可以了。所以在这些场景下,使用UDP更合适些。

    五、URL访问网上资源

    1、URL对象代表统一资源定位器,是指向互联网“资源”的指针。它是用协议名、主机、端口和资源组成,即满足如下格式:

         protocol://host:port/resourceName

         https://www.cnblogs.com/dongguacai/p/5747397.html

    2、通过URL对象的一些方法可以访问该URL对应的资源:

         String getFile():获取该URL的资源名

         String getHost():获取主机名

         String getPath():获取路径部分

         int   getPort():获取端口号

    package com.xk;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    
    /*
     *作者:吴志龙
     *日期:2018年8月6日  
    */
    public class GETURl {
        
        
        public static void main(String[] args) {
            
            try {
                URL  url = new URL("http://www.cnblogs.com/wuzhilong/default.html?page=2");
                String file = url.getFile();
                System.out.println(file);
                String host = url.getHost();
                System.out.println(host);
                
                int port = url.getPort();
                 System.out.println(port);
                 String protocol = url.getProtocol();
                 System.out.println(protocol);
                 
            
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            
            
            
            
        }
    
    }

    上面展示了URL对象的常用方法,下面来看看URL最重要的两个方法:openConnection()、openStream()

    package com.xk;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLConnection;
    
    /*
     *作者:吴志龙
     *日期:2018年8月6日  
    */
    public class GETURl {
        
        
        public static void main(String[] args) {
            
            try {
                URL url = new URL("http://www.cnblogs.com/wuzhilong/default.html?page=2");
                URLConnection connection = url.openConnection();
            
                InputStream is = connection.getInputStream();
                OutputStream os = new FileOutputStream("E:/data.txt");
                 byte[] buffer = new byte[1024];
                 int len=0;
                 
                 while ((len=is.read(buffer))!=-1) {
                     os.write(buffer, 0, len);
                    
                }
                 os.close();
                 is.close();
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            
        }
    
    }
    View Code

    openConnection()该方法用于返回URLConnection对象,表示到URL所引用的远程连接

    getInputStream方法,用于返回从此打开的连接读取的输入流。

    六、InetAddress

    JAVA提供了InetAddress类来代表IP地址。

    package com.xk;
    

    import java.net.InetAddress; import java.net.UnknownHostException; /* *作者:吴志龙 *日期:2018年8月6日 */ public class GetInetAddress { public static void main(String[] args) { try { InetAddress address = InetAddress.getLocalHost(); System.out.println(address); address = InetAddress.getByName("www.cnblogs.com"); System.out.println(address); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
    LAPTOP-9D6KM7QI/192.168.168.101
    www.cnblogs.com/101.37.113.127
    

    七、基于Socket的TCP通信

    Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点。

    使用Socket进行网络通信的过程

    服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接请求

    客户端:客户端程序根据你服务器所在的主机名和端口号发出连接请求。

    两者之间的通信是通过Socket完成的

     主机A的应用程序和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket必须由底层的TCP/IP协议来建立TCP连接。建立TCP连接需要底层IP协议来寻址网络中的主机。IP地址只能帮助我们找到目标主机,但是一个主机上面有多个应用程序,如何才能找到我们需要的应用程序,这个时候就可以通过端口号来指定了

    双向聊天:

    package com.xk;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.Scanner;
    
    /*
     *作者:吴志龙
     *日期:2018年8月6日  
    */
    /**
     * 客户端
     * @author 27783
     *
     */
    public class Client {
        
        
        public static void main(String[] args) {
            Socket socket=null;
            InputStream in=null;
            OutputStream out=null;
            Scanner input = new Scanner(System.in);
            try {
                  socket =new Socket("127.0.0.1", 9999);
                   in = socket.getInputStream();
                   out = socket.getOutputStream();
                 
                 while (true) {
                    System.out.println("客户端说:"); 
                    String str=input.nextLine(); 
                    
                    out.write(str.getBytes());
                    
                    byte[] b = new byte[1024];
                    int len =in.read(b);
                    String str1 = new String(b,0,len);
                    System.out.println("服务器说:"+str1);
                    
                }
                 
                 
                  
                  
            
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                try {
                    socket.close();
                    out.close();
                    in.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            
            
        }
    
    }
    View Code
    package com.xk;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    
    /*
     *作者:吴志龙
     *日期:2018年8月6日  
    */
    /**
     * 服务端
     * 
     * @author 27783
     *
     */
    public class Server {
    
        public static void main(String[] args) {
            // 创建一个ServerSocket,用于监听客户端Socket连接请求
            ServerSocket serverSocket = null;
            Socket socket=null;
              InputStream in = null;
              OutputStream out =null;
              Scanner input = new Scanner(System.in);
            try {
                serverSocket = new ServerSocket(9999);
                // 侦听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。
                  socket = serverSocket.accept();
                  in = socket.getInputStream(); 
                  out = socket.getOutputStream();
                  
                  while (true) {
                     byte[] b = new byte[1024];
                      
                     int len= in.read(b); 
                     String str = new String(b,0,len); 
                     System.out.println("客户端说:"+str);
                     
                     System.out.println("服务器说:");
                     String str1 = input.nextLine();
                     
                     out.write(str1.getBytes());
                     
                     
                      
                    
                }
    
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }finally {
                try {
                    out.close();
                    in.close();
                    socket.close();
                    serverSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
                
            }
    
        }
    
    }
    View Code

    八、基于UDP的网络通信

    UDP协议的主要作用就是完成网络数据流和数据报之间的转换-----在信息的发送端,UDP协议将网络数据流封装到数据报,然后将数据报发送出去;在信息的接收端,UDP协议将数据报转换成实际数据报内容。

    1、首先在UDP网络编程中没有服务器端和客户端这种说法,两个socket之间没有虚拟链路,只是接收和发送数据报文而已。

    2、这里面有两个重要的类:DatagramSocket 和DatagramPacket。前者是用来发送和接收数据包的套接字,后者表示数据包,每条报文仅根据该包中的包含的信息从一台机器        路由到另一台机器。

    3、DatagramSocket 的两个构造函数:

         DatagramSocket():构造数据报套接字并将其绑定到本地主机上任何可用的端口。

         DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。

    4、DatagramPacket:创建的时候分为接收和发送两种

          DatagramPacket(byte[] buf, int length):用来接收长度为 length 的数据包。

          DatagramPacket(byte[] buf, int length, InetAddress address, int port):用来将长度

    为 length 的包发送到指定主机上的指定端口号。

    package com.xk;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    /*
     *作者:吴志龙
     *日期:2018年8月6日  
    */
    /**
     * UDP发送数据
     * 
     * @author 27783
     *
     */
    public class UDPSend {
    
        public static void main(String[] args) {
    
            // 创建套接字
            DatagramSocket datagramSocket = null;
            DatagramPacket datagramPacket = null;
            try {
                datagramSocket = new DatagramSocket();
                InetAddress addr = InetAddress.getByName("127.0.0.1");
                String str = "你好啊";
                byte[] recvBuf = str.getBytes();
                datagramPacket = new DatagramPacket(recvBuf, recvBuf.length, addr, 10000);
                datagramSocket.send(datagramPacket);// 发送数据
                datagramSocket.close();
            } catch (SocketException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
    }
    View Code
    package com.xk;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    
    /*
     *作者:吴志龙
     *日期:2018年8月6日  
    */
    /**
     * UDP 接收数据
     * 
     * @author 27783
     *
     */
    public class UDPOver {
        public static void main(String[] args) {
            // 创建套接字
            DatagramSocket socket = null;
            DatagramPacket recvPacket = null;
            try {
                socket = new DatagramSocket(10000);
                byte[] recvBuf = new byte[1024];
                recvPacket = new DatagramPacket(recvBuf, recvBuf.length);
                socket.receive(recvPacket);// 接收数据包
                String str = new String(recvPacket.getData(), 0, recvPacket.getLength());
                System.out.println("客户端说:" + str);
                socket.close();
    
            } catch (SocketException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
        }
    
    }
    View Code
  • 相关阅读:
    一步步介绍如何给项目添加单元测试
    日期格式化在移动端的问题
    使用VW时,图片的问题
    转:vw适配中使用伪类选择器遇到的问题
    ES6模块的import和export用法总结
    转:如何在Vue项目中使用vw实现移动端适配
    PhpStrom添加调试功能
    小程序商城笔记
    使用TortoiseGit对android studio工程进行代码版本控制
    Android Studio 常见异常解决办法
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9430677.html
Copyright © 2020-2023  润新知