CS架构:画面可以做得好,需要开发客户端,也需要开发服务端,用户更新下载太麻烦
BS架构:不需要客户端,只需要页面加服务器,用户不需要下载,打开浏览器就能使用,如果应用过大,用户体验不好。
网络编程三要素:
IP:设备在网络中的地址是唯一标识
端口号:应用程序在设备中的唯一标识
协议:数据在网络中传输的规则,常见的协议有udp,http,https,ftp
IP(IPV4,IPV6)
IPV4:目前的主流方案,最多只有2^32次方,已经用完。可用局域网解决。
分为公网地址(万维网使用)和私有地址(局域网使用)。
IPV6:为了解决IPV4不够用而出现的,最多有2^128次方个ip。特殊ip地址,127.0.0.1也可以是localhost:是送回地址也称本地回环地址。也称本机ip,永远只会寻找当前所在本机。
常用cmd命令:
ipconfig:查看本机地址
ping:检查网络是否连通
inetAddress类的使用
import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressExample {
public static void main(String[] args) {
try {
// 通过主机名获取 InetAddress 对象
InetAddress addressByName = InetAddress.getByName("www.example.com");
System.out.println("Host Name: " + addressByName.getHostName());
System.out.println("IP Address: " + addressByName.getHostAddress());
// 获取本地主机 InetAddress 对象
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("Local Host Name: " + localHost.getHostName());
System.out.println("Local IP Address: " + localHost.getHostAddress());
// 获取 IP 地址的字节数组表示
byte[] ipAddressBytes = addressByName.getAddress();
for (byte b : ipAddressBytes) {
System.out.print(b & 0xFF); // 使用 0xFF 将字节转换为无符号整数
System.out.print(".");
}
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
端口号:应用程序在设备中的唯一标识。
端口号:两个字节表示的整数,取值范围0~65535
其中0~1023之间的端口号用于一些知名的网络服务或应用,我们自己使用1024以上的端口号
一个端口号只能被一个应用程序使用
协议:网络连接中,连接和通信的规则(网络通信协议)
TCP/IP参考模型(TCP/IP协议)。三层:应用层(HTTP,FTP,Telent,DNS)、传输层(TCP,UDP)、网络层(IP,ICMP,ARP)、物理链路层
传输层:udp:用户数据报协议,面向无连接通讯,速度快,有大小限制一次最多64k,数据不安全易丢失。
tcp:传输控制协议,面向连接的通信协议,速度慢,没有大小限制,数据安全。
发送与接受数据
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSender {
public static void main(String[] args) {
try {
// 创建 DatagramSocket 对象,指定发送端口
DatagramSocket socket = new DatagramSocket();
// 准备要发送的数据
String message = "Hello, UDP!";
byte[] data = message.getBytes();
// 创建 DatagramPacket 对象,指定目标地址和端口
InetAddress destinationAddress = InetAddress.getByName("localhost"); // 替换为接收方的 IP 地址
int destinationPort = 12345; // 替换为接收方的端口
DatagramPacket packet = new DatagramPacket(data, data.length, destinationAddress, destinationPort);
// 发送数据
socket.send(packet);
// 关闭 socket
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//接受
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceiver {
public static void main(String[] args) {
try {
// 创建 DatagramSocket 对象,指定接收端口
int port = 12345; // 替换为实际的接收端口
DatagramSocket socket = new DatagramSocket(port);
// 准备缓冲区
byte[] buffer = new byte[1024];
// 创建 DatagramPacket 对象,用于接收数据
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
// 接收数据
socket.receive(packet);
// 处理接收到的数据
String receivedMessage = new String(packet.getData(), 0, packet.getLength());
System.out.println("接收到的数据:" + receivedMessage);
// 关闭 socket
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}