udp工具类

最近在做车联网使用UDP和车载端进行数据交互,网上找了很多UDP数据发送和接收的居然都不成功,(可发送接收不到数据)。

重点是DatagramPacket发送和接收的不能使用同一个。

附上代码:

public class UdpSocket {

    private DatagramSocket socket;

    public static final int UDPPORT = 8888;

    private Handler handler;

    private boolean getMessage;

    public UdpSocket(Handler handler) throws SocketException {

        this.handler = handler;

        getMessage = true;

        if (socket == null) {

            socket = new DatagramSocket(UDPPORT);

        }

    }

    byte data[] = new byte[1024];

    public void initSocket() {

        ExecutorUtil.execute(new Runnable() {

            @Override

            public void run() {

                try {

                    DatagramPacket datagramPackage = new DatagramPacket(data, data.length);

                    while (true) {

                        socket.receive(datagramPackage);

//                        LogUtils.e("UdpSocket1"+ new String(datagramPackage.getData(), datagramPackage.getOffset(), datagramPackage.getLength()));

                        //接收到的byte[]

                        byte[] m = Arrays.copyOf(datagramPackage.getData(), datagramPackage.getLength());

                        LogUtils.e("UdpSocket2" + datagramPackage.getPort() + "=" + datagramPackage.getAddress() + "=" + bytesToHexString(m));

                        byte[] bytes = datagramPackage.getData();

                        LogUtils.e("UdpSocket3" + bytesToHexString(bytes));

                        String msg = bytesToHexString(m);

                        LogUtils.e(msg);

                        Message msg1 = handler.obtainMessage();

                        msg1.obj = bytesToHexString(bytes);

                        msg1.what = 10;

                        handler.sendMessage(msg1);

                    }

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

        });

    }

    public void getUdpData() {

        try {

            DatagramPacket udpPacket = new DatagramPacket(data, data.length);

            while (getMessage) {

                try {

                    socket.receive(udpPacket);

                } catch (Exception e) {

                }

                //接收到的byte[]

                byte[] m = Arrays.copyOf(udpPacket.getData(), udpPacket.getLength());

            }

            socket.close();

        } catch (Exception e1) {

            e1.printStackTrace();

        }

    }

    public void sendUdp(final String message, final String address, final int port) {

        ExecutorUtil.execute(new Runnable() {

            @Override

            public void run() {

                try {

                    InetAddress serverAddress = null;

                    serverAddress = InetAddress.getByName(address);

                    byte data[] = message.getBytes();

                    DatagramPacket datagramPacket = new DatagramPacket(data, data.length, serverAddress, port);

                    socket.send(datagramPacket);

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        });

    }

    public static String bytesToHexString(byte[] bytes) {

        String result = "";

        for (int i = 0; i < bytes.length; i++) {

            String hexString = Integer.toHexString(bytes[i] & 0xFF);

            if (hexString.length() == 1) {

                hexString = '0' + hexString;

            }

            result += hexString.toUpperCase();

        }

        return result;

    }

}



使用方法:


private UdpSocket udpSocket;

try { udpSocket = new UdpSocket(handler); udpSocket.sendUdp(message + "", ip, server_port); udpSocket.initSocket();} catch (Exception e) { e.printStackTrace();}

传入的message 是发送的消息数据。类型String.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,673评论 1 114
  • 先创建服务端的APP 1.官网下载Winrun4j。http://winrun4j.sourceforge.net...
    Alex_1799阅读 1,818评论 1 2
  • 中午路遇两车冲突,一司机下车,拦着另一辆不放,口中道:“你骂人是不对的,有话好好说不行吗?” 我以为一幕社会素质教...
    舒笙雨阅读 574评论 1 2
  • 乔森是个神枪手。 他从小痴迷于枪械,于是苦练枪法。二十多年来除了枪法精进,他还练就了一双千里眼。这双眼睛对他来说简...
    小夜姬阅读 554评论 2 1