多主机 TCP 通信

下面我会以最常见的 多主机 TCP 通信 为例,提供一个可直接运行的完整示例,帮你理解 Java 如何处理多主机交互的核心逻辑。

核心实现思路

  1. 设计一个通用的 HostClient 类,封装与单个主机的连接、数据发送 / 接收逻辑
  2. 使用线程池管理多个主机的连接(避免单线程阻塞,提高并发效率)
  3. 主线程统一调度,向多个不同主机发送请求并处理响应

完整代码示例

java

运行

复制代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 多主机交互的核心示例
 * 功能:同时连接多个远程主机,发送消息并接收响应
 */
public class MultiHostCommunication {

    // 线程池(核心数根据CPU核心数调整,适合处理多主机并发)
    private static final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);

    public static void main(String[] args) {
        // 定义需要交互的多主机列表(IP+端口)
        List<HostInfo> hostList = new ArrayList<>();
        hostList.add(new HostInfo("192.168.1.100", 8080, "Hello Host 1!"));
        hostList.add(new HostInfo("192.168.1.101", 8080, "Hello Host 2!"));
        hostList.add(new HostInfo("192.168.1.102", 8080, "Hello Host 3!"));

        // 并发处理多主机请求
        for (HostInfo host : hostList) {
            executor.submit(() -> {
                try (HostClient client = new HostClient(host.getIp(), host.getPort())) {
                    // 发送消息
                    client.sendMsg(host.getMsg());
                    // 接收响应
                    String response = client.receiveMsg();
                    System.out.printf("主机 %s:%d 响应:%s%n", host.getIp(), host.getPort(), response);
                } catch (IOException e) {
                    System.err.printf("连接主机 %s:%d 失败:%s%n", host.getIp(), host.getPort(), e.getMessage());
                }
            });
        }

        // 关闭线程池(等待所有任务完成)
        executor.shutdown();
        try {
            if (!executor.awaitTermination(30, TimeUnit.SECONDS)) {
                executor.shutdownNow();
            }
        } catch (InterruptedException e) {
            executor.shutdownNow();
        }
    }

    /**
     * 主机信息封装类
     */
    static class HostInfo {
        private final String ip;
        private final int port;
        private final String msg;

        public HostInfo(String ip, int port, String msg) {
            this.ip = ip;
            this.port = port;
            this.msg = msg;
        }

        // getter方法
        public String getIp() { return ip; }
        public int getPort() { return port; }
        public String getMsg() { return msg; }
    }

    /**
     * 单个主机的通信客户端
     */
    static class HostClient implements AutoCloseable {
        private final Socket socket;
        private final OutputStreamWriter writer;
        private final BufferedReader reader;

        // 构造方法:建立与单个主机的连接
        public HostClient(String ip, int port) throws IOException {
            this.socket = new Socket(ip, port);
            this.writer = new OutputStreamWriter(socket.getOutputStream(), "UTF-8");
            this.reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
        }

        // 发送消息到主机
        public void sendMsg(String msg) throws IOException {
            writer.write(msg + "\n"); // 换行作为消息结束标识
            writer.flush();
        }

        // 接收主机的响应
        public String receiveMsg() throws IOException {
            return reader.readLine(); // 读取一行响应
        }

        // 关闭连接(实现AutoCloseable,支持try-with-resources)
        @Override
        public void close() throws IOException {
            if (reader != null) reader.close();
            if (writer != null) writer.close();
            if (socket != null) socket.close();
        }
    }
}

代码关键说明

  1. 线程池(ExecutorService)

    • 核心作用是并发处理多主机连接,避免为每个主机创建独立线程导致资源耗尽
    • newFixedThreadPool 固定线程数,适合处理数量可控的多主机场景
  2. HostClient 类

    • 封装了单个主机的 TCP 连接、发送、接收逻辑
    • 实现 AutoCloseable 接口,配合 try-with-resources 语法自动关闭连接,避免资源泄漏
  3. 异常处理

    • 针对每个主机的连接 / 通信异常单独捕获,不会因为一个主机失败导致整个程序终止
    • 线程池的优雅关闭(shutdown() + awaitTermination()),确保所有任务有足够时间执行

扩展场景适配

如果你的 "多主机" 需求不是 TCP 通信,可基于此框架调整核心逻辑:

  • 多主机 HTTP 请求 :替换 HostClientHttpClient(Java 11+ 内置),并发调用多个主机的 HTTP 接口
  • 多主机文件传输 :基于 FTP/SFTP 协议(可使用 JSch 库),批量向多主机上传 / 下载文件
  • 多主机状态监控:定时向多主机发送心跳包,检测主机是否在线

总结

  1. Java 处理多主机交互的核心是并发编程 (线程池)+ 资源封装(单个主机的交互逻辑)
  2. 必须为每个主机的交互单独处理异常,避免 "一个主机失败影响全部"
  3. 优先使用 try-with-resources 管理网络连接、流等资源,防止资源泄漏
相关推荐
weixin_604236674 小时前
华三 路由器 极简核心配置
运维·服务器·网络·h3c·h3c路由器
sun0077005 小时前
SniffMaster(读取苹果的ats文件) 和 wireshark
windows
换个昵称都难8 小时前
webrtc 音频模块FEC模块
网络·音视频·webrtc
youngerwang8 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby9 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
caimouse9 小时前
Reactos 第 5 章 进程与线程 — 5.8 Windows 的 APC 机制
c语言·windows
PHP隔壁老王邻居9 小时前
windows菜单搜索栏无法显示历史记录或者无法使用修复方法
windows
zjun10019 小时前
TCP专栏-4.四次挥手
网络协议·tcp/ip
道一2310 小时前
Windows系统查看端口占用进程的3种实用方法
windows·笔记
半条-咸鱼10 小时前
【INACCESSIBLE_BOOT_DEVICE】安装 Config Tool 后 Windows 蓝屏,最终通过 VMware 虚拟机解决
windows·stm32·vmware·芯片