Java 网络编程语法知识点及案例代码
网络编程基础概念
- 网络:两台或多台设备通过一定物理设备连接起来构成了网络。根据网络的覆盖范围不同,对网络进行分类:局域网、城域网、广域网。
- 网络通信:将数据通过网络从一台设备传输到另一台设备。
- IP地址:用于唯一标识网络中的每台计算机/主机。
- 域名:由一串用点分隔的名字组成的网络上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识。
- 端口号:用于标识计算机上某个特定的网络程序,端口范围0~65535。
- TCP协议:
- 使用前先建立TCP连接,形成传输数据通道。
- 传输前,采用“三次握手”方式,是可靠的。
- 进行通信的两个应用进程:客户端和服务端。
- 可进行大数据量的传输。
- 传输完毕需要释放建立的连接,效率较低。
- UDP协议:
- 将数据、源、目的封装成数据包,不需要建立连接。
- 每个数据包的大小限制在64K以内,不适合传输大量数据。
- 无需连接,是不可靠的。
- 传输完毕无需释放资源,速度快。
Java网络编程常用类
- InetAddress:用于获取和操作IP地址。
- Socket:用于实现客户端和服务器之间的连接。
- ServerSocket:用于实现服务器端,监听客户端的连接请求。
案例代码
以下是一个简单的Java网络编程案例,包括客户端和服务器端的代码,用于演示TCP通信的基本过程。
服务器端(Server.java)
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
// 创建ServerSocket对象,监听指定端口
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器启动, 监听端口 8080");
while (true) {
// 阻塞等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功: " + socket.getInetAddress().getHostAddress());
// 获取输入流和输出流
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);
}
// 关闭连接
socket.close();
}
}
}
客户端(Client.java)
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
// 创建Socket对象,连接服务器
Socket socket = new Socket("127.0.0.1", 8080);
// 获取输入流和输出流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 发送多条消息
for (int i = 1; i <= 5; i++) {
out.println("客户端消息 " + i);
System.out.println("发送消息: 客户端消息 " + i);
// 接收服务器回复
String response = in.readLine();
System.out.println("接收回复: " + response);
}
// 关闭连接
socket.close();
}
}
代码注释
-
服务器端:
ServerSocket serverSocket = new ServerSocket(8080);:创建一个监听8080端口的ServerSocket对象。Socket socket = serverSocket.accept();:阻塞等待客户端连接。BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));:获取输入流,用于读取客户端发送的数据。PrintWriter out = new PrintWriter(socket.getOutputStream(), true);:获取输出流,用于向客户端发送数据。while ((message = in.readLine()) != null):循环读取客户端发送的消息,直到客户端关闭连接。socket.close();:关闭与客户端的连接。
-
客户端:
Socket socket = new Socket("127.0.0.1", 8080);:创建一个连接到本地服务器(IP地址为127.0.0.1,端口号为8080)的Socket对象。BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));:获取输入流,用于读取服务器发送的数据。PrintWriter out = new PrintWriter(socket.getOutputStream(), true);:获取输出流,用于向服务器发送数据。for (int i = 1; i <= 5; i++):循环发送5条消息给服务器。String response = in.readLine();:接收服务器回复的消息。socket.close();:关闭与服务器的连接。
当然可以,以下是一些具体的Java网络编程案例,包括TCP通信、UDP通信以及一个简单的聊天程序。
案例一:TCP通信
服务器端(TCPServer.java)
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try {
// 创建ServerSocket对象,监听指定端口
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("Server is running, waiting for client to connect...");
// 阻塞等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("Client connected.");
// 获取输入流和输出流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 接收客户端发送的消息
String message = in.readLine();
System.out.println("Received: " + message);
// 回传消息给客户端
out.println("Server received: " + message);
// 关闭连接
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端(TCPClient.java)
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
try {
// 创建Socket对象,连接服务器
Socket socket = new Socket("localhost", 9999);
// 获取输入流和输出流
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// 发送消息
out.println("Hello, TCP Server!");
// 接收服务器回复
String response = in.readLine();
System.out.println("Server response: " + response);
// 关闭连接
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
案例二:UDP通信
服务器端(UDPServer.java)
import java.net.*;
public class UDPServer {
public static void main(String[] args) {
try {
// 创建DatagramSocket对象,绑定到指定端口
DatagramSocket socket = new DatagramSocket(9876);
byte[] buffer = new byte[1024];
while (true) {
// 接收数据包
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
// 获取数据并打印
String receivedData = new String(packet.getData(), 0, packet.getLength());
InetAddress clientAddress = packet.getAddress();
int clientPort = packet.getPort();
System.out.println("Received from " + clientAddress.getHostAddress() + ":" + clientPort + " - " + receivedData);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
客户端(UDPClient.java)
import java.net.*;
public class UDPClient {
public static void main(String[] args) {
try {
// 创建DatagramSocket对象
DatagramSocket socket = new DatagramSocket();
InetAddress serverAddress = InetAddress.getByName("localhost");
int serverPort = 9876;
// 创建要发送的数据
String message = "Hello, UDP Server!";
byte[] buffer = message.getBytes();
// 创建DatagramPacket对象,包含数据和目标地址
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, serverAddress, serverPort);
// 发送数据包
socket.send(packet);
System.out.println("Sent: " + message);
// 关闭socket(可选,因为UDP是无连接的)
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
案例三:简单的聊天程序
服务器端(ChatServer.java)
import java.io.*;
import java.net.*;
import java.util.concurrent.*;
public class ChatServer {
public static void main(String[] args) throws IOException {
// 创建ServerSocket对象,监听指定端口
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("服务器启动, 监听端口 8080");
// 创建线程池,处理多个客户端连接
ExecutorService executor = Executors.newFixedThreadPool(10);
while (true) {
// 阻塞等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功: " + socket.getInetAddress().getHostAddress());
// 创建线程处理客户端连接
executor.execute(new ClientHandler(socket));
}
}
// 处理客户端连接的线程类
static class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try (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);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端(ChatClient.java)
import java.io.*;
import java.net.*;
import java.util.Scanner;
public class ChatClient {
public static void main(String[] args) throws IOException {
// 创建Socket对象,连接服务器
Socket socket = new Socket("127.0.0.1", 8080);
// 获取输入流和输出流
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
Scanner scanner = new Scanner(System.in);
// 发送和接收消息
System.out.println("请输入消息(输入'exit'退出):");
while (true) {
String message = scanner.nextLine();
if (message.equalsIgnoreCase("exit")) {
break;
}
out.println(message);
System.out.println("发送消息: " + message);
String response = in.readLine();
System.out.println("接收回复: " + response);
}
// 关闭连接
socket.close();
scanner.close();
}
}
以上案例涵盖了Java网络编程中的TCP通信、UDP通信以及一个简单的聊天程序。每个案例都包含了服务器端和客户端的代码,并附有详细的注释,以帮助初学者理解代码的功能和实现方式。

&spm=1001.2101.3001.5002&articleId=145015491&d=1&t=3&u=155213e50cd1414781f505c159c370dc)
5559

被折叠的 条评论
为什么被折叠?



