Socket工具类开箱即用

不多说,Socket工具类开箱即用:

java 复制代码
import lombok.extern.slf4j.Slf4j;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;

/**
 * Socket工具类
 */
@Slf4j
public class SocketUtil {
    private final String host;
    private final int port;

    private final int connectionTimeout;
    private final int soTimeout;

    private Socket socket;

    private DataOutputStream dataOutputStream;

    private DataInputStream dataInputStream;

    // 构造器
    public SocketUtil(String host, int port) {
        this(host, port, 5000, 5000);
    }

    // 构造器2
    public SocketUtil(String host, int port, int connectionTimeout, int soTimeout) {
        this.host = host;
        this.port = port;
        this.connectionTimeout = connectionTimeout;
        this.soTimeout = soTimeout;
    }

    /**
     * 打开Socket连接
     *
     * @return 是否成功打开Socket连接
     */
    public boolean openSocket() {
        try {
            socket = new Socket();
            InetSocketAddress socketAddress = new InetSocketAddress(host, port);
            socket.setReuseAddress(true);
            socket.setSoTimeout(soTimeout);
            socket.connect(socketAddress, connectionTimeout);
            dataOutputStream = new DataOutputStream(socket.getOutputStream());
            dataInputStream = new DataInputStream(socket.getInputStream());
        } catch (Exception e) {
            log.error("打开Socket连接失败:", e);
            return false;
        }
        return true;
    }

    public boolean sendData(String data) {
        return sendData(data, "utf-8");
    }

    /**
     * 发送请求数据。
     *
     * @param data    数据
     * @param charset 字符集
     * @return 是否发送成功
     */
    public boolean sendData(String data, String charset) {
        boolean isSend = true;
        try {
            byte[] bytes = data.getBytes(charset);
            dataOutputStream.writeInt(bytes.length);
            dataOutputStream.write(bytes);
        } catch (IOException e) {
            log.error("发送数据失败:", e);
            isSend = false;
        }
        return isSend;
    }

    /**
     * 接收响应数据
     */
    public String receiveData() {
        return receiveData("utf-8");
    }

    /**
     * 接收响应数据
     */
    public String receiveData(String charset) {
        String returnStr = null;
        byte[] data;
        try {
            int length = dataInputStream.readInt();
            if (length > 0) {
                data = new byte[length];
                dataInputStream.readFully(data);
                returnStr = new String(data, charset);
            }
        } catch (IOException e) {
            log.error("接收数据失败:", e);
        }
        return returnStr;
    }

    /**
     * 关闭Socket连接和输入输出流
     */
    public void close() {
        try {
            if (dataInputStream != null) {
                dataInputStream.close();
            }
        } catch (IOException e) {
            log.error("关闭输入流失败:", e);
        }
        try {
            if (dataOutputStream != null) {
                dataOutputStream.close();
            }
        } catch (IOException e) {
            log.error("关闭输出流失败:", e);
        }
        try {
            if (socket != null) {
                socket.close();
            }
        } catch (IOException e) {
            log.error("关闭Socket失败:", e);
        }
    }

    /**
     * Socket短连接发送请求数据
     *
     * @param host        host
     * @param port        端口
     * @param requestData 请求数据
     * @return 响应数据
     */
    public static String send(String host, int port, String requestData) {
        SocketUtil socketUtil = new SocketUtil(host, port);
        String resp = null;
        try {
            if (socketUtil.openSocket()) {
                if (socketUtil.sendData(requestData)) {
                    resp = socketUtil.receiveData();
                } else {
                    log.error("SocketUtil.send发送数据失败");
                }
            } else {
                log.error("SocketUtil.openSocket打开Socket失败");
            }
        } catch (Exception e) {
            log.error("SocketUtil.send发送请求失败:", e);
        } finally {
            socketUtil.close();
        }
        return resp;
    }
}
相关推荐
就叫_这个吧2 分钟前
servlet整合tomcat项目启动报错解决,org.apache.tomcat.util.descriptor.web.WebXml.setVersion
java·servlet·tomcat·apache
Wenzar_2 分钟前
用 JAX 构建可微分光子神经网络仿真器
java·人工智能·深度学习·神经网络
cfm_291419 分钟前
RocksDB 初步了解
java
凡人叶枫26 分钟前
Effective C++ 条款02:宁可以编译器替换预处理器
java·linux·c语言·开发语言·c++
ANnianStriver28 分钟前
PetLumina 03 — 后端目录重构与 Web 管理后台搭建
java·前端·ai·重构·ai编程·claude code
一个儒雅随和的男子39 分钟前
限流算法详细剖析
java·服务器·算法
我是一颗柠檬41 分钟前
【Java项目技术亮点】分布式锁实现与优化:从Redisson到ZooKeeper,彻底搞懂分布式锁的底层原理
java·redis·分布式·中间件·java-zookeeper
ANnianStriver42 分钟前
PetLumina 04 — 管理后台 UI 全面升级
java·ui·ai编程
winlife_1 小时前
全程用 AI 做一款商业级手游 · EP9 收尾与复盘:做到了哪,没做到哪,边界在哪
java·开发语言·人工智能·unity·ai编程·游戏开发·mcp
云恒要逆袭1 小时前
Hello World背后的秘密:Java程序是这样运行的
java·后端·程序员