学习java第21天

2020/8/22

1.Junit

  • Junit叫单元测试,用来对方法进行测试,可以替代之前的main()方法。

  • Junit也是一个第三方工具,也需要导入jar包,需要版本统一,我们用的是4.XXX版本的unit。

1.概述

  • 基本演示

    import org.junit.Test;
    
    public class Test01 {
        @Test
        public void addTest(){
            System.out.println(add(3,4));
        }
    
        public int add(int a,int b){
            return a+b;
        }
    }
    

2.常用注解

  • 注解

    @Test
    	单元测试,专门对方法进行测试,单元测试的方法不能有参数和返回值
    @before
         被修饰的方法会在测试方法之前执行    
    @after
         被修饰的方法会在测试方法之后执行
    @BeforeClass
          必须是静态方法,在所有方法执行前执行  
    @AfterClass
          必须是静态方法,在所有方法之后执行
    
  • 代码演示

    import org.junit.*;
    
    public class Test02 {
        //单元测试,专门对方法进行测试
        @Test
        public void addTest() {
            int add = add(3, 4);
            System.out.println(add);
        }
    
        @Test
        public void addTest2() {
            int add = add(3, 5);
            System.out.println(add);
        }
    
        @Before
        public void method1() {
            System.out.println(1);
        }
    
        @After
        public void method2() {
            System.out.println(2);
        }
    
        @BeforeClass
        public static void method3() {
            System.out.println(3);
        }
    
        @AfterClass
        public static void method4() {
            System.out.println(4);
        }
    
        //求两个整数的和
        public int add(int a, int b) {
            int c = a + b;
            return c;
        }
    }
    

在这里插入图片描述

3.断言

  • 作用

    • Junit只能检查异常和错误,不能检查逻辑错误,此时可以使用断言来判断。
    • 我们给定一个期望值,和程序的结果进行比较判断,如果期望值和结果一样就会出现绿色,如果不一样就出现红色。
  • 代码演示

    import org.junit.Assert;
    import org.junit.Test;
    
    public class Test03 {
        @Test
         public void test(){
             Assert.assertEquals(7,sub(11,4));
         }
         public int sub(int a,int b){
             return a-b;
         }
    }
    

在这里插入图片描述

2.网络编程入门

1.软件结构

  • B/S结构
    • 浏览器/服务器,比如淘宝、京东、世纪佳缘、qq空间
    • 优缺点
      • 优点:不用下载、开发和维护方便
      • 缺点:功能有局限,对网络要求大
  • C/S结构
    • 客户端/服务器,比如QQ、英雄联盟、共屏软件
    • 优缺点
      • 优点:功能比较细致,对网络要求低
      • 缺点:开发和维护复杂,占用空间

2.网络编程三要素

  • IP地址:

    • IP地址是网络上面设备的唯一标识

      查看ip:cmd里面输入ipconfig
      - ipv4	是一个32位的二进制数,通常被分为4个字节
      - ipv6  采用128位地址长度,每16个字节一组,分为8位十六进制数
      
      在代码中可以表示主机ip:127.0.0.1	localhost
      
  • 端口号

    • 端口号是软件的唯一标识,0-65535
  • 建议大家不要用0-1023这个范围内的端口号,通常被系统所占用

  • 协议

    • 协议是网络上数据传输的规则
    • TCP协议
      • 面向连接,效率低,数据安全
      • 通过三次握手保证连接
    • UDP协议
      • 面向无连接,效率高,数据不安全,数据有大小的限制,在64k以内

3.InetAddress类

  • 用来表示设备的IP

  • 方法介绍

    InetAddress类成员方法        
                   * static InetAddress getLocalHost() 
        									获得本地主机IP地址对象        
                   * static InetAddress getByName(String host) 
        									根据IP地址字符串或主机名获得对应的IP地址对象
    
                   * String getHostName()     获得主机名        
                   * String getHostAddress() 获得IP地址字符串
    
  • 代码演示

    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    public class Test04 {
        public static void main(String[] args) throws UnknownHostException {
            //获得本机的ip地址对象
            InetAddress ip1 = InetAddress.getLocalHost();
            System.out.println(ip1);
    
            //获得网络上的IP对象
            InetAddress ip2 = InetAddress.getByName("192.168.14.35");
            System.out.println(ip2);
            //获得主机名
            String name = ip2.getHostName();
            System.out.println(name);
            //获得ip地址
            String address = ip2.getHostAddress();
            System.out.println(address);
        }
    }
    

