首页 > 其他分享 >Socket通信工具类

Socket通信工具类

时间:2023-12-05 11:56:33浏览次数:30  
标签:Socket void 通信 TAG new 工具 mDatagramSocket public Log

Socket通信工具类

TCP客户端

public class TCPClientUtil {
    public static final String TAG = "Control";
    private Socket mSocket;
    private final ExecutorService mExecutorService;

    public TCPClientUtil(){
        mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    }

    public void startClient(final String address,final int port){
        if (address == null){
            return;
        }
        if (mSocket == null){
            Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Log.i(TAG,"TCP启动客户端成功");
                        mSocket = new Socket(address, port);
                        Log.i(TAG,"TCP客户端连接成功");

                        InputStream inputStream = mSocket.getInputStream();
                        byte[] buffer = new byte[1024];
                        int len = -1;
                        while ((len = inputStream.read(buffer))!=-1){
                            // 将读取到的数据复制到一个新的数组中
                            //String s = new String(buffer, 0, len);
                            byte[] data = Arrays.copyOfRange(buffer, 0, len);
                            mIMessageCallback.callback(data);
                            Log.i(TAG, "TCP收到服务器的数据-------:" + Arrays.toString(data));
                        }
                        mIServerDisConnect.callback();
                        Log.i(TAG,"TCP客户端断开连接");
                    } catch (Exception e) {
                        Log.e(TAG,"TCP 客户端无法连接服务器:"+e.getMessage());
                    } finally {
                        try {
                            if (mSocket != null){
                                mSocket.close();
                            }
                        }catch (IOException e){
                            e.printStackTrace();
                        }
                        mSocket = null;
                    }
                }
            };
            mExecutorService.execute(mRunnable);
        }
    }

    public void sendTcpMessage(final byte[] msg){
        if (mSocket != null && mSocket.isConnected()){
            Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        mSocket.getOutputStream().write(msg);
                        mSocket.getOutputStream().flush();
                        Log.i(TAG,"TCP客户端发送数据-------:"+ Arrays.toString(msg));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };
            mExecutorService.execute(mRunnable);
        }
    }

    public boolean isConnect(){
        if (mSocket != null){
            return mSocket.isConnected();
        }else {
            return false;
        }
    }

    public void closeConnect() throws IOException {
        mSocket.close();
    }

    IServerDisConnect mIServerDisConnect;
    public interface IServerDisConnect{
        void callback();
    }

    public void setIServerDisConnect(IServerDisConnect serverDisConnect){
        this.mIServerDisConnect = serverDisConnect;
    }

    IMessageCallback mIMessageCallback;

    public interface IMessageCallback{
        void callback(byte[] bytes);
    }

    public void setIMessageCallback(IMessageCallback messageCallback){
        this.mIMessageCallback = messageCallback;
    }
}

TCP服务端

public class TCPServerUtil {
    public static final String TAG = "TCP";
    private ServerSocket mServerSocket;
    private ExecutorService mExecutorService;
    private Socket mSocket;

    public TCPServerUtil() {
        mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        try {
            Log.i("tcp", "启动服务端");
            mServerSocket = new ServerSocket(8989);
            Log.i("tcp", "服务端连接成功");
        } catch (Exception e) {
            Log.i("tcp", "启动服务端失败");
        }
    }

