Java 网络编程与网络通信基础
13.1 学习目标与重点提示
学习目标:掌握 Java 网络编程的核心概念与通信方式,包括套接字编程、TCP/IP 通信、UDP 通信、HTTP 通信的实现方法,学会在实际开发中处理网络通信问题。
重点:
- 套接字编程(Socket、ServerSocket)
- TCP/IP 通信(服务器端、客户端)
- UDP 通信(DatagramSocket、DatagramPacket)
- HTTP 通信(URL、URLConnection)
- 网络编程的实际应用场景
13.2 网络编程概述
Java 网络编程是用于处理网络通信的机制。
13.2.1 网络编程的定义
定义:网络编程是用于处理网络通信的机制。
作用:
- 实现客户端与服务器之间的通信。
- 实现不同设备之间的数据传输。
- 实现网络应用程序的开发。
结论:网络编程是实现客户端与服务器通信、设备间数据传输及网络应用开发的基础机制。
13.2.2 网络编程的分类
分类:
- TCP/IP 通信:可靠的、面向连接的通信方式。
- UDP 通信:不可靠的、无连接的通信方式。
- HTTP 通信:基于 TCP/IP 的应用层通信方式。
结论:网络编程主要包含 TCP/IP、UDP 和 HTTP 通信三种类型。
13.3 套接字编程基础
套接字编程是 Java 网络编程的基础。
13.3.1 Socket 与 ServerSocket 的定义
定义:Socket 是用于表示网络连接的对象。ServerSocket 用于表示服务器端的套接字。
常用方法:
- Socket:getInputStream()、getOutputStream()、close()
- ServerSocket:accept()、close()
示例:
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("客户端连接成功:" + socket.getInetAddress().getHostAddress());
// 获取输入流和输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
// 读取客户端数据
String message = reader.readLine();
System.out.println("客户端消息:" + message);
// 发送响应数据
writer.println("服务器端已收到消息:" + message);
// 关闭资源
reader.close();
writer.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 客户端
public class TCPClient {
public static void main(String[] args) {
try {
// 创建客户端套接字
Socket socket = new Socket("localhost", 8888);
System.out.println("客户端连接成功");
// 获取输入流和输出流
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
// 发送数据
writer.println("Hello, Server!");
// 读取响应数据
String response = reader.readLine();
System.out.println("服务器端响应:" + response);
// 关闭资源
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果: 服务器端显示连接成功及消息接收,客户端显示响应内容。
结论:Socket 与 ServerSocket 是 Java 网络编程的基础,用于实现客户端与服务器之间的通信。
13.4 TCP/IP 通信的实现
TCP/IP 通信是可靠的、面向连接的通信方式。
13.4.1 服务器端的实现
示例:
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器端启动成功,等待客户端连接...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功:" + socket.getInetAddress().getHostAddress());
new Thread(() -> {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
String message = reader.readLine();
System.out.println("客户端消息:" + message);
writer.println("服务器端已收到消息:" + message);
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
结论:服务器端需创建线程处理客户端请求。
13.4.2 客户端的实现
示例:
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 reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
writer.println("Hello, Server!");
String response = reader.readLine();
System.out.println("服务器端响应:" + response);
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结论:客户端需与服务器端建立连接并发送数据。
13.5 UDP 通信的实现
UDP 通信是不可靠的、无连接的通信方式。
13.5.1 DatagramSocket 与 DatagramPacket 的定义
定义:DatagramSocket 表示 UDP 套接字,DatagramPacket 表示 UDP 数据包。
常用方法:
- DatagramSocket:send()、receive()、close()
- DatagramPacket:getData()、getLength()、getAddress()、getPort()
示例:
import java.io.*;
import java.net.*;
// 服务器端
public class UDPServer {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket(8888);
System.out.println("服务器端启动成功,等待客户端连接...");
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);
String response = "服务器端已收到消息:" + message;
byte[] responseBuffer = response.getBytes();
DatagramPacket responsePacket = new DatagramPacket(responseBuffer, responseBuffer.length, packet.getAddress(), packet.getPort());
socket.send(responsePacket);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 客户端
public class UDPClient {
public static void main(String[] args) {
try {
DatagramSocket socket = new DatagramSocket();
System.out.println("客户端启动成功");
String message = "Hello, Server!";
byte[] buffer = message.getBytes();
InetAddress address = InetAddress.getByName("localhost");
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 8888);
socket.send(packet);
byte[] responseBuffer = new byte[1024];
DatagramPacket responsePacket = new DatagramPacket(responseBuffer, responseBuffer.length);
socket.receive(responsePacket);
String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
System.out.println("服务器端响应:" + response);
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
结论:DatagramSocket 与 DatagramPacket 是 Java 中 UDP 通信的基础。
13.6 HTTP 通信的实现
HTTP 通信是基于 TCP/IP 的应用层通信方式。
13.6.1 URL 与 URLConnection 的定义
定义:URL 表示统一资源定位符,URLConnection 表示 URL 连接。
常用方法:
- URL:openConnection()、getProtocol()、getHost()、getPort()、getPath()
- URLConnection:getInputStream()、getOutputStream()、setRequestProperty()、getResponseCode()、getResponseMessage()
示例:
import java.io.*;
import java.net.*;
public class HTTPExample {
public static void main(String[] args) {
try {
URL url = new URL("https://www.baidu.com");
URLConnection connection = url.openConnection();
connection.setRequestProperty("User-Agent", "Mozilla/5.0");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
StringBuffer response = new StringBuffer();
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
System.out.println("响应数据:" + response.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
结论:URL 与 URLConnection 是 Java 中 HTTP 通信的基础。
13.7 网络编程的实际应用场景
实际开发中,网络编程广泛应用于文件传输、聊天、爬虫等场景。
示例:文件上传
import java.io.*;
import java.net.*;
// 文件上传服务器端
public class FileUploadServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务器端启动成功,等待客户端连接...");
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功:" + socket.getInetAddress().getHostAddress());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
FileOutputStream fileOutputStream = new FileOutputStream("uploaded_file.txt");
String fileName = reader.readLine();
System.out.println("文件名:" + fileName);
byte[] buffer = new byte[1024];
int length;
while ((length = dataInputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, length);
}
fileOutputStream.close();
dataInputStream.close();
reader.close();
socket.close();
serverSocket.close();
System.out.println("文件上传成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 文件上传客户端
public class FileUploadClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 8888);
System.out.println("客户端连接成功");
PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
FileInputStream fileInputStream = new FileInputStream("test.txt");
String fileName = "test.txt";
writer.println(fileName);
byte[] buffer = new byte[1024];
int length;
while ((length = fileInputStream.read(buffer)) > 0) {
dataOutputStream.write(buffer, 0, length);
}
fileInputStream.close();
dataOutputStream.close();
writer.close();
socket.close();
System.out.println("文件上传成功");
} catch (IOException e) {
e.printStackTrace();
}
}
}
结论:根据实际问题选择合适的网络编程方法。
总结
本章学习了 Java 网络编程与网络通信基础,包括套接字编程、TCP/IP 通信、UDP 通信、HTTP 通信的实现方法。重点掌握了 Socket、ServerSocket、DatagramSocket、DatagramPacket、URL、URLConnection 等核心类的使用,以及在网络文件传输等实际场景中的应用。

