• 网络通信2


    TestTCP3

    package com.aff.internet;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    import org.junit.Test;
    
    //TCP编程3:客户端给发文件给服务端,服务端保存到本地并返回 "你发送的图片已接收成功" 给客户端,并关闭相应的连接
    //如下的程序处理异常时要使用try-catch-finally,流等是稀有资源
    public class TestTCP3 {
        // 客户端
        @Test
        public void client() {
            Socket socket = null;
            OutputStream os = null;
            FileInputStream fis = null;
            InputStream is = null;
            try {
                // 1.创建一个socket的对象,通过构造器指明服务端的ip地址,以及接收程序的端口号
                socket = new Socket(InetAddress.getByName("192.168.3.10"), 9090);
                os = socket.getOutputStream();
                // 从本地获取一个文件发送给服务器
                fis = new FileInputStream(new File("1.jpg"));
                byte[] b = new byte[1024];
                int len;
                while ((len = fis.read(b)) != -1) {
                    // 把文件读进来然后写出去就是发送给服务端
                    os.write(b, 0, len);
                }
                socket.shutdownOutput();
                // 3.接收服务端发来的信息
                is = socket.getInputStream();
                byte[] b1 = new byte[1024];
                int len1;
                while ((len1 = is.read(b1)) != -1) {
                    String str = new String(b1, 0, len1);
                    System.out.println(str);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 关闭相应的流和Socket对象
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (os != null) {
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        // 服务端
        @Test
        public void server() {
            ServerSocket ss = null;
            Socket s = null;
            InputStream is = null;
            OutputStream os = null;
            FileOutputStream fos = null;
            try {
                // 1.创建一个ServerSocket的对象,通过构造器指明自身的端口号
                ss = new ServerSocket(9090);
                // 2.调用其accept()方法,返回一个Socket对象
                s = ss.accept();
                // 3.调用Socket对象的getInputStream()获取一个从客户端发送过来的输入流
                is = s.getInputStream();
                // 4.保存到本地
                fos = new FileOutputStream(new File("2.jpg"));
                byte[] b = new byte[1024];
                int len;
                while ((len = is.read(b)) != -1) {
                    fos.write(b, 0, len);
                }
                // 5发送接收成功信息反馈给客户端
                os = s.getOutputStream();
                os.write("你发送的图片已接收成功".getBytes());
                System.out.println("收到来自于" + s.getInetAddress().getHostAddress() + "的文件");
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                // 6.关闭相应的流以及Socket, ServerSocket对象
                if (os != null) {
                    try {
                        os.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (fos != null) {
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
    
                if (is != null) {
                    try {
                        is.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    } // 从后往前关闭,先关闭流
                }
                if (s != null) {
                    try {
                        s.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if (ss != null) {
                    try {
                        ss.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    UDP网络通信:

           ①类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
           ②UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,

              也不能确定什么时候可以抵达。
           ③DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号

               以及接收端的IP地址和端口号。
           ④UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接

    流 程:
                     ①DatagramSocket与DatagramPacket
                     ② 建立发送端,接收端
                     ③建立数据包
                     ④调用Socket的发送、接收方法
                     ⑤关闭Socket
    注意:发送端与接收端是两个独立的运行程序

    TestUDP

    package com.aff.internet;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    import org.junit.Test;
    
    public class TestUDP {
        // 发送端
        @Test
        public void send() {
            DatagramSocket ds = null;
            try {
                ds = new DatagramSocket();
                byte[] b = "我是要发送的数据".getBytes();
                // 创建一个数据报: 每一个数据报不能大于64k,都记录着数据信息,
                // 发送端的IP,端口号,以及要发送到的接收端的IP,端口号
                DatagramPacket pack = new DatagramPacket(b, 0, b.length, InetAddress.getByName("192.168.3.10"), 9090);
                ds.send(pack);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (ds != null) {
                    ds.close();
                }
            }
        }
    
        // 接收端
        @Test
        public void receive() {
            DatagramSocket ds = null;
            try {
                ds = new DatagramSocket(9090);
                byte[] b = new byte[1024];
                DatagramPacket pack = new DatagramPacket(b, 0, b.length);
                ds.receive(pack);
                String str = new String(pack.getData(), 0, pack.getLength());
                System.out.println(str);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (ds != null) {
                    ds.close();
                }
            }
        }
    }

    URL编程

              URL:统一资源定位符,一个URL的对象,对应互联网上的一个资源
              我们可以通过url的对象调用其相应的方法,将此资源读取(下载)

                URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。

                通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。

                浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。 

    1.URL的基本结构由5部分组成:

                <传输协议>://<主机名>:<端口号>/<文件名>
               例如: http://192.168.1.100:8080/helloworld/index.jsp


    2.为了表示URL,java.net 中实现了类 URL。

        我们可以通过下面的构造器来初始化一个 URL 对象:
                public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。

                                                           例如:URL url = new URL ("http://www. atguigu.com/");
                public URL(URL context, String spec):

                                                           通过基 URL 和相对 URL 构造一个 URL 对象。

                                                           例如:URL downloadUrl = new URL(url, “download.html")
                public URL(String protocol, String host, String file);

                                                            例如:new URL("http", "www.atguigu.com", “download. html");
                public URL(String protocol, String host, int port, String file);

                                                            例如: URL gamelan = new URL("http", "www.atguigu.com", 80, “download.html");

    3.  一个URL对象生成后,其属性是不能被改变的,

         但可以通过它给定的方法来获取这些属性:
                                public String getProtocol( ) 获取该URL的协议名
                                public String getHost( ) 获取该URL的主机名
                                public String getPort( ) 获取该URL的端口号
                                public String getPath( ) 获取该URL的文件路径
                                public String getFile( ) 获取该URL的文件名
                                public String getRef( ) 获取该URL在文件中的相对位置
                                public String getQuery( ) 获取该URL的查询名

    注意:类URL的构造方法都声明抛出非运行时异常,必须要对这一异常进行处理,

               通常是用 try-catch 语句进行捕获。

     

    URLConnection类

               通过URLConnection对象获取的输入流和输出流,即可以与现有的CGI程序进行交互。
                                public Object getContent( ) throws IOException
                                public int getContentLength( )
                                public String getContentType( )
                                public long getDate( )
                                public long getLastModified( )
                                public InputStream getInputStream( )throws IOException
                                public OutputSteram getOutputStream( )throws IOException

    小结:

                ①TCP协议用于实现面向连接的会话。

                ②Java 中有关网络方面的功能都定义在 java.net 程序包中。

                   Java 用 InetAddress 对象表示 IP 地址,

                  该对象里有两个字段:主机名(String) 和 IP 地址(int)。

               ③类 Socket 和 ServerSocket 实现了基于TCP协议的客户端-服务器程序。

                    Socket是客户端和服务器之间的一个连接,连接创建的细节被隐藏了。

                    这个连接提供了一个安全的数据传输通道,

                    这是因为 TCP 协议可以解决

                    数据在传送过程中的丢失、损坏、重复、乱序以及网络拥挤等问题,

                   它保证数据可靠的传送。

                ④类 URL 和 URLConnection 提供了最高级网络应用

                ⑤位于网络中的计算机具有唯一的IP地址,这样不同的主机可以互相区分。

    All that work will definitely pay off
  • 相关阅读:
    Ubuntu20.04安装Docker
    开启企业微信H5页面调试功能
    Python实现图遍历
    Linux命令整理
    BDP数据分析之高级计算
    PowerBI之DAX
    Dundas BI 简介
    tableau的高级计算
    k8s集群创建之后coredns一直处于pending状态
    Gradle打包工具入门
  • 原文地址:https://www.cnblogs.com/afangfang/p/12629974.html
Copyright © 2020-2023  润新知