什么是网络编程
- 在网络通信协议下, 不同计算机上运行的程序, 通过网络进行数据传输
- 简单来说就是计算机与计算机之间通过网络传输数据
常见的架构
BS架构和CS架构
常见的软件架构
优缺点对比
BS/CS架构对比
网络编程三要素
- IP: 设备在网络中的地址, 是唯一的标识
- 端口号: 应用程序在设备中唯一的标识
- 协议: 数据在网络中的传输规则, 常见的协议有UDP, TCP, http, https, ftp
UDP协议:
- 用户数据报协议(User Datagram Protocol)
- UDP是面向无连接通信协议(不关心两设备间网络是否畅通)
速度快, 有大小限制一次最多发送64K, 数据不安全, 易丢失数据
TCP协议
- 传输控制协议TCP(Transmission Control Protocol)
- TCP协议是面向连接的通信协议
速度慢, 没有大小限制, 数据安全
UDP通信程序(发送数据)
- 创建发送端的DatagramSocket对象
- 数据打包(DatagramPacket)
- 发送数据
- 释放资源
//创建发送端对象
//可以空参也可以带参
//空参则随机一个端口进行发送
//带参则指定端口发送
DatagramSocket ds = new DatagramSocket();
//打包数据
String str = "云想衣裳花想容";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");//发送到本机
int port = 10086;//发送到10086端口
DatagramPacket dp = new DatagramPacket(bytes,bytes.length,address,port);
//发送数据
ds.send(dp);
//释放资源
ds.close();
UDP通信程序(接收数据)
- 创建接收端的DatagramSocket对象
- 接收打包好的数据
- 解析数据包
- 释放资源
//创建接收端对象
//接收端口必须带参, 之前是发送到哪个端口, 接收时就要传递哪个端口
DatagramSocket ds = new DatagramSocket(10086);
//接收数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
ds.receive(dp);
//解析数据
InetAddress address = dp.getAddress();
byte[] data = dp.getData();
int length = dp.getLength();
int port = dp.getPort();
System.out.println("接收到数据" + new String(data,0,length));//接收到数据云想衣裳花想容
System.out.println("是从设备" + address + "的" + port +"端口发送的");//是从设备/127.0.0.1的54784端口发送的
//释放资源
ds.close();
TCP通信程序
-
TCP通信协议是一种可靠的网络协议, 它在通信的两端各建立一个Socket对象, 通信之前要保证连接已经建立, 通过Socket产生lO流来进行网络通信
客户端(Socket)
- 创建客户端Socket对象, 与指定服务端连接
- 获取输出流, 写数据
- 释放资源
//创建客户端对象
//发送到本机的10000端口
//在创建对象的同时会连接服务端, 如果连接不上, 代码会报错
Socket socket = new Socket("127.0.0.1",10000);
//使用客户端对象获取输出流
OutputStream os = socket.getOutputStream();
os.write("霓为衣兮风为马".getBytes());
//释放资源
os.close();
socket.close();
服务器(SeverSocket)
- 创建服务器端Socket对象(SeverSocket)
- 监听客户端连接, 返回一个Socket对象
- 获取输入流, 读数据, 并把数据显示在控制台上
- 释放资源
//创建服务器对象
//参数的端口要与客户端中发送到的端口保持一致
ServerSocket ss = new ServerSocket(10000);
//监听客户端的连接
//如果连接成功, accept方法会返回Socket的对象
Socket socket = ss.accept();
//从连接通道中, 获取输入流来读取数据
InputStream is = socket.getInputStream();
//字节流不能读中文, 所以使用转换流将其转换成字符流
InputStreamReader isr = new InputStreamReader(is);
int b;
while ((b = isr.read()) != -1) {
System.out.print((char) b);//霓为衣兮风为马
}
//释放资源
isr.close();
socket.close();
ss.close();
TCP通信程序三次握手协议
三次握手
TCP通信程序四次挥手协议
四次挥手