十一, 网络编程
1. 什么是网络编程
-
网络编程: 在网络通信协议下, 计算机和计算机之间通过网络进行数据的传输
-
Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序
-
常见的软件架构:
- C/S: Client/Server客户端/服务器, 在用户本地需要下载并安装客户端程序, 在远程有一个服务器端程序
- B/S: Browser/Server浏览器/服务器, 只需要一个浏览器, 用户通过不同的网址, 客户访问不同的服务器
-
B/S架构的优缺点:
- 优点: (1) 不需要开发客户端, 只需要页面+服务端 (2) 用户不需要下载, 打开浏览器就能使用
- 缺点: 如果应用过大, 用户体验受到影响
-
C/S架构的优缺点:
- 优点: 画面可以做的非常精美, 用户体验好
- 缺点: (1) 既需要开发客户端, 又需要开发服务端 (2) 用户需要下载和更新的时候太麻烦
2. 网络编程三要素
- IP: 设备在网络中的地址, 也是唯一的标识
- 端口号: 应用程序在设备中唯一的标识
- 协议: 数据在网络中的传输规则, 常见的协议有: UDP, TCP, http, https, ftp
- 特殊的IP: 127.0.0.1永远表示本机
- ipconfig: 查看本机IP地址, ping: 检查网络是否畅通
3. Java中InetAddress

4. UDP通信工程

- 发送数据
// 发送数据
// 1. 创建DatagramSocket对象(快递公司)
// 绑定端口: 以后就是通过这个端口往外发送
// 空参: 随机端口 有参: 指定端口号进行绑定
DatagramSocket ds = new DatagramSocket();
// 2. 打包数据
byte[] bys = "hello,udp".getBytes();
InetAddress byName = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, bys.length, byName, port);
// 3. 发送数据
ds.send(dp);
// 4. 释放资源
ds.close();
- 接收数据

// 接收数据
// 1. 创建DatagramSocket对象(快递公司)
// 接收的时候一定要绑定端口
// 绑定的端口一定要跟发送的端口保持一致
DatagramSocket ds = new DatagramSocket(10086);
// 2. 接收数据包
byte [] bys = new byte[1024];
DatagramPacket dp = new DatagramPacket(bys, bys.length);
ds.receive(dp);
// 3. 解析数据包
String data = new String(dp.getData(), 0, dp.getLength());
System.out.println(data);
// 4. 释放资源
ds.close();
5. TCP通信工程


5.1 TCP发送数据
package awei.itheima;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException {
// TCP协议, 发送数据
// 1. 创建socket对象
// 细节: 在创建对象同时会连接服务器, 如果连接不上, 会报错
Socket socket = new Socket("127.0.0.1", 10000);
// 2. 可以从连接通道中获取输出流
OutputStream os = socket.getOutputStream();
// 写出数据
os.write("hello, server你好".getBytes()); // 中文会出现乱码, 如果接收端是字节流读入的话
// 3. 释放资源
os.close();
socket.close();
}
}
5.2 TCP接收数据
package awei.itheima;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws IOException {
// TCP协议, 接收数据
// 1. 创建对象ServerSocket
ServerSocket ss = new ServerSocket(10000);
// 2. 监听客户端的连接
Socket socket = ss.accept();
// 3. 从连接通道中获取输入流读取数据
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
// 使用缓冲流提高效率
// BufferedReader br = new BufferedReader(isr);
int b;
// while((b = is.read()) != -1){
// System.out.print((char)b);
// }
while((b = isr.read()) != -1){
System.out.print((char)b);
}
// 4. 释放资源(释放端口和服务器, 输入流不需要, 因为断开连接时候会默认把输入输出流断开)
socket.close();
ss.close();
}
}
5.3 客户端和服务端建立连接原理
5.3.1 先服务端, 后客户端
- 先运行服务端, 等待客户端请求, 再运行客户端

5.3.2 TCP通信程序(三次握手)

5.3.3 TCP通信程序(四次挥手)
- 确保连接通道里面的数据完全处理


浙公网安备 33010602011771号