在这里插入图片描述

3.TCP通信

1.TCP操作概述

  • 在java中,类叫做Socket底层是使用TCP协议所实现的,Socket也叫做套接字,可以实现网络中的数据交互。

2.TCP通信案例一

  • 客户端发送数据

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class Test客户端 {
        public static void main(String[] args) throws IOException {
            Socket s = new Socket("192.168.227.1", 8888);
            OutputStream os = s.getOutputStream();
            os.write("你好,今晚一起看电影吗?".getBytes());
            os.close();
            s.close();
        }
    }
    
  • 服务器接收数据

    import java.io.IOException;
    import java.io.InputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Test服务器 {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(8888);
            Socket s = ss.accept();
            InputStream is = s.getInputStream();
            byte[] bys = new byte[1024];
            int len = is.read(bys);
            String str = new String(bys,0,len);
            System.out.println(str);
    
            is.close();
            s.close();
            //ss.close();
        }
    }
    

3.TCP模拟聊天

  • 客户端代码

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class Test客户端 {
        public static void main(String[] args) throws IOException {
            Socket s = new Socket("192.168.227.1", 8888);
            while (true) {
                OutputStream os = s.getOutputStream();
                os.write(new Scanner(System.in).nextLine().getBytes());
    
    
                InputStream is = s.getInputStream();
                byte[] bys = new byte[1024];
                int len = is.read(bys);//阻塞方法,客户端不发数据的话就会一直等着
                String str = new String(bys, 0, len);
                System.out.println(str);
            }
            //is.close();
            //os.close();
            //s.close();
        }
    }
    
  • 服务器代码

    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.Scanner;
    
    public class Test服务器 {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(8888);
            Socket s = ss.accept();//阻塞方法,连接不到客户端的话会一直等着
            while (true) {
                InputStream is = s.getInputStream();
                byte[] bys = new byte[1024];
                int len = is.read(bys);//阻塞方法,客户端不发数据的话就会一直等着
                String str = new String(bys, 0, len);
                System.out.println(str);
    
                OutputStream os = s.getOutputStream();
                os.write(new Scanner(System.in).nextLine().getBytes());
            }
            //is.close();
            //s.close();
            //ss.close();
        }
    }
    

在这里插入图片描述

4.文件上传案例

  • 图解

