最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于SpringBoot實現(xiàn)多線程多主機TCP通信

 更新時間:2025年09月19日 14:50:15   作者:IT界Tony哥  
這篇文章主要為大家詳細介紹了如何基于SpringBoot實現(xiàn)多線程多主機TCP通信,包括發(fā)送數(shù)據(jù)和接收應答并解析,感興趣的小伙伴可以跟隨小編一起學習一下

下面我將介紹如何使用 Spring Boot 實現(xiàn)多線程、多主機的 TCP 通信,包括發(fā)送數(shù)據(jù)和接收應答并解析。

1. 項目結(jié)構(gòu)

src/main/java/com/example/tcpdemo/
├── config
│   └── TcpClientConfig.java
├── controller
│   └── TcpController.java
├── handler
│   ├── TcpClientHandler.java
│   └── TcpResponseHandler.java
├── model
│   └── TcpHost.java
├── service
│   ├── TcpClientService.java
│   └── impl
│       └── TcpClientServiceImpl.java
└── TcpDemoApplication.java

2. 核心代碼實現(xiàn)

2.1 配置類

// TcpClientConfig.java
@Configuration
public class TcpClientConfig {
    
    @Value("${tcp.client.thread-pool-size:10}")
    private int threadPoolSize;
    
    @Bean
    public ExecutorService tcpClientExecutor() {
        return Executors.newFixedThreadPool(threadPoolSize);
    }
}

2.2 TCP主機模型

// TcpHost.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TcpHost {
    private String host;
    private int port;
    private String name; // 主機標識名稱
}

2.3 TCP客戶端處理器

// TcpClientHandler.java
@Component
public class TcpClientHandler {
    
    @Autowired
    private ExecutorService tcpClientExecutor;
    
    @Autowired
    private TcpResponseHandler responseHandler;
    
    public void sendToMultipleHosts(List<TcpHost> hosts, String message) {
        hosts.forEach(host -> {
            tcpClientExecutor.execute(() -> {
                try (Socket socket = new Socket(host.getHost(), host.getPort());
                     PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
                    
                    // 發(fā)送數(shù)據(jù)
                    out.println(message);
                    System.out.println("Sent to " + host.getName() + ": " + message);
                    
                    // 接收響應
                    String response = in.readLine();
                    responseHandler.handleResponse(host, response);
                    
                } catch (IOException e) {
                    System.err.println("Error communicating with " + host.getName() + ": " + e.getMessage());
                }
            });
        });
    }
}

2.4 響應處理器

// TcpResponseHandler.java
@Component
public class TcpResponseHandler {
    
    public void handleResponse(TcpHost host, String response) {
        // 這里實現(xiàn)你的響應解析邏輯
        System.out.println("Received from " + host.getName() + ": " + response);
        
        // 示例解析邏輯
        if (response != null) {
            // 假設響應格式為 "status|data"
            String[] parts = response.split("\|");
            if (parts.length == 2) {
                String status = parts[0];
                String data = parts[1];
                System.out.println("Parsed response - Status: " + status + ", Data: " + data);
            }
        }
    }
}

2.5 TCP服務接口

// TcpClientService.java
public interface TcpClientService {
    void sendToHosts(List<TcpHost> hosts, String message);
}

2.6 TCP服務實現(xiàn)

// TcpClientServiceImpl.java
@Service
public class TcpClientServiceImpl implements TcpClientService {
    
    @Autowired
    private TcpClientHandler tcpClientHandler;
    
    @Override
    public void sendToHosts(List<TcpHost> hosts, String message) {
        tcpClientHandler.sendToMultipleHosts(hosts, message);
    }
}

2.7 控制器

// TcpController.java
@RestController
@RequestMapping("/api/tcp")
public class TcpController {
    
    @Autowired
    private TcpClientService tcpClientService;
    
