socket通过UDP获得服务端IP并建立TCP连接

本文介绍了一种在未知服务端IP情况下,利用多点广播技术自动获取服务端IP并建立TCP连接的方法。服务端通过MulticastSocket发送本机IP至客户端,客户端解析并建立连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在不知道服务端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;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值