在这里插入图片描述

  • 代码实现

    • 客户端发送文件

      import java.io.FileInputStream;
      import java.io.IOException;
      import java.io.OutputStream;
      import java.net.Socket;
      
      public class Test客户端 {
          public static void main(String[] args) throws IOException {
              Socket s = new Socket("192.168.14.35", 8888);
              OutputStream os = s.getOutputStream();
      
              FileInputStream fis = new FileInputStream("day12\\资源\\1.jpg");
              byte[] bys = new byte[1024];
              int len;
              while((len = fis.read(bys)) !=-1){
                  os.write(bys,0,len);
              }
              os.close();
              fis.close();
              s.close();
          }
      }
      
    • 服务器接受文件

      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      public class Test服务器 {
          public static void main(String[] args) throws IOException {
              ServerSocket ss = new ServerSocket(8888);
              while (true) {
              Socket s = ss.accept();
                  InputStream is = s.getInputStream();
                  FileOutputStream fos = new FileOutputStream("D:\\图片" + System.currentTimeMillis() + ".jpg");
                  byte[] bys = new byte[1024];
                  int len;
                  while ((len = is.read(bys)) != -1) {
                      fos.write(bys, 0, len);
                  }
      
                  fos.close();
                  is.close();
                  s.close();
              }
          }
      }
      
  • 循环发送数据的问题

    在客户端从文件读取到-1之后,客户端循环就结束了,没有给服务器发送-1,导致服务器循环无法结束。在客户端发送数据结束之后调用 s.shutdownOutput(),来通知服务器输出结束了。

    //客户端
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.Socket;
    
    public class Test客户端 {
        public static void main(String[] args) throws IOException {
            Socket s = new Socket("192.168.14.35", 8888);
            OutputStream os = s.getOutputStream();
    
            FileInputStream fis = new FileInputStream("day12\\资源\\1.jpg");
            byte[] bys = new byte[1024];
            int len;
            while((len = fis.read(bys)) !=-1){
                os.write(bys,0,len);
            }
            s.shutdownOutput();//作用就是输出-1
    
            InputStream is = s.getInputStream();
            while ((len=is.read(bys))!=-1) {
                String str = new String(bys, 0, len);
                System.out.println(str);
            }
            is.close();
            os.close();
            fis.close();
            s.close();
        }
    }
    //服务器
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Test服务器 {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(8888);
            while (true) {
            Socket s = ss.accept();
                InputStream is = s.getInputStream();
                FileOutputStream fos = new FileOutputStream("D:\\图片" + System.currentTimeMillis() + ".jpg");
                byte[] bys = new byte[1024];
                int len;
                while ((len = is.read(bys)) != -1) {
                    fos.write(bys, 0, len);
                }
    
                OutputStream os = s.getOutputStream();
                os.write("上传成功".getBytes());
    
                os.close();
                fos.close();
                is.close();
                s.close();
            }
        }
    }
    

在这里插入图片描述

4.模拟B/S服务器

  • B/S结构的模式图解

在这里插入图片描述

  • B/S模式是web的内容,以下是服务器需要给浏览器发送的相影信息,在正式传输数据前,要先写这个。

    发送图片:
    	"HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n"
    发送文字时:
    	"HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n"
    
  • 服务器代码

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Test服务器 {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(8888);
            while (true) {
                Socket s = ss.accept();
                InputStream is = s.getInputStream();
                byte[] bys = new byte[1024];
                int len = is.read(bys);
                String str = new String(bys, 0, len);
                String[] arr = str.split(" ");
                File f = new File("day12/资源" + arr[1]);
                System.out.println(str);
    
                if (f.exists()) {
                    OutputStream os = s.getOutputStream();
                    FileInputStream fis = new FileInputStream(f);
                    os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());
                    while ((len = fis.read(bys)) != -1) {
                        os.write(bys, 0, len);
                    }
                    os.close();
                    fis.close();
                } else {
                    OutputStream os = s.getOutputStream();
                    os.write("HTTP/1.1 200 OK\\r\\nContent-Type:text/html;charset=UTF-8\\r\\n\\r\\n".getBytes());
                    os.write("404·你访问的资源不在".getBytes());
                    os.close();
                }
                s.close();
            }
        }
    }
    
  • 多线程写法

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Test多线程写法 {
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(8888);
            while (true){
                Socket s = ss.accept();
                new Thread(()->{
                    try{
                        InputStream is = s.getInputStream();
                        byte[] bys = new byte[1024];
                        int len = is.read(bys);
                        String str = new String(bys, 0, len);
                        String[] arr = str.split(" ");
                        File f = new File("day12/资源" + arr[1]);
                        //System.out.println(str);
    
                        if (f.exists()) {
                            OutputStream os = s.getOutputStream();
                            FileInputStream fis = new FileInputStream(f);
                            os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());
                            while ((len = fis.read(bys)) != -1) {
                                os.write(bys, 0, len);
                            }
                            fis.close();
                            os.close();
                        } else {
                            OutputStream os = s.getOutputStream();
                            os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes());
                            os.write("404~你访问的资源不在".getBytes());
                            os.close();
                        }
                        s.close();
                    }catch (Exception e){
    
                    }
                }).start();
            }
        }
    }	
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值