概述
在不知道服务端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连接所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复