Java网络编程封装

简介: Java网络编程封装原理旨在隐藏底层通信细节,提供简洁、安全的高层接口。通过简化开发、提高安全性和增强可维护性,封装使开发者能更高效地进行网络应用开发。常见的封装层次包括套接字层(如Socket和ServerSocket类),以及更高层次的HTTP请求封装(如RestTemplate)。示例代码展示了如何使用RestTemplate简化HTTP请求的发送与处理,确保代码清晰易维护。

Java 网络编程封装原理主要围绕着将底层的网络通信细节隐藏起来,提供简洁、易用且安全的高层接口,方便开发者进行网络应用开发。下面从封装的目标、常见的封装层次和具体的封装实现原理等方面详细介绍。
封装的目标
简化开发:底层的网络通信涉及到许多复杂的细节,如套接字的创建、连接的建立、数据的传输和接收等。通过封装,开发者可以使用更简单的接口来完成这些操作,无需关心底层的具体实现。
提高安全性:封装可以对网络通信的关键部分进行安全处理,例如对数据进行加密、验证等,防止数据在传输过程中被窃取或篡改。
增强可维护性和可扩展性:将网络通信的逻辑封装在独立的模块中,使得代码结构更加清晰,便于维护和扩展。当需要更改网络通信的实现方式时,只需修改封装模块的内部代码,而不会影响到使用该封装的其他部分。
常见的封装层次
套接字层封装
Java 的 java.net 包提供了基本的套接字(Socket)类,包括 Socket 和 ServerSocket,用于实现 TCP 通信,以及 DatagramSocket 用于实现 UDP 通信。这些类已经对底层的网络操作进行了一定程度的封装,但仍然需要开发者手动处理很多细节。例如,创建一个简单的 TCP 服务器:

代码如下:

package cn.ctg.common.util;

import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;
import java.util.Map;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * http请求
 */
@Slf4j
public class HttpUtils {

    public static String doGet(String url) {
        return doGet(url, null);
    }

    public static String doGet(String url, Map<String, String> map) {

        String resultString = "";
        RestTemplate client = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        // 参数设置
        MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
        if (CollectionUtil.isNotEmpty(map)) {
            for (String key : map.keySet()) {
                params.add(key, map.get(key));
            }
        }

        try {

            // 设置表单提交
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(
                    params, headers);
            // 执行HTTP请求
            ResponseEntity<String> response = client.exchange(url, HttpMethod.GET, requestEntity, String.class);
            resultString = response.getBody();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }

        return resultString;

    }

    public static String doPost(String url) {
        return doPost(url, null);
    }

    public static String doPost(String url, Map<String, String> map) {

        String resultString = "";
        ResponseEntity<String> response = null;
        RestTemplate client = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        // 参数设置
        MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
        if (CollectionUtil.isNotEmpty(map)) {
            for (String key : map.keySet()) {
                params.add(key, map.get(key));
            }
        }

        try {

            // 请勿轻易改变此提交方式,大部分的情况下,提交方式都是表单提交
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(
                    params, headers);
            // 执行HTTP请求
            response = client.exchange(url, HttpMethod.POST, requestEntity, String.class);
            resultString = response.getBody();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return resultString;

    }

    public static String doPostJson(String url, String json) {

        String resultString = "";
        RestTemplate client = new RestTemplate();
        ResponseEntity<String> response = null;
        // 提交方式设置
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<String> requestEntity = new HttpEntity<String>(json, headers);
        try {
            // 执行HTTP请求
            response = client.exchange(url, HttpMethod.POST, requestEntity, String.class);
            resultString = response.getBody();

        } catch (Exception e) {
            log.error(e.getMessage(), e);
        } finally {
            try {

            } catch (Exception e) {
                // TODO Auto-generated catch block
                log.error(e.getMessage(), e);
            }
        }
        return resultString;

    }


    /**
     * 创建http请求头
     * @param url
     * @return
     * @throws Exception
     */
    public static URLConnection FactoryCreatURLConnection(String url) throws Exception {
        URL realUrl;
        URLConnection conn = null;
        try {
            // 打开和URL之间的连接
            realUrl = new URL(url);
            conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "text/plain;charset=utf-8");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
        } catch (MalformedURLException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 判断连接是否可用
     * 
     * @param url http请求地址
     * @return
     */
    public static boolean isRearchUrl(String url) {
        return isRearchUrl(url, 3000);
    }

    /**
     * 判断连接是否可用
     * 
     * @param url http请求地址
     * @return
     */
    public static boolean isRearchUrl(String url, int timeout) {

        if (StringUtils.isEmpty(url)) {
            return false;
        }
        HttpURLConnection connection = null;
        try {
            connection = (HttpURLConnection) new URL(url).openConnection();
            // 设置超时时间
            connection.setConnectTimeout(timeout);
            connection.setReadTimeout(timeout);
            if (connection.getResponseCode() >= HttpURLConnection.HTTP_OK
                    && connection.getResponseCode() <= HttpURLConnection.HTTP_VERSION) {
                return true;
            }
        } catch (Exception e) {
            log.error(" HttpURLConnection exception happend!");
            return false;
        } finally {
            if (connection != null) {
                connection.disconnect();
            }
        }
        return false;
    }

    /**
     * 判断ip是否能ping通
     */
    public static boolean checkIp(String ipAddr) {
        try {
            boolean status = false;
            if (!StringUtils.isEmpty(ipAddr)) {
                int timeOut = 3000; // 超时 3秒
                status = InetAddress.getByName(ipAddr).isReachable(timeOut);
                return status;
            }
            return status;
        } catch (UnknownHostException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }


}
相关文章
|
5月前
|
JavaScript
Vue中Axios网络请求封装-企业最常用封装模式
本教程介绍如何安装并配置 Axios 实例,包含请求与响应拦截器,实现自动携带 Token、错误提示及登录状态管理,适用于 Vue 项目。
220 1
|
6月前
|
JSON 移动开发 网络协议
Java网络编程:Socket通信与HTTP客户端
本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
|
8月前
|
Java 数据库连接 数据库
Java 组件详细使用方法与封装实战指南
本指南详解Java核心组件使用与封装技巧,涵盖跨平台开发、面向对象编程、多线程、数据库操作等关键内容,并提供工具类、连接池、异常及响应结果的封装方法。结合Spring框架、MyBatis、Spring Boot等主流技术,助你掌握高质量Java组件设计与开发实践。
246 2
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
254 1
|
4月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
268 1
|
4月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
467 0
|
11月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
496 23
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。