我是靠谱客的博主 忧伤猎豹,这篇文章主要介绍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开头)。 

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

客户端代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*发送广播端的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(); }

服务端代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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连接内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部