Android中UDP通信

个人也同意网上的一些观点,Android开发中尽量不使用UDP进行数据通信。
个人观点:1,UDP不能保证数据传输。2,有的手机不能接收UDP数据包。3,个人觉得用HTTP协议更方便,也更能保证数据传输。
不过有的项目,肯定还是要用到UDP协议,在目前项目中用到了UDP,就简单做个总结。代码还需要优化。
UDP工具类:
public class UdpMessageTool {
    private byte[] bytes = new byte[2048];
    // DatagramSocket代表UDP协议的Socket,作用就是接收和发送数据报
    private DatagramSocket mDatagramSocket = null;
    public static UdpMessageTool instance;

    // 创建UdpMessageTool对象

    public UdpMessageTool() throws Exception {
        // 初始化DatagramSocket,也可以传入指定端口号
        mDatagramSocket = new DatagramSocket();
    }

    // 操作类获取单例实例
    public static UdpMessageTool getInstance() throws Exception {
        if (instance == null) {
            instance = new UdpMessageTool();
        }
        return instance;
    }

    // 设置超时时间
    public final void setTimeOut(final int timeout) throws Exception {
        mDatagramSocket.setSoTimeout(timeout);
    }

    // 获取DatagramSocket对象
    public final DatagramSocket getDatagramSocket() {
        return mDatagramSocket;
    }

    // 向指定的服务端发送数据信息. 参数介绍: host 服务器主机地址 port 服务端端口 bytes 发送的数据信息
    public final synchronized void send(final String host, final int port,
            final byte[] bytes) throws IOException {
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length,
                InetAddress.getByName(host), port);
        mDatagramSocket.send(dp);
    }

    // 接收从指定的服务端发回的数据. hostName 服务端主机 hostPort 服务端端口 return 服务端发回的数据.
    public final synchronized String receive(final String hostName,
            final int hostPort) {
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        try {
            mDatagramSocket.receive(dp);
        } catch (Exception e) {
            e.printStackTrace();
            return "";
        }
        String result = new String(dp.getData(), 0, dp.getLength());
        return result;
    }

    // 关闭udp连接
    public final void close() {
        if (mDatagramSocket != null) {
            try {
                mDatagramSocket.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
            mDatagramSocket = null;
        }

    }
}
在Activity中操作
public class MainActivity extends Activity {
    private UdpMessageTool mUdpMessageTool;
    // 服务器主机ip
    private static final String HOST = "192.168.0.0";
    // 服务器请求端口号
    private static final int PORT = 12345;
    // 随便定义的发送内容,发送格式是与服务器端协议
    private static final String CONTENT = "SEND MESSAGE?key1=abc&key2=cba";
    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            String result = (String) msg.obj;
            if (!TextUtils.isEmpty(result)) {
                Toast.makeText(MainActivity.this, "收到的数据是:" + result,
                        Toast.LENGTH_SHORT).show();
            }
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.udp).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        //Looper.prepare();
                        sendDataByUDP();
                    }
                }).start();
            }
        });
    }

    private void sendDataByUDP() {
        try {
            mUdpMessageTool = UdpMessageTool.getInstance();
            mUdpMessageTool.setTimeOut(5000);// 设置超时为5s
            // 向服务器发数据
            mUdpMessageTool.send(HOST, PORT, CONTENT.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            String result = mUdpMessageTool.receive(HOST, PORT);
            Thread.sleep(2000);
            if (result == null) {
                Message msg = new Message();
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        mUdpMessageTool.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值