JavaSE基础学习第十一天

今天上课困死了(因为看了凌晨3点的欧冠半决赛)就睡了4小时,很多都没听进去,还好今天学的不难,晚上熬夜把代码敲了一遍-_ -理解的差不多了,但是听说明天讲的内容很难,早点睡!!明天要好好听课

时间: 2022/4/27

Junit

概述
Junit是第三方的测试工具。
第三方:
不是java中存在的技术,也不是我们自己写的代码,是别人写好的,我们能够拿来用的。
测试:
以前我们写代码之后要写main()方法,junit可以代替main方法
使用步骤:
1.下载junit.jar包
2.把jar包导入idea中,在模块下面创建叫lib的文件夹,把jar包放进去
3.在jar包上右键点击add as library

常用注解
*@Test
测试方法。这个方法不能有参数也不能有返回值也不能加static
@Before
在测试方法之前执行的方法,每次执行测试方法都会先执行Before
@After
在测试方法之后执行的方法,每次执行测试方法之后都会执行After
@BeforeClass
在测试类执行之前最先执行,方法必须是一个静态方法
@AfterClass
在测试类执行最后执行,方法必须是一个静态方法

这块没啥好讲的就加一个注解@Test就行了,相当于main函数

public class Demo01 {
    @Test
    public void addTest(){
        //调用方法,测试方法
        int c = add(10, 20);
        System.out.println(c);

        //断言
        //如果两个数结果不同,程序就会报错提示
        Assert.assertEquals(30,c);
    }
    @Before
    public void aaa(){
        System.out.println("aaa");
    }
    @After
    public void bbb(){
        System.out.println("bbb");
    }
    //求两个数的和
    public int add(int a, int b){
        int c = a - b;
        return c;
    }
}

网络编程入门

软件结构
B/S(browser浏览器 server服务器 )
比如:
淘宝网,京东网,博学谷
优缺点:
不需要安装下载,只要有浏览器就可以

C/S(client客户端 server服务器)
比如:
英雄联盟,微信
优缺点:
功能强大,对网络的依赖少

网络编程三要素

IP地址:
在网络中的计算机都有一个唯一的IP地址
如何查看:在命名行窗口 —> ipconfig
ipv4:
以32位二进制组成的一组数字,可以组成40多亿个不重复的ip,目前已经被用完了,由4个字节组成

ipv6:
以128位二进制组成的一组数字,可以为全世界的每一粒沙子分配一个不重复的ip 由16个字节组成

端口号:
端口号是软件的唯一标识,

端口号取值范围:
0 ~ 65535之间, 0~1023的范围建议留给系统软件使用

传输协议
传输协议的作用是指定要以什么样的方式传输数据

TCP协议:
面向连接的协议,传输的双方必须要确认建立的连接才能发数据
比较安全
效率低
建立连接的三次握手

UDP协议:
面向无连接的协议,传输的双方不需要建立连接就可以发送数据
比较不安全
效率高
每次发送有大小限制,每次最多只能发64K的数据

InetAddress类

作用:
这个类代表的是java中的ip地址,可以用这个类获取网络中电脑的ip
java里面任何东西都是对象,ip就是一个对象叫InetAddress

  • static InetAddress getLocalHost()
    获得本地主机IP地址对象

  • static InetAddress getByName(String host)
    根据IP地址字符串或主机名获得对应的IP地址对象

  • String getHostName()
    获得主机名

  • String getHostAddress()
    获得IP地址字符串

TCP通信程序

TCP操作概述
TCP有两个类:
Socket 套接字,表示TCP里客户端类型
ServerSocket 表示TCP里服务器类型

TCP通信案例1

public class Demo01客户端 {

    public static void main(String[] args) throws IOException {

        //创建客户端对象 指定要连接的服务器
        Socket s = new Socket("192.168.23.9",8888);

        //要给服务端发送一句话
        String str = "你好呀";

        //获取输出流
        OutputStream os = s.getOutputStream();

        //输出数据 把字符串转成字节数组使用字节输出流输出
        os.write(str.getBytes());

        //关资源
        //os不是我们自己new的我就不关了,Socket虽然不是流但他也是资源  我们需要关闭Socket s
        s.close();
    }
}
public class Demo01服务端 {
    public static void main(String[] args) throws IOException {
        //创建对象 指定了自己的端口号
        ServerSocket ss = new ServerSocket(8888);

        //连接上客户端
        Socket s = ss.accept();

        //在服务端端获取输入输出流也用的是Socket  而不是ServerSocket
        //接受数据
        InputStream is = s.getInputStream();
        //创建字节数组
        byte[] bys = new byte[1024];

        //在这里我们也不能用循环,为啥不能用,下午再讲...
        int len = is.read(bys);

        //打印 把字节数组变成字符串输出
        String str = new String(bys);
        System.out.println(str);

        //关资源
        ss.close();
    }
}

模拟网络聊天

public class Demo02客户端 {

