首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java 网络编程实战全解析:Socket、HTTP 与多线程服务器设计

Java 网络编程实战全解析:Socket、HTTP 与多线程服务器设计

原创
作者头像
用户11690575
发布2025-06-06 21:06:17
发布2025-06-06 21:06:17
25600
代码可运行
举报
运行总次数:0
代码可运行

一、引言:为何学习 Java 网络编程?

在当今互联网世界中,大多数应用都离不开网络通信。Java 提供了强大、灵活的网络 API,使得构建客户端-服务器模型变得简单且高效。

学习 Java 网络编程,你将掌握以下技能:

  • 使用 Socket 进行 TCP/UDP 通信
  • 构建简单的 Web 服务器
  • 使用多线程处理并发连接
  • 掌握 HTTP 协议基础

二、Java 网络编程的核心类

类名

描述

Socket

TCP 客户端通信类

ServerSocket

TCP 服务器端通信类

DatagramSocket

UDP 通信类

InetAddress

表示 IP 地址

URL / HttpURLConnection

用于 HTTP 通信


三、TCP 通信基础:Socket 编程

3.1 基本流程图

代码语言:javascript
代码运行次数:0
运行
复制
css复制编辑[客户端 Socket] ---> [服务器 ServerSocket -> Socket]
            <--- 回应数据

3.2 TCP 服务端示例

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑import java.io.*;
import java.net.*;

public class TcpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务器启动,等待连接...");

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

        BufferedReader in = new BufferedReader(
                new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        String msg;
        while ((msg = in.readLine()) != null) {
            System.out.println("收到客户端:" + msg);
            out.println("服务端回应:" + msg.toUpperCase());
        }

        clientSocket.close();
        serverSocket.close();
    }
}

3.3 TCP 客户端示例

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class TcpClient {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 8888);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        out.println("hello server!");
        System.out.println("服务端回应:" + in.readLine());

        socket.close();
    }
}

📌 多次运行客户端,即可与服务端反复交互。


四、TCP 多线程服务端:支持多个客户端并发

4.1 结构图示意

代码语言:javascript
代码运行次数:0
运行
复制
lua复制编辑       +----------------------+
       |  ServerSocket        |
       +----------+-----------+
                  |
    +-------------+-------------+
    |                           |
 [线程1处理客户端A]   [线程2处理客户端B] ...

4.2 多线程服务端代码

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class MultiThreadServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(9999);
        System.out.println("服务器启动中...");

        while (true) {
            Socket client = server.accept();
            new Thread(new ClientHandler(client)).start();
        }
    }
}

class ClientHandler implements Runnable {
    private Socket client;
    public ClientHandler(Socket client) {
        this.client = client;
    }

    public void run() {
        try (
            BufferedReader in = new BufferedReader(
                new InputStreamReader(client.getInputStream()));
            PrintWriter out = new PrintWriter(client.getOutputStream(), true)
        ) {
            String msg;
            while ((msg = in.readLine()) != null) {
                System.out.println("客户端:" + msg);
                out.println("你说的是:" + msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

🎯 使用线程池 (ExecutorService) 可以优化线程创建开销。


五、UDP 通信介绍

TCP 是面向连接的,而 UDP 是无连接、快速但不可靠的协议。

5.1 UDP 发送端示例

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class UdpSender {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket();
        String message = "hello udp!";
        byte[] buffer = message.getBytes();
        InetAddress address = InetAddress.getByName("localhost");

        DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 8888);
        socket.send(packet);
        socket.close();
    }
}

5.2 UDP 接收端示例

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class UdpReceiver {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(8888);
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        System.out.println("等待UDP消息...");
        socket.receive(packet);

        String msg = new String(packet.getData(), 0, packet.getLength());
        System.out.println("收到消息:" + msg);

        socket.close();
    }
}

六、Java 实现简单 HTTP 请求

Java 原生提供了访问 HTTP 的方式:

6.1 使用 URLConnection 发送 GET 请求

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class SimpleHttpClient {
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://httpbin.org/get");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");

        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(conn.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null)
                System.out.println(line);
        }
    }
}

🌐 Java 11 之后也可以使用 HttpClient

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://httpbin.org/get"))
        .build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
System.out.println(response.body());

七、自制简单 Web 服务器

我们可以基于 ServerSocket 实现最基础的 Web 服务。

7.1 响应 HTML 页面的服务端代码

代码语言:javascript
代码运行次数:0
运行
复制
java复制编辑public class SimpleHttpServer {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(8080);
        System.out.println("HTTP 服务启动:http://localhost:8080");

        while (true) {
            Socket client = server.accept();
            new Thread(() -> {
                try (
                    BufferedReader in = new BufferedReader(
                            new InputStreamReader(client.getInputStream()));
                    PrintWriter out = new PrintWriter(client.getOutputStream())
                ) {
                    String line;
                    while (!(line = in.readLine()).isEmpty()) {
                        System.out.println(line);
                    }

                    out.println("HTTP/1.1 200 OK");
                    out.println("Content-Type: text/html");
                    out.println("");
                    out.println("<html><body><h1>Hello from Java!</h1></body></html>");
                    out.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }).start();
        }
    }
}

访问 http://localhost:8080 即可看到响应网页。


八、常见问题与优化建议

8.1 Socket 常见错误

  • 端口被占用:换端口或关闭已有程序
  • 连接被拒绝:服务端未启动或未监听
  • readLine 阻塞:需加上超时或非阻塞逻辑

8.2 安全性建议

  • 添加超时机制 socket.setSoTimeout()
  • 避免使用固定 IP,可支持多网卡
  • 防止命令注入、文件读取漏洞等问题

九、扩展方向推荐

  • 使用 Netty 构建高性能网络框架
  • Java 集成 WebSocket 实现即时通信
  • 构建 REST API Server(可结合 Spring Boot)
  • 多线程性能优化(线程池、NIO)

十、总结

Java 网络编程提供了基础的 Socket API 与高级 HTTP 通信能力,是每个后端开发者都应掌握的基础。本篇文章从最底层的 TCP/UDP 入门,到自定义 Web Server,为你构建网络通信能力打下了坚实基础。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、引言:为何学习 Java 网络编程?
  • 二、Java 网络编程的核心类
  • 三、TCP 通信基础:Socket 编程
    • 3.1 基本流程图
    • 3.2 TCP 服务端示例
    • 3.3 TCP 客户端示例
  • 四、TCP 多线程服务端:支持多个客户端并发
    • 4.1 结构图示意
    • 4.2 多线程服务端代码
  • 五、UDP 通信介绍
    • 5.1 UDP 发送端示例
    • 5.2 UDP 接收端示例
  • 六、Java 实现简单 HTTP 请求
    • 6.1 使用 URLConnection 发送 GET 请求
  • 七、自制简单 Web 服务器
    • 7.1 响应 HTML 页面的服务端代码
  • 八、常见问题与优化建议
    • 8.1 Socket 常见错误
    • 8.2 安全性建议
  • 九、扩展方向推荐
  • 十、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档