    public void startSever() {
        Runnable mRunnable = new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        mSocket = mServerSocket.accept();
                        Log.i(TAG, mSocket.getRemoteSocketAddress().toString() + "");
                        InputStream inputStream = mSocket.getInputStream();

                        byte[] buffer = new byte[1024];
                        int len = -1;
                        while ((len = inputStream.read(buffer)) != -1) {
                            byte[] data = Arrays.copyOfRange(buffer, 0, len);
                            //String data = new String(buffer, 0, len);
                            mIMessageCallback.callback(data);
                            Log.i(TAG, "收到客户端的数据-------------------:" + data);
                        }
                        Log.i(TAG, "客户端断开连接");

                    } catch (Exception EE) {
                        EE.printStackTrace();
                        Log.i(TAG, "服务端无法连接服务器" + EE.getMessage());
                        break;

                    } finally {
                        try {
                            if (mServerSocket != null) {
                                mServerSocket.close();
                            }
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        mServerSocket = null;
                    }
                }
            }
        };
        mExecutorService.execute(mRunnable);
    }

    public void sendTcpMessage(final byte[] msg) {
        Runnable mRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    mSocket.getOutputStream().write(msg);
                    mSocket.getOutputStream().flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        mExecutorService.execute(mRunnable);
    }

    public void des() {
        try {
            mServerSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public IMessageCallback mIMessageCallback;

    public interface IMessageCallback {
        void callback(byte[] data);
    }

    public void setIMessageCallback(IMessageCallback messageCallback) {
        this.mIMessageCallback = messageCallback;
    }
}

UDP客户端

ublic class UDPClientUtil {
    public static final String TAG = "Control";
    private DatagramSocket mDatagramSocket;
    private ExecutorService mExecutorService;
    private DatagramPacket sendPacket;
    private DatagramPacket receivePacket;
    private InetSocketAddress address;

    public UDPClientUtil() {
        mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    }

    public void startClient() {
        if (mDatagramSocket == null) {
            Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        Log.i(TAG, "UDP启动客户端");
                        mDatagramSocket = new DatagramSocket(8989);//本机监听的端口
                        mDatagramSocket.setReuseAddress(true);
                        Log.i(TAG, "UDP客户端连接成功");

                        byte[] buffer = new byte[1024];
                        int len = -1;

                        while (true) {
                            receivePacket = new DatagramPacket(buffer, buffer.length);
                            mDatagramSocket.receive(receivePacket);
                            Log.i(TAG, receivePacket.getAddress().toString() + ":" + receivePacket.getPort());
                            byte[] data = Arrays.copyOfRange(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
                            //String data = new String(receivePacket.getData(), 0, receivePacket.getData().length, "utf-8");//针对中文要采用utf-8
                            mIMessageCallback.callback(data);
                            Log.i(TAG, "收到UDP服务器的数据--------:" + Arrays.toString(data));
                        }
                        //Log.i(TAG, "客户端断开连接");
                    } catch (Exception e) {
                        Log.e(TAG,"UDP 客户端无法连接服务器:"+e.getMessage());
                    } finally {
                        try {
                            if (mDatagramSocket != null) {
                                mDatagramSocket.close();
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        mDatagramSocket = null;
                    }
                }
            };
            mExecutorService.execute(mRunnable);
        }
    }

    /**
     * @param msg  要发送的数据
     * @param ip   目标IP地址
     * @param port 目标端口号
     */
    public void sendUdpMessage(final byte[] msg, final String ip, final int port) {
        if (mDatagramSocket != null) {
            Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(ip), port);
                        mDatagramSocket.send(sendPacket);
                        Log.i(TAG,"UDP客户端发送数据-------:"+ Arrays.toString(msg)+"向服务器发送"+ip+":"+port);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };
            mExecutorService.execute(mRunnable);
        }
    }

    public boolean isConnect(){
        if (mDatagramSocket != null){
            return mDatagramSocket.isConnected();
        }else {
            return false;
        }
    }

    public void closeConnect(){
        mDatagramSocket.close();
    }

    IMessageCallback mIMessageCallback;

    public interface IMessageCallback {
        void callback(byte[] data);
    }

    public void setIMessageCallback(IMessageCallback messageCallback) {
        this.mIMessageCallback = messageCallback;
    }
}

UDP服务端

public class UDPServerUtil {
    public static final String TAG = "UDP";
    private DatagramSocket mDatagramSocket;
    private ExecutorService mExecutorService;
    private DatagramPacket sendPacket;
    private DatagramPacket receivePacket;


    public UDPServerUtil() {
        mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
        try {
            Log.i(TAG, "启动服务端");
            mDatagramSocket = new DatagramSocket(8989);
            Log.i(TAG, "服务端连接成功");
        } catch (Exception e) {
            Log.i(TAG, "启动服务端失败");
        }
    }