    @PostMapping("/send")
    public ResponseEntity<String> sendMessage(@RequestBody Map<String, Object> request) {
        List<Map<String, Object>> hostsInfo = (List<Map<String, Object>>) request.get("hosts");
        String message = (String) request.get("message");
        
        List<TcpHost> hosts = hostsInfo.stream()
            .map(info -> new TcpHost(
                (String) info.get("host"),
                (Integer) info.get("port"),
                (String) info.get("name")))
            .collect(Collectors.toList());
        
        tcpClientService.sendToHosts(hosts, message);
        
        return ResponseEntity.ok("Messages sent successfully");
    }
}

3. 應用配置

application.propertiesapplication.yml中添加配置:

# TCP客戶端線程池大小
tcp.client.thread-pool-size=20

# 服務器端口
server.port=8080

4. 使用示例

4.1 啟動Spring Boot應用

// TcpDemoApplication.java
@SpringBootApplication
public class TcpDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(TcpDemoApplication.class, args);
    }
}

4.2 發(fā)送請求

使用Postman或curl發(fā)送POST請求:

curl -X POST http://localhost:8080/api/tcp/send \
-H "Content-Type: application/json" \
-d '{
    "hosts": [
        {"host": "127.0.0.1", "port": 12345, "name": "Server1"},
        {"host": "127.0.0.1", "port": 12346, "name": "Server2"}
    ],
    "message": "Hello TCP Server"
}'

5. 高級功能擴展

5.1 連接池管理

// 可以擴展為使用連接池管理TCP連接
@Component
public class TcpConnectionPool {
    private Map<String, Socket> connectionPool = new ConcurrentHashMap<>();
    
    public Socket getConnection(TcpHost host) throws IOException {
        String key = host.getHost() + ":" + host.getPort();
        if (!connectionPool.containsKey(key) || connectionPool.get(key).isClosed()) {
            connectionPool.put(key, new Socket(host.getHost(), host.getPort()));
        }
        return connectionPool.get(key);
    }
    
    public void closeAll() {
        connectionPool.values().forEach(socket -> {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        connectionPool.clear();
    }
}

5.2 超時設置

// 在TcpClientHandler中添加超時設置
public void sendToMultipleHosts(List<TcpHost> hosts, String message) {
    hosts.forEach(host -> {
        tcpClientExecutor.execute(() -> {
            try {
                Socket socket = new Socket();
                socket.connect(new InetSocketAddress(host.getHost(), host.getPort()), 5000); // 5秒連接超時
                socket.setSoTimeout(10000); // 10秒讀取超時
                
                try (PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
                     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
                    
                    out.println(message);
                    System.out.println("Sent to " + host.getName() + ": " + message);
                    
                    String response = in.readLine();
                    responseHandler.handleResponse(host, response);
                }
            } catch (SocketTimeoutException e) {
                System.err.println("Timeout when communicating with " + host.getName());
            } catch (IOException e) {
                System.err.println("Error communicating with " + host.getName() + ": " + e.getMessage());
            }
        });
    });
}

5.3 自定義協(xié)議解析

// 擴展TcpResponseHandler實現(xiàn)更復雜的協(xié)議解析
public void handleResponse(TcpHost host, String response) {
    try {
        // 示例:解析JSON格式響應
        JSONObject jsonResponse = new JSONObject(response);
        String status = jsonResponse.getString("status");
        String data = jsonResponse.getString("data");
        long timestamp = jsonResponse.getLong("timestamp");
        
        System.out.printf("Response from %s - Status: %s, Data: %s, Time: %tF %<tT%n",
            host.getName(), status, data, new Date(timestamp));
        
    } catch (JSONException e) {
        System.err.println("Invalid response format from " + host.getName());
    }
}

6. 注意事項

  • ??線程安全??:確保在多線程環(huán)境下共享資源的線程安全
  • ??資源釋放??:正確關閉Socket、流等資源
  • ??異常處理??:合理處理各種網(wǎng)絡異常
  • ??性能優(yōu)化??:根據(jù)實際需求調(diào)整線程池大小
  • ??日志記錄??:添加詳細的日志記錄以便排查問題

這個實現(xiàn)提供了基本的TCP多線程通信框架,你可以根據(jù)實際需求進行擴展和優(yōu)化。

到此這篇關于基于SpringBoot實現(xiàn)多線程多主機TCP通信的文章就介紹到這了,更多相關SpringBoot TCP通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Spring boot2X Consul如何通過RestTemplate實現(xiàn)服務調(diào)用

    Spring boot2X Consul如何通過RestTemplate實現(xiàn)服務調(diào)用

    這篇文章主要介紹了spring boot2X Consul如何通過RestTemplate實現(xiàn)服務調(diào)用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • Java中Elasticsearch的核心概念詳解

    Java中Elasticsearch的核心概念詳解

    這篇文章主要介紹了Java中Elasticsearch的核心概念詳解,Elasticsearch 是一個分布式、免費和開放的搜索和分析引擎,適用于所有類型的數(shù)據(jù),包括文本、數(shù)字、地理空間、結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),需要的朋友可以參考下
    2023-07-07
  • Java詳細講解IO流的Writer與Reader操作

