网络编程
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课。非常感谢!