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();

浙公网安备 33010602011771号