模式切换
网络通信
网络通信是指通过计算机网络来交换信息的过程。在 Java 中,网络通信可以通过 TCP 和 UDP 协议实现,涉及到许多网络协议和基本概念。
网络程序设计基础
局域网与因特网
- 局域网(LAN):指在一个小范围内的网络,通常用于一个家庭、办公室或学校等环境。局域网内的计算机通过共享设备(如交换机、路由器)连接,通信延迟较小,数据传输速度较快。
- 因特网(Internet):是一个全球范围内的计算机网络,由许多局域网、广域网以及其他网络互联而成。因特网的规模远大于局域网,通信延迟较大,且数据传输速度不稳定。
网络协议
网络协议是计算机网络中,通信双方按照约定的规则和标准交换数据的协议。例如:
- TCP/IP 协议:是因特网的核心协议,提供可靠的数据传输。
- HTTP 协议:用于浏览器与服务器之间传输网页数据。
- FTP 协议:用于文件传输。
- DNS 协议:用于域名解析。
协议定义了数据如何封装、如何传输、如何保证数据完整性和可靠性。
端口和套接字
端口(Port):端口是网络通信中标识不同进程的数字标识符。在计算机中,每个服务或程序通过端口与其他程序进行通信。常见端口号:
- HTTP:80
- HTTPS:443
- FTP:21
- 邮件:25
套接字(Socket):是网络通信中,应用程序与操作系统之间进行数据交换的接口。通过套接字,应用程序可以访问网络中的其他主机和端口。套接字包括 IP 地址和端口号。
TCP 程序设计基础
TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的协议,确保数据按顺序传输且不会丢失。
InetAddress 类
InetAddress
类表示一个 IP 地址,它可以用来表示主机的 IP 地址或者域名。通过 InetAddress
类可以获取计算机的 IP 地址、主机名等信息。
示例:
java
import java.net.*;
public class InetAddressExample {
public static void main(String[] args) throws UnknownHostException {
InetAddress address = InetAddress.getByName("www.google.com");
System.out.println("Host name: " + address.getHostName());
System.out.println("IP address: " + address.getHostAddress());
}
}
ServerSocket 类
ServerSocket
类用于创建一个 TCP 服务器端,监听客户端的连接请求。服务器端通过 accept()
方法接受客户端的连接。
示例:
java
import java.net.*;
import java.io.*;
public class ServerExample {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080); // 在端口 8080 上监听
System.out.println("服务器正在等待连接...");
Socket socket = serverSocket.accept(); // 等待客户端连接
System.out.println("客户端连接成功");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = in.readLine();
System.out.println("客户端发来消息: " + message);
socket.close();
serverSocket.close();
}
}
TCP 网络程序
客户端代码:
java
import java.net.*;
import java.io.*;
public class ClientExample {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8080); // 连接服务器
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
out.println("Hello, Server!"); // 发送消息
socket.close();
}
}
运行顺序:
- 启动服务器端程序。
- 启动客户端程序,客户端会向服务器发送消息。
- 服务器接收消息并显示。
UDP 程序设计基础
UDP(用户数据报协议)是一种无连接的协议,相比 TCP,它没有保证数据可靠传输、顺序和完整性,但传输速度更快,适合实时应用。
DatagramPacket 类
DatagramPacket
类用于表示发送或接收的 UDP 数据包。它包含数据、数据的长度、目的地地址和端口号。
示例代码:
java
import java.net.*;
public class DatagramPacketExample {
public static void main(String[] args) throws Exception {
String message = "Hello, UDP!";
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 9876);
}
}
DatagramSocket 类
DatagramSocket
类用于发送和接收 UDP 数据报。与 Socket
类不同,DatagramSocket
不需要建立连接。
发送端示例代码:
java
import java.net.*;
public class UDPSender {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
String message = "Hello, UDP!";
byte[] buffer = message.getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, InetAddress.getByName("localhost"), 9876);
socket.send(packet);
socket.close();
}
}
接收端示例代码:
java
import java.net.*;
public class UDPReceiver {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9876);
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet); // 接收数据
String message = new String(packet.getData(), 0, packet.getLength());
System.out.println("接收到消息: " + message);
socket.close();
}
}
UDP 网络程序
- UDP 发送端:使用
DatagramSocket
发送数据包到指定地址和端口。 - UDP 接收端:使用
DatagramSocket
接收数据包并处理。