Java实现UDP单播
对于最近所做的Android手机端遥控器APP,用到了UDP组播和广播方面的知识,虽然网络传输方面并不是由我负责,但是由于期间遇到一些问题,所以我的求知欲有蠢蠢欲动,自己就去了解了一下这方面的知识,首先从UDP单播开始给大家分享一下我在学习过程中的感悟。对于UDP的概念在这里就不多做介绍了。
参考链接
http://blog.csdn.net/ljheee/article/details/51722792
查阅了一些前人的博客,对于我而言感觉这位大神写的特别的好,分析很到位,代码也很简洁,直接从用Java来演绎了UDP的使用。
http://blog.csdn.net/a10615/article/details/52395592
然后结合了这位前辈对UDP连接客户端和服务端的API的介绍结合起来理解运用起来就更加理解了。
UDP单播客户端代码
/**
* UDP单播的例子
* @author WangHang
*
*/
public class UdpClient {
public static void main(String[] args) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
DatagramSocket clientSocket = null;
byte[] receiveData = new byte[1024];
try {
clientSocket = new DatagramSocket();
InetAddress inetAddress = InetAddress.getByName("localhost");
// 其实此处的connect方法并不是太符合UDP的设计理念
// 因为UDP是面向非连接的,说的简单点,瞎发就行了至于有没有人收到,关我神马事,所以还是采用数据包指定IP和端口的方法吧
clientSocket.connect(inetAddress, 8899);
String data = reader.readLine();
byte[] sendData = data.getBytes("utf-8");
DatagramPacket datagramPacket = new DatagramPacket(sendData, sendData.length);
// 当Client没有事先连接到目标IP的端口时(没有调用上面的connect方法),可以在发送的数据包中加上对应的IP和端口
// DatagramPacket datagramPacket = new DatagramPacket(sendData, sendData.length,inetAddress,8899);
clientSocket.send(datagramPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
InetAddress address = receivePacket.getAddress();
System.out.println(address);
if (address != null) {
String receive = new String(receivePacket.getData());
System.out.println(receive);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (clientSocket != null) {
clientSocket.close();
}
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
UDP单播服务端代码
/**
* UDP单播服务端测试代码
* @author WangHang
*
*/
public class UdpServer {
public static void main(String[] args) {
DatagramSocket serverSocket = null;
try {
serverSocket = new DatagramSocket(8899);
byte [] receiveData = new byte[1024];
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
System.out.println(new String(receiveData));
InetAddress address = receivePacket.getAddress();
System.out.println(address);
int port = receivePacket.getPort();
// 接收到消息之后回发一个消息给Client
byte[] sendData = "wanghang".getBytes("utf-8");
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, address,port);
serverSocket.send(sendPacket);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
serverSocket.close();
}
}
}注意事项
这里一定要注意这两段代码只是为了更好理解UDP单播的使用,在实际使用当中一定要将他们都写在单独的线程当中,因为网络连接和发送数据是很耗时的。为了便于测试该测试代码直接使用的localhost,如果要通过真实的网络传输,要自己设置目标的IP,测试起来很简单,先运行server端代码,再运行Client端代码,然后就在控制台上输入你要发送的字符串,回车键之后,就会打印出server端接收到的结果。
版权声明:本文为LeDaVince原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。