    Java詳細講解IO流的Writer與Reader操作

    Writer與Reader類不能直接調(diào)用,需要使用多帶的方法調(diào)用它們的子類,在他們的前邊加上一個File即可如(FileWriter或FileReader)的多態(tài)方法進行其調(diào)用,并且他們也是抽象類調(diào)用需要連接接口Exception,它們的優(yōu)點在于可以直接寫入或讀出內(nèi)容,不需要使用byte轉(zhuǎn)八進制
    2022-05-05
  • 詳解SpringBoot時間參數(shù)處理完整解決方案

    詳解SpringBoot時間參數(shù)處理完整解決方案

    這篇文章主要介紹了詳解SpringBoot時間參數(shù)處理完整解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • JDK反序列化時修改類的全限定性名解析

    JDK反序列化時修改類的全限定性名解析

    這篇文章主要介紹了JDK反序列化時修改類的全限定性名解析,具有一定借鑒價值,需要的朋友可以參考下。
    2017-12-12
  • Spring項目中使用Cache?Redis實現(xiàn)數(shù)據(jù)緩存

    Spring項目中使用Cache?Redis實現(xiàn)數(shù)據(jù)緩存

    這篇文章主要為大家介紹了項目中使用Spring?Cache?Redis實現(xiàn)數(shù)據(jù)緩存,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • Java JVM內(nèi)存區(qū)域詳解

    Java JVM內(nèi)存區(qū)域詳解

    下面小編就為大家?guī)硪黄趈vm java內(nèi)存區(qū)域的介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • 簡單分析Java的求值策略原理

    簡單分析Java的求值策略原理

    在本篇文章里小編給大家整理的是一篇關于簡單分析Java的求值策略原理內(nèi)容,有需要的朋友們可以學習下。
    2021-06-06
  • IntelliJ IDEA2020.1 Mac maven sdk 全局配置

    IntelliJ IDEA2020.1 Mac maven sdk 全局配置

    這篇文章主要介紹了IntelliJ IDEA2020.1 Mac maven sdk 全局配置,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • java判斷是否空最簡單的方法

    java判斷是否空最簡單的方法

    在本篇文章里小編給大家整理的一篇關于java判斷是否空最簡單的方法,有興趣的讀者們可以參考下。
    2019-12-12

最新評論

新平| 耿马| 常德市| 浦城县| 兰西县| 来宾市| 巨鹿县| 巍山| 香格里拉县| 东辽县| 罗江县| 武功县| 博乐市| 阜新| 华池县| 汕尾市| 临沭县| 普兰店市| 车致| 华宁县| 含山县| 福海县| 比如县| 鄂托克前旗| 赤城县| 南澳县| 依兰县| 独山县| 北川| 建瓯市| 乐亭县| 宁阳县| 延安市| 长泰县| 尉犁县| 泗阳县| 龙南县| 日喀则市| 湾仔区| 陇西县| 江阴市|