UDP的数据传输

一.准备工作

 

   private static DatagramSocket dSocket;
    private static InetAddress inetAddress;//表示互联网协议(IP)地址
    private static WifiManager.MulticastLock lock = BaseApplication.lock;

 

    public static WifiManager.MulticastLock lock;
    public static WifiManager wfm;
  // 有的手机不能直接接收UDP包,可能是手机厂商在定制Rom的时候把这个功能给关掉了。实例化一个WifiManager.MulticastLock
  // 对象lock, 在调用广播发送、接收报文之前先调用lock.acquire()方法;
  // 用完之后及时调用lock.release()释放资源,否决多次调用lock.acquire()方法,程序可能会崩.
        wfm = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        lock = wfm.createMulticastLock("wifi lcb");

 

 

InetAddress类

 

Java.net包中有InetAddress类的定义,InetAddress类的对象用于IP地址和域名,该类提供以下方法:
getByName(String s):获得一个InetAddress 类的对象,该对象中含有主机的IP地址和域名,该对象用如下格式表示它包含的信息:www.sina.com.cn/202.108.37.40;
 
String getHostName():获取InetAddress对象的域名;
 
String getHostAddress():获取InetAddress对象的IP地址;
 

getLocalHost():获得一个InetAddress对象,该对象含有本地机的域名和IP地址。

 

二.向服务器发送数据

 

 

public static String Send(String ip, int port, byte[] data) {
        try {
            //在给定主机名的情况下确定主机的IP地址,如果参数为null,获得的是本机的IP地址
            inetAddress = InetAddress.getByName(ip);
        } catch (UnknownHostException e) {
            e.printStackTrace();
            Logs.i("udputil 25    " + e);
        }
        try {
            dSocket = new DatagramSocket();
            dSocket.setSoTimeout(10000);// 如果对方连接状态10秒没有收到数据的话强制断开客户端
        } catch (SocketException e) {
            e.printStackTrace();
            Logs.i("udputil 32    " + e);
        }
        // 创建一个DatagramPacket对象,用于发送数据。
        // 参数一:要发送的数据 参数二:数据的长度 参数三:服务端的网络地址 参数四:服务器端端口号
        DatagramPacket dPacket = new DatagramPacket(data, data.length, inetAddress, port);
        try {
            dSocket.send(dPacket);
            Logs.i(dPacket.getAddress() + "  udputil 45  " + dPacket.getPort());
//            Logs.i("udputil 47    " + Arrays.toString(dPacket.getData()));
        } catch (IOException e) {
            e.printStackTrace();
            Logs.i("udputil 50    " + e);
        }
        String s = Recevice();
        return s;
    }


三.从服务器接收数据

 

 

private static String Recevice() {
        String result = "NO RESPONSE";
        byte[] dataRec = new byte[66];
        DatagramPacket dPacket = new DatagramPacket(dataRec, dataRec.length);
        try {
            lock.acquire();
            dSocket.receive(dPacket);
            lock.release();
            result = new String(dPacket.getData());
//            Logs.i("udputil 66          " + result + "\n" + Arrays.toString(dPacket.getData()));
        } catch (IOException e) {
            e.printStackTrace();
            Logs.i("udputil 69    " + e);
        }
        dSocket.close();
        return result;
    }

 

 

 

 

 

四.DatagramSocket的方法

 

1.      InputStream      getInputStream()     从socket中获取输入流

2.      OutputStream  getOutputStream() 从socket中获取输出流

3.      int              getLocalPort()     获取本地的端口,端口用于监听服务器端的返回值,如果没绑定则为-1

4.      int              getPort()    获取连接的服务器端的连接端口,如果没连接则为0

5.      InetAddress    getInetAddress()  获取另一端的IP地址,toString后为/加上IP地址。

6.      InetAddress     getLocalAddress()  获取本地的IP地址,toString后如:/10.0.11.204

7.      SocketAddress  getRemoteSocketAddress()获取另一端的IP和端口,toString后如:/10.0.11.204:8808

8.      SocketAddress getLocalSocketAddress()  获取本地的IP和端口,toString后如:/10.0.11.204:3513

9.      Int         getReceiveBufferSize() 获取接收端Socket的缓冲大小,默认是8kb.有get就有set。

10.   Boolean    isBound       是否此套接字绑定到本地地址和端口


五.整个UDP传输的大致流程

 

如果做为客户端,调用顺序应该是这样。
dSocket = new DatagramSocket();

//但作为服务器的话DatagramSocket(端口)要添加端口号


inetAddress = InetAddress.getByName(svrIpAddress);


DatagramPacket dPacket = new 

DatagramPacket(byData, length, inetAddress, svrPort);


dSocket.send(dPacket);

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值