自学内容网 自学内容网

Java学习笔记(24)

网络编程

Java.net

软件架构

CS  BS

三要素

IP 端口号 协议

IP

IPv4

没有负数,每组范围是0~255

数量不到43亿个

IPv6

解决IP不够用

128位,分成8组

现在怎么解决IP不够用的问题?

利用局域网IP解决

共享一个公网IP,再有路由器给每个电脑分配局域网IP

127.0.0.1

不一样

127.0.0.1是对自己电脑发送信息的,经过网卡时就能识别出,给自己发信息,不经过路由器

192.168.1.100发送消息需要经过路由器再发送回给自己

可能换一个地方电脑IP就不一样

可以ping IP或者是网址

InetAddress.getByName:获取电脑IP

Host输入主机名,输出主机名和ip地址

端口号

协议

UDP

DatagramSocket

DatagramPacket

无限接收:设置死循环

从receive开始,到sout

UDP的三种通信方式

单播 组播 广播

组播

MulticastSocket

组播地址:一个地址代表一组,里面就有很多个电脑

只需要把接收端添加到组播地址中

TCP通信

用IO流通信

Socket

注意只能发英文,不能发中文?

因为在读取的时候,是一个字节一个字节读的,中文是3个字节来表示一个中文的

所以读出来是乱码

可以将字节输入流改成字符输入流(转换流:将字节改成字符流)

还可以转成缓冲流,提高效率

TCP代码细节

先运行服务端,再运行发送端

建立通道(三次握手),IO流是从通道里获取的,不是我们自己创建出来的,

所以流不需要关闭,只需要关闭socket对象就断开连接(四次挥手)

三次握手

四次挥手

服务端还要发多一个确认取消消息

服务端回写消息

客户端接受回写消息

注意要先写出一个结束标记shutdown表示结束输出

客户端

服务端

随机生成不重复的文件名

UUID.randomUUID():返回的是UUID对象

去掉中间横杠

循环的弊端:只能一个一个的去上传,要等上一个上传完,才能下一个上传

再把读取数据保存文件的代码写到run方法中

package com.itheima.a11test5;

import java.io.*;
import java.net.Socket;
import java.util.UUID;

public class MyRunnable implements Runnable{

    Socket socket;

    public MyRunnable(Socket socket){
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //3.读取数据并保存到本地文件中
            BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
            String name = UUID.randomUUID().toString().replace("-", "");
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mysocketnet\\serverdir\\" + name + ".jpg"));
            int len;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            bos.close();
            //4.回写数据
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("上传成功");
            bw.newLine();
            bw.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //5.释放资源
           if(socket != null){
               try {
                   socket.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }
        }
    }
}

自定义线程池

直接在浏览器中输入IP地址:端口

反射

从类里面访问成员变量,成员方法和构造方法

获取class对象

通过对象获取成员变量,成员方法和构造方法

获取构造方法

有declared就能获取到所有的,包括私有的,没有就只能获取公共的

获取单个构造方法,参数里是要写构造方法里的参数的class对象

Getmodifiers

获取构造方法的权限修饰符,如public,private

Getparameters

获取构造方法的所有参数

暴力反射:如果构造方法是private,使用setAccessible(true)还是可以创建这个类的对象

newInstance:创建对象

获取成员变量

获取单个,参数里面写变量名

获取变量的值 反射的参数.get(对象)

获取成员方法

Getmethods可以获取到父类的公共的方法(object里面的方法)

获取单一方法,传入方法名,和方法的参数的class对象

运行方法 invoke

如果方法有返回值,invoke就有返回值

反射总结

动态代理

不改变源码

接口里面包括所有想要代理的抽象方法

接口

大明星对象

代理对象

newProxyInstance

第三个参数传递的是InvocationHandler接口的实现类对象

这个重写的Invoke方法里写的就是代理要干的事情

最后这里return的invoke方法就是用反射,调用了bigstar的method(唱歌sing)方法,返回值是“谢谢”。

测试类

这样就没有改变大明星的代码,为唱歌,跳舞的方法添加了新东西

以上Java学习笔记来自B站黑马程序员Java课。非常感谢!


原文地址:https://blog.csdn.net/weixin_48589728/article/details/137288860

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!