Java SE 学习笔记-Day 08

1 IP地址
IP地址是唯一的,是一台主机的标识。

UDP和TCP 是运输层协议,IP是网络层协议

127.0.0.1 :本机,locahost

IP地址的分类:

IPV4 / IPV6

IPV4 127.0.0.1, 4个字节组成。2011年就用完了。

IPV6 128位,冒号分隔开8个16进制表示的无符号数(每个是4个十六进制数,16位二进制数构成),表示方式X:X:X:X:X:X:X:X,若有连续的0,则会用::代替,如::X:X,表示0000:0000:0000:0000:0000:0000:X:X。

为了实现IPv4-IPv6互通,IPv4地址会嵌入IPv6地址中,此时地址常表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,对于连续0的缩写同样适用。

公网(互联网) - 私网(局域网)

ABCD类地址

192.168.xx.xx 专门给组织内部使用的

域名:由于ip地址很难记忆,所以产生了域名。

在Java中,ip地址用InetAddress类表示,这个类需要用静态方法得到实例,不能用new。

// 获取一个IP地址
InetAddress ip1 = InetAddress.getByName("www.baidu.com");
System.out.println(ip1);
InetAddress ip2 = InetAddress.getByName("localhost");
System.out.println(ip2);
image-20210316223008742

2 端口
端口表示计算机上的一个程序的进程,不同进程有不同的端口号。

TCP, UDP 两个协议端口号都是从0~65535

端口分类

公有端口0~1023

HTTP: 80

HTTPS:443

FTP:21

Telent:23

SSH:22

用户端口:1024~49151,分配用户或程序

Tomcat:8080

MySQL:3306

动态、私有:49152~65535

Java中的端口用InetSocketAddress类表示

InetSocketAddress port1 = new InetSocketAddress("localhost",8080);
System.out.println(port1);
3 网络通信协议
TCP/IP协议簇

其中重要的协议

TCP:用户传输协议,可以看作打电话

需要连接,可靠,稳定

三次握手,四次挥手

客户端和服务端有明显区别

传输完成,释放连接,效率低

UDP:用户数据报协议,可以看作发短信

不需要连接,不稳定,不可靠

客户端、服务端没有明确的界限

IP:网络互连

4 TCP
客户端向服务端发送消息
Java中使用ServerSocket类,获得一个地址(含端口)

客户端

连接服务器,Socket 连接到服务器的端口号

Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), port);

OutputStream与Socket关联输出

OutputStream os = socket.getOutputStream();
服务端

建立地址,通过ServerSocket制定一个端口。

等待客户端连接,连接成功之后会返回一个socket。

// 阻塞式监听,当未建立连接,将一直等待
socket = serverSocket.accept();
与InputStream关联起来

InputStream is = socket.getInputStream();
发送文件
发送文件就是从客户端本地的一个文件读取,之后发送给服务端,服务端保存一个文件到本地即可。

通过FileInputStream和FileOutputStream来读写文件

初识Tomcat
是一个已经写好了的服务端程序

服务端

自定义 S

Tomcat 服务器

客户端

自定义 C

浏览器 S

5 UDP
不需要通过socket建立连接,只要有这个socket即可,直接通过DatagramSocket.send发送一个数据包DatagramPacket即可

发送端

// 1.建立发送socket
DatagramSocket socket = new DatagramSocket();
// 2.创建数据报
DatagramPacket packet = new DatagramPacket("Hello".getBytes(),0,"Hello".getBytes().length,InetAddress.getByName("127.0.0.1"),9090);
// 3.发送包
socket.send(packet);
// 4.关闭socket
socket.close();
接收端

// 1.创建接收端口
DatagramSocket socket = new DatagramSocket(9090);
// 2.创建接收数据包
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
// 3.接收文件,阻塞式的
socket.receive(packet);
// 4.打印消息
System.out.println(packet.getAddress().getHostAddress());
System.out.println(new String( packet.getData() ));
// 5.关闭接收端
socket.close();
将以上改造成两个类,分别放进线程类里面,再通过都执行这两个线程的两个类,就可以实现边发送边接受的聊天功能。

6 URL
可以通过URL类对一个url字符串进行操作。URL配合HttpURLConnection即可访问网络上的资源,再配合文件流,即可下载。

协议://ip地址(域名):端口/项目名/资源
https://www.baidu.com:443

URL url = new URL("https://goss4.cfp.cn/creative/vcg/800/version23/VCG21ecff589bd.jpg");
// 建立连接,不用new一个对象,只需要通过url的方法获得实例
HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection();

InputStream is = urlConnection.getInputStream();

FileOutputStream fos = new FileOutputStream("downfile.jpg");

byte [] buffer = new byte[1024];
int len;
while((len = is.read(buffer)) != -1){
fos.write(buffer,0,len);
}

fos.close();
is.close();

posted @ 2021-03-27 10:23  蓬飞  阅读(59)  评论(0)    收藏  举报