我是靠谱客的博主 忧伤猎豹,最近开发中收集的这篇文章主要介绍socket通过UDP获得服务端IP并建立TCP连接,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在不知道服务端IP的情况下能自动获取服务端IP并建立连接

1.服务端通过MulticastSocket发送本机IP到客户端

2.客户端接收到服务端的消息解析出服务端IP并建立基于TCP的socket连接;

说明:

DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送到多个客户端

若要使用多点广播,则需要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的所有所有主机都能收到该数据报。IP多点广播(或多点发送)实现了将单一信息发送到多个接受者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每一个多点广播地址都被看做一个组,当客户端需要发送、接收广播信息时,加入到改组即可。

组播地址:称为组播组的一组主机所共享的地址。组播地址的范围在224.0.0.0--- 239.255.255.255之间(都为D类地址 1110开头)。 

 写的不对的地方欢迎大家批评指正

客户端代码:

   /*发送广播端的socket*/
    private MulticastSocket ms;
    String multicastHost = "224.0.0.130";
    InetAddress receiveAddress;
    private TextView showIPTxt;
    /*服务器IP*/
    private String serverIP;


 try {
            ms = new MulticastSocket(8888);
            receiveAddress = InetAddress.getByName(multicastHost);
            ms.joinGroup(receiveAddress);
            recevie();
        } catch (Exception e1) {
            e1.printStackTrace();
        }

   /**
     * @time: 2019/1/25 13:13
     * @description: 接收服务端UDP广播
     */private void recevie() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                byte buf[] = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf, buf.length);
                while (true) {
                    try {
                        ms.receive(dp);
                        serverIP = new String(buf, 0, dp.getLength());
                        Log.d(TAG, "run: clientIP===>" + serverIP);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                showIPTxt.setText(serverIP);
                            }
                        });
                        ms.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

服务端代码:

     private MulticastSocket ms;
    String multicastHost = "224.0.0.1";
    InetAddress receiveAddress;
    private TextView showIPTxt;
    private int num;

 try {
            ms = new MulticastSocket(8888);
            receiveAddress = InetAddress.getByName(multicastHost);
            ms.joinGroup(receiveAddress);
            sendUDP();
        } catch (Exception e1) {
            e1.printStackTrace();
        }


  /**
     * @time: 2019/1/25 10:15
     * @description: 发送UDP广播
     */
    private void sendUDP() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                DatagramPacket dataPacket = null;
                try {
                    ms.setTimeToLive(4);
                    //将本机的IP(这里可以写动态获取的IP)地址放到数据包里,其实server端接收到 
                   数据包后也能获取到发包方的IP的
                    byte[] data = getLocalIpAddress().getBytes();
                    //224.0.0.1为广播地址
                    InetAddress address = InetAddress.getByName("224.0.0.130");
                    ms.joinGroup(address);
                    dataPacket = new DatagramPacket(data, data.length);
                    dataPacket.setAddress(address);
                    dataPacket.setPort(8888);
                    while (true) {
                        num++;
                        ms.send(dataPacket);
                        Thread.sleep(1000);
                        Log.d(TAG, "run: ===>" + num);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


  /**
     *  @time: 2019/1/25 10:23
     * @description: 获得本机IP
     */
    private String getLocalIpAddress() {
        try {
            Enumeration en = NetworkInterface.getNetworkInterfaces();
            for (; en.hasMoreElements(); ) {
                NetworkInterface intf = (NetworkInterface) en.nextElement();
                for (Enumeration enumIpAddr = intf.getInetAddresses(); 
                         enumIpAddr.hasMoreElements(); ) {
                    InetAddress inetAddress = (InetAddress) enumIpAddr.nextElement();
                    if (!inetAddress.isLoopbackAddress() && 
                           !inetAddress.isLinkLocalAddress()) {
                        return inetAddress.getHostAddress().toString();
                    }
                }
            }
        } catch (SocketException ex) {

        }
        return null;
    }

 

最后

以上就是忧伤猎豹为你收集整理的socket通过UDP获得服务端IP并建立TCP连接的全部内容,希望文章能够帮你解决socket通过UDP获得服务端IP并建立TCP连接所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部