授课语音

Java 网络编程概述

一、Java 网络编程概述

网络编程是利用网络协议让程序在不同的计算机上相互通信的一种技术。在 Java 中,网络编程广泛用于构建分布式系统、客户端-服务器应用程序等。Java 提供了一套标准的 java.net 包,内含各种类和接口,帮助开发者实现网络通信功能。

二、网络编程的基本概念

  1. 网络协议:通信双方需遵循的规则或标准。常见的网络协议有 TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)。
  2. IP 地址:每台联网的设备都有唯一的 IP 地址,类似于设备在网络上的地址。
  3. 端口:计算机上用于区分不同服务的编号。例如,HTTP 通常使用端口 80
  4. Socket(套接字):网络通信的端点,用于通信的过程。一个 Socket 包含 IP 地址和端口号。
  5. 客户端和服务器:客户端请求服务,服务器响应请求并提供服务。

三、Java 网络编程的核心类

  1. Socket:用于创建 TCP 客户端,连接到远程服务器。
  2. ServerSocket:用于创建 TCP 服务器,监听并接受客户端的连接请求。
  3. DatagramSocketDatagramPacket:用于实现 UDP 网络通信。

四、TCP 和 UDP 的区别

特性 TCP UDP
是否可靠 可靠,确保数据无差错、不丢失、不重复地传输 不可靠,可能出现丢包
连接方式 面向连接,通信前需建立连接 无连接,直接发送数据
速度 较慢,因为需要确保数据可靠传输 较快,因为没有数据确认步骤
使用场景 文件传输、电子邮件、网页浏览 视频通话、实时游戏

五、网络编程的代码案例

1. TCP 客户端和服务器示例

TCP 服务器代码

import java.io.*;
import java.net.*;

public class TCPServer {
    public static void main(String[] args) {
        try (ServerSocket serverSocket = new ServerSocket(8080)) { // 创建一个 ServerSocket,监听端口 8080
            System.out.println("服务器已启动,等待客户端连接...");

            // 等待客户端连接
            Socket socket = serverSocket.accept();
            System.out.println("客户端已连接:" + socket.getInetAddress());

            // 读取客户端发送的数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String message = reader.readLine();
            System.out.println("收到客户端消息:" + message);

            // 向客户端发送响应数据
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            writer.println("服务器已收到消息:" + message);

            // 关闭资源
            reader.close();
            writer.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注释:

  • 使用 ServerSocket 创建一个 TCP 服务器,并在端口 8080 上监听客户端连接。
  • 调用 accept() 等待客户端连接,一旦连接,打印客户端的 IP 地址。
  • 通过 BufferedReader 读取客户端发送的消息,通过 PrintWriter 向客户端发送回复消息。
  • 完成通信后,关闭相关资源。

TCP 客户端代码

import java.io.*;
import java.net.*;

public class TCPClient {
    public static void main(String[] args) {
        try (Socket socket = new Socket("localhost", 8080)) { // 创建一个连接到本地服务器的 Socket
            System.out.println("已连接到服务器");

            // 向服务器发送数据
            PrintWriter writer = new PrintWriter(socket.getOutputStream(), true);
            writer.println("Hello, Server!");

            // 接收服务器的响应数据
            BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String response = reader.readLine();
            System.out.println("收到服务器回复:" + response);

            // 关闭资源
            writer.close();
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

注释:

  • 使用 Socket 创建 TCP 客户端,连接到本地服务器的端口 8080。
  • 使用 PrintWriter 向服务器发送消息,使用 BufferedReader 接收服务器的响应。
  • 通信完成后,关闭资源。

2. UDP 客户端和服务器示例

UDP 服务器代码

import java.net.*;

public class UDPServer {
    public static void main(String[] args) {
        try (DatagramSocket serverSocket = new DatagramSocket(9090)) { // 创建一个 DatagramSocket,监听端口 9090
            System.out.println("UDP 服务器已启动,等待客户端消息...");

            byte[] buffer = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(buffer, buffer.length);

            // 接收客户端消息
            serverSocket.receive(receivePacket);
            String message = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("收到客户端消息:" + message);

            // 发送回复给客户端
            String response = "Hello, Client!";
            byte[] responseData = response.getBytes();
            DatagramPacket responsePacket = new DatagramPacket(responseData, responseData.length, receivePacket.getAddress(), receivePacket.getPort());
            serverSocket.send(responsePacket);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注释:

  • 使用 DatagramSocket 创建 UDP 服务器,在端口 9090 监听客户端消息。
  • DatagramPacket 用于接收客户端发送的消息,并将消息转换为字符串输出。
  • 服务器构建回复消息,并通过 DatagramPacket 将消息发送到客户端的地址和端口。

UDP 客户端代码

import java.net.*;

public class UDPClient {
    public static void main(String[] args) {
        try (DatagramSocket clientSocket = new DatagramSocket()) { // 创建一个 DatagramSocket 用于发送数据
            String message = "Hello, Server!";
            byte[] sendData = message.getBytes();

            // 向服务器发送数据
            InetAddress serverAddress = InetAddress.getByName("localhost");
            DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9090);
            clientSocket.send(sendPacket);
            System.out.println("已发送消息到服务器");

            // 接收服务器的响应
            byte[] receiveData = new byte[1024];
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            clientSocket.receive(receivePacket);

            String response = new String(receivePacket.getData(), 0, receivePacket.getLength());
            System.out.println("收到服务器回复:" + response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注释:

  • 使用 DatagramSocket 创建 UDP 客户端,发送消息到服务器。
  • 通过 DatagramPacket 将消息封装并发送到服务器的 IP 和端口。
  • 客户端接收服务器的回复,解析并输出。

六、总结

通过这些代码示例,我们可以总结 Java 网络编程的基本流程和主要类的用法:

  1. TCP 适合需要可靠传输的场景,使用 SocketServerSocket 来建立和管理连接。
  2. UDP 适合不需要建立连接、速度要求较高的场景,使用 DatagramSocketDatagramPacket 实现数据报文的发送和接收。

掌握这些内容后,开发者可以根据应用场景选择合适的网络协议,实现数据的高效、稳定传输。

去1:1私密咨询

系列课程: