网络概述

分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规模宏大、
功能强大的网络系统,从而使众多的计算机可以方便地互相传递信息,共享硬件、软件、数据信息等资源。

网络通信要素

1. IP & 端口号

1.1 IP

网络中主机的唯一标识,通过Ip可以定位到主机位置

1.2 端口号

用于标识当前主机上运行的进程

2.网络协议

2.1 TCP

  • 使用之前需要建立TCP连接,形成传输通道
  • 传输前采用“三次握手”方式,点对点通信,可靠性高
  • 可进行大数据量传输
  • 传输完毕要释放连接

2.2 UDP

  • 不需要建立连接
  • 发送数据是以报文形式,将数据封装成数据包
  • 发送数据时不需要去人对方是否整备好,以及接收到后也不确认,不可靠
  • 发送完不需要释放资源,开销小,效率快

java中的网络

1
2
3
4
InetAddress address1 = InetAddress.getByName("192.168.2.1");
System.out.println(address1.getHostAddress()); // 获取ip
System.out.println(address1.getHostName()); // 获取域名

1. 服务端

1
2
3
4
5
6
7
8
9
10
// 1. 创建服务端ServerSocket,指定当前服务程序的端口号,IP默认为服务端所在主机的IP
server = new ServerSocket(8888);

// 2. 等待客户端的连接
// accept():该方法用于监听客户端的连接,若有有客户端连接就会将客户端对应的Socket返回
// 若没有客户端连接,那么程序就会在此处阻塞等待
System.out.println("等待连接....");
Socket client = server.accept();

InetAddress clientAddress = client.getInetAddress(); // 获取客户端IP

2. 客户端

1
2
// 1.创建客户端的Socket,传入服务端IP和端口号,一创建就会发起连接
socket = new Socket("192.168.10.146", 8888);

URL编程

1. UDP

UDP编程

  • 1.DatagramSocket:UDP对应的socket
  • 2.DatagramPacket:UDP中的数据报包类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
* 发送者
*/
@Test
public void sender() throws IOException {
// 1. 创建DatagramSocket对象
InetAddress ip = InetAddress.getByName("192.168.10.182");
DatagramSocket ds = new DatagramSocket();

// 2.创建数据报包对象
String str = "hello";
byte[] buf = str.getBytes();
DatagramPacket p = new DatagramPacket(buf, 0, buf.length, ip, 8888);

// 3. 发送
ds.send(p);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*
* 接收者
*/
@Test
public void receiver() throws IOException {
// 1. 创建DatagramSocket对象
DatagramSocket ds = new DatagramSocket(8888);

// 2. 创建数据报包对象
byte[] buf = new byte[100]; // 真正用来保存数据的
DatagramPacket p = new DatagramPacket(buf, 0, buf.length);

// 3.接收
System.out.println("等待接收");
ds.receive(p);
System.out.println("接收完成");

// getLength():可以获取此次接收到的字节数
System.out.println(new String(buf, 0, p.getLength()));
}

2. URL

URL:统一资源定位符

示例:http://192.168.10.162:9000/UrlTest/img/girl.jpg?name=

​ ① ② ③ ④ ⑤

  • ①:网络协议
  • ②:IP或域名
  • ③:端口号
  • ④:具体的资源路径
  • ⑤:查询
1
2
3
4
5
6
7
8
9
10
11
12
13
// 创建URL对象,参数就是需要访问的具体地址
URL url = new URL("https://cdn.sensen.fun/github/img/default_bg.png");

System.out.println(url.getHost()); // 获取ip或域名
System.out.println(url.getPort()); // 获取端口
System.out.println(url.getPath()); // 获取资源路径
System.out.println(url.getQuery()); // 获取查询

// 打开连接,获取连接对象
URLConnection connection = url.openConnection();

// 从连接对象获取输入流
InputStream in = connection.getInputStream();