    public void startClient() {
        Runnable mRunnable = new Runnable() {
            @Override
            public void run() {
                try {
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    receivePacket = new DatagramPacket(buffer, buffer.length);
                    while (true) {
                        mDatagramSocket.receive(receivePacket);
                        byte[] data = Arrays.copyOfRange(receivePacket.getData(), receivePacket.getOffset(), receivePacket.getLength());
                        //String data = new String(receivePacket.getData(), 0, buffer.length, "utf-8");//针对中文要采用utf-8
                        mIMessageCallback.callback(data);
                        Log.i(TAG, "收到服务器的数据-------------------:" + data);
                    }
                } catch (Exception EE) {
                    EE.printStackTrace();
                    Log.i(TAG, "客户端无法连接服务器" + EE.getMessage());

                } finally {
                    try {
                        if (mDatagramSocket != null) {
                            mDatagramSocket.close();
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    mDatagramSocket = null;
                }
            }
        };
        mExecutorService.execute(mRunnable);
    }

    public void sendTcpMessage(final byte[] msg, final String ip, final int port) {
        if (mDatagramSocket != null) {
            Runnable mRunnable = new Runnable() {
                @Override
                public void run() {
                    try {
                        sendPacket = new DatagramPacket(msg, msg.length, InetAddress.getByName(ip), port);
                        mDatagramSocket.send(sendPacket);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };
            mExecutorService.execute(mRunnable);
        }
    }

    public void des() {
        try {
            mDatagramSocket.close();
        } catch (Exception e) {
            Log.i(TAG, e.toString());
        }
    }

    public IMessageCallback mIMessageCallback;

    public interface IMessageCallback {
        void callback(byte[] data);
    }

    public void setIMessageCallback(IMessageCallback messageCallback) {
        this.mIMessageCallback = messageCallback;
    }
}

标签:Socket,void,通信,TAG,new,工具,mDatagramSocket,public,Log
From: https://www.cnblogs.com/liaomengjie/p/17876896.html

相关文章

  • 1、KVM安装部署及virt-manager图形化工具创建安装虚拟机、命令行工具virt-install创建
    摘自:https://blog.51cto.com/mfc001/6408159KVM安装部署KVM做单机管理虚拟机,Openstack集群管理虚拟机docker单机管理容器,k8s集群管理容器宿主机环境准备在vmware安装linux系统,并在设置中开启虚拟化CPU开启虚拟化一:开启虚拟化引擎两项内容二:提高内存和处理......
  • ChatGPT 同类工具推荐
    原文:https://openaigptguide.com/chatgpt-similar%20software/ChatGPT是一款由美国OpenAI公司开发的人工智能语言模型,类似的软件有:火山写作(VolcanoWriting):它是一款用户友好的写作软件,可以自动生成具有创造性和连贯性的文本。这款软件的功能丰富,支持快速生成文章、段落、句......
  • minio 新的minio grid server 通信框架
    在最近的minio发布中,官方介绍了一个内部实现miniogrid可以实现基于websocket的server通信,可以提升集群的server数量,比较适合小,中型的数据通信任务,看着很不错,值得看看参考资料https://github.com/minio/minio/blob/master/internal/grid/README.md?plain=1https://github.c......
  • WebSocket简介
    WebSocket(简称为ws)是一种在Web应用程序中实现双向通信的协议。以下是一个使用JavaScript实现的简单WebSocket示例://创建WebSocket对象并建立连接constsocket=newWebSocket("wss://example.com/socket");//连接建立时触发的事件socket.onopen=function(){......
  • cosmo 开源apollo Graphos 工具
    cosmo时候一个graphql联邦工具,可以用来方便的进行graphql协作参考架构说明wundergraph团队开源了不少graphql相关的工具了,cosmo是一个graphql联邦值得学习的工具参考资料https://cosmo-docs.wundergraph.com/https://github.com/wundergraph/cosmo......
  • 【SpringBootWeb入门-2】请求响应-请求-Postman工具
    JavaWeb开发最常见的就是各类数据的请求以及响应,在讲解请求参数接收内容之前,我们先来介绍一款功能强大的接口测试工具:Postman。Postman介绍:一款功能强大的网页调试与发送网页HTTP请求的Chrome插件,作用:常用于进行接口测试。为什么要使用Postman?当前最为主流的开发模式是前后端分......
  • Java基础故障处理工具
    适用场景:生产环境由于可视化工具侵入系统,带来资源占用、安全问题或者规模较小未部署可视化监控平台,此时要使用基础命令行工具;给一个系统定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。这里说的数据包括但不限于异常堆栈、虚拟机运行日志、垃圾......
  • Java 内存分析工具 Arthas 介绍与示例讲解
    目录一、概述二、Arthas安装三、Arthas主要组成结构四、Arthas通信主要流程五、Arthas快速入门讲解1)启动Arthas2)基础命令介绍3)jvm相关1、dashboard(实时数据面板)2、Thread(线程相关堆栈信息)3、jvm(查看当前JVM的信息)4、memory(查看JVM的内存信息)5、sysprop(查看/修改属性)6、s......
  • 远程网关XD-K30S—实现PLC无线远程通信技术
    远程网关XD-K30S—实现PLC无线远程通信技术XD-K30S远程网关技术具有一系列的特点和优势。首先,它支持多种协议的数据传输,包括Modbus、CAN、TCP/IP等,可以方便地与各种PLC设备进行集成。其次,该技术非常稳定可靠,可实现24小时持续运行,提供了高效的远程控制和数据采集手段。XD-K30S远......
  • 华为不光有“遥遥领先”, 还有专门为程序员开发的工具
     今天搜华为发现一款特别好用的云端构建工具,试用了一下,还蛮不错,感觉比在本地构建快多了,也蛮适合多人协作的。地址也附上了:https://www.huaweicloud.com/product/cloudbuild.html?utm_source=developer.huaweicloud&utm_content=20231204简单说一下执行构建的方式吧,步骤如下:......