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;
    }
}
相关推荐
望获linux1 小时前
【实时Linux实战系列】Linux 内核的实时组调度(Real-Time Group Scheduling)
java·linux·服务器·前端·数据库·人工智能·深度学习
Never_Satisfied1 小时前
在 JavaScript 中,删除数组中内容为xxx的元素
java·前端·javascript
MC丶科1 小时前
【SpringBoot常见报错与解决方案】端口被占用?Spring Boot 修改端口号的 3 种方法,第 3 种 90% 的人不知道!
java·linux·spring boot
怪兽20141 小时前
Redis常见性能问题和解决方案
java·数据库·redis·面试
zz-zjx1 小时前
JVM 内存结构与 GC 机制详解( 实战优化版)
java·jvm·tomcat
nvvas2 小时前
Android Studio JAVA开发按钮跳转功能
android·java·android studio
CV工程师丁Sir2 小时前
Rokid设备连接全解析:蓝牙与Wi-Fi通信源码深度剖析
java
zoyation2 小时前
多线程简介和在JAVA中应用
java·开发语言
rechol2 小时前
类与对象(中)笔记整理
java·javascript·笔记
周杰伦_Jay2 小时前
【Spring Boot从入门到精通】原理、实战与最佳实践
java·spring boot·后端