    public static void main(String[] args) throws IOException {

        //创建客户端对象 指定要连接的服务器
        Socket s = new Socket("192.168.23.9",8888);

        //一直说话 不结束
        while(true) {
            //发送信息
            Scanner sc = new Scanner(System.in);
            String str = sc.next();
            OutputStream os = s.getOutputStream();
            os.write(str.getBytes());

            //接受信息
            InputStream is = s.getInputStream();
            byte[] bys = new byte[1024];
            int len = is.read(bys);
            String str2 = new String(bys, 0, len);
            System.out.println(str2);


        }

        //s.close();
    }
}
public class Demo02服务端 {
    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);

            //发送信息
            Scanner sc = new Scanner(System.in);
            String str2 = sc.next();
            OutputStream os = s.getOutputStream();
            os.write(str2.getBytes());
        }
        //关资源
        //ss.close();
    }
}

图片上传案例
图片上传

public class Demo01客户端 {
    public static void main(String[] args) throws IOException {

        //创建客户端对象
        Socket s = new Socket("192.168.23.9",9999);

        //创建输入流
        InputStream is = new FileInputStream("C:\\Users\\Administrator\\Desktop\\美女.jpg");
        //获取输出流
        OutputStream os = s.getOutputStream();

        //用循环读写数据
        int len;
        byte[] bys = new byte[1024];
        while((len=is.read(bys)) != -1){
            os.write(bys,0,len);
        }

        //关闭资源
        is.close();
        s.close();
    }
}
public class Demo02服务端 {
    public static void main(String[] args) throws IOException {

        //创建对象
        ServerSocket ss = new ServerSocket(9999);

        //循环
        while(true) {
            //连接客户端
            Socket s = ss.accept();

            //获取输入流
            InputStream is = s.getInputStream();
            //创建输出流
            //在服务器中文件名称其实是生成的
            //有一个办法就是使用时间的毫秒值当做文件名
            long time = System.currentTimeMillis();
            OutputStream os = new FileOutputStream("day12\\美女"+time+".jpg");

            //循环读写
            int len;
            byte[] bys = new byte[1024];
            while ((len = is.read(bys)) != -1) {
                os.write(bys, 0, len);
            }

            //关闭资源
            os.close();
        }

        //服务器对象就不关了
        //ss.close();

    }
}

循环发送数据的问题:
客户端读取文件读取到末尾的时候,文件会返回一个-1,客户端收到-1就结束了循环。
客户端没有通知服务器结束,导致服务器一直在等待接收数据。

解决办法:
客户端发送数据以后,调用 shutDownOutput()结束输出流,这个方法会给服务端发送-1

//告诉服务端输出数据已经结束了
s.shutdownOutput();

模拟BS结构[扩展]

BS结构的模拟

//写出图片数据前先写这个:
os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());

//写出文字数据前先写这个:
os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes());
public class Demo03服务器 {
    public static void main(String[] args) throws IOException {


        //1.获取浏览器发过来的数据,知道浏览器要访问的是哪个文件
        //创建服务器对象
        ServerSocket ss = new ServerSocket(8000);
        //循环
        while (true) {

                //接受浏览器访问
                Socket s = ss.accept();

                //开启线程,这句话必须是在accept()的下面
                //因为我们要有接收到了浏览器的访问再去开线程
                Runnable r = new Runnable() {
                    @Override
                    public void run() {
                        try {
                            //让程序走慢一点看效率
                            Thread.sleep(2000);

                            //获取输入流
                            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(" ");
                            String name = arr[1];
                            System.out.println(name);

                            //获取输出流
                            OutputStream os = s.getOutputStream();

                            //2.要在资源文件夹里面找到对应的文件
                            File f = new File("day12/资源" + name);   //   "day12/资源/3.jpg"

                            if (f.exists()) {
                                //3.如果文件存在就把图片文件数据发给浏览器
                                os.write("HTTP/1.1 200 OK\r\nContent-Type:image/jpeg\r\n\r\n".getBytes());
                                //创建输入流
                                InputStream fis = new FileInputStream(f);
                                //循环读写
                                while ((len = fis.read(bys)) != -1) {
                                    os.write(bys, 0, len);
                                }

                                //关流
                                fis.close();

                            } else {
                                //4.如果文件不存在就发送文字不存在
                                os.write("HTTP/1.1 200 OK\r\nContent-Type:text/html;charset=UTF-8\r\n\r\n".getBytes());

                                os.write("404文件找不到~".getBytes());

                            }

                            //关闭客户端浏览器
                            s.close();

                        } catch (Exception e) {
                            //大家一定要写这句话,如果不写的话,出现了异常没有打印 我们就不知道出了什么异常
                            e.printStackTrace();
                        }
                    }
                };
                //开启
                Thread t = new Thread(r);
                t.start();

        }
    }
}

总结

今天的知识点不难,只要是把代码敲一遍就好了,代码不用死机,理解就行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皇家小黄

创作不易!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值