1. 网络编程概述
网络编程是指在网络上进行通信的程序编写。Java 提供了一整套的 API 来支持网络编程,包括 TCP/IP 和 UDP 协议。
1.1 Java 网络编程的特点
- 跨平台性:Java 的网络应用程序可以在不同的操作系统上运行。
- 协议支持:Java 支持多种网络协议,如
HTTP
、FTP
、SMTP
等。
- 丰富的 API:Java 提供了
java.net
包,含有处理网络通信的类和接口。
2. Java 网络编程模型
Java 网络编程主要基于两个协议模型:
2.1 TCP(传输控制协议)
TCP 是一种面向连接的协议,它提供可靠的、顺序的、无差错的数据传输。
2.1.1 TCP通信过程
- 建立连接:通过
ServerSocket
和 Socket
类。
- 数据传输:通过输入流和输出流进行数据交换。
- 关闭连接:释放资源并关闭连接。
2.1.2 TCP 示例代码
以下是一个简单的 TCP 客户端和服务器示例代码:
服务器端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| import java.io.*; import java.net.*;
public class TcpServer { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器启动,等待客户端连接...");
Socket socket = serverSocket.accept(); System.out.println("客户端已连接,IP: " + socket.getInetAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
String message; while ((message = in.readLine()) != null) { System.out.println("客户端: " + message); out.println("服务器: " + message.toUpperCase()); }
socket.close(); serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
|
客户端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| import java.io.*; import java.net.*;
public class TcpClient { public static void main(String[] args) { try { Socket socket = new Socket("localhost", 8888); System.out.println("已连接到服务器");
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in)); String message; while ((message = userInput.readLine()) != null) { out.println(message); System.out.println("服务器回复: " + in.readLine()); }
socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
|
2.2 UDP(用户数据报协议)
UDP 是一种无连接的协议,它不提供可靠的传输,适用于需要快速传输的应用。
2.2.1 UDP通信过程
- 发送和接收数据:通过
DatagramSocket
和 DatagramPacket
类。
- 关闭连接:释放资源。
2.2.2 UDP 示例代码
以下是一个简单的 UDP 客户端和服务器示例代码:
服务器端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| import java.net.*;
public class UdpServer { public static void main(String[] args) { try { DatagramSocket socket = new DatagramSocket(8888); byte[] buffer = new byte[1024];
System.out.println("UDP服务器启动,等待客户端消息...");
while (true) { DatagramPacket packet = new DatagramPacket(buffer, buffer.length); socket.receive(packet);
String message = new String(packet.getData(), 0, packet.getLength()); System.out.println("接收到: " + message);
String response = "服务器: " + message.toUpperCase(); byte[] responseData = response.getBytes(); DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, packet.getAddress(), packet.getPort()); socket.send(responsePacket); } } catch (Exception e) { e.printStackTrace(); } } }
|
客户端代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.net.*; import java.util.Scanner;
public class UdpClient { public static void main(String[] args) { try { DatagramSocket socket = new DatagramSocket(); Scanner scanner = new Scanner(System.in);
while (true) { System.out.print("请输入消息: "); String message = scanner.nextLine();
byte[] data = message.getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length, InetAddress.getByName("localhost"), 8888); socket.send(packet);
byte[] buffer = new byte[1024]; DatagramPacket responsePacket = new DatagramPacket(buffer, buffer.length); socket.receive(responsePacket); String response = new String(responsePacket.getData(), 0, responsePacket.getLength()); System.out.println(response); } } catch (Exception e) { e.printStackTrace(); } } }
|
3. 常用的 Java 网络编程类和接口
Socket
:用于建立与远程主机的 TCP 连接。
ServerSocket
:用于实现 TCP 服务器。
DatagramSocket
:用于发送和接收 UDP 数据报。
DatagramPacket
:用于封装数据报的内容。
URL
和 URLConnection
:用于处理 URL 和网络连接。
4. 小结
Java 网络编程提供了灵活的方式来实现各种网络应用。我们可以利用 TCP
和 UDP
协议编写客户端和服务器程序。掌握这些基本概念和代码示例后,可以进一步深入理解更复杂的网络应用。