JAVA UDP 发送和接收数据
JAVA UDP 發(fā)送和接收數(shù)據(jù)
UDP的三種通訊方式
- 單播: 單機(jī)與單機(jī)之間的通訊
- 廣播: 當(dāng)前主機(jī)與所在網(wǎng)絡(luò)中的所有主機(jī)通訊
- 組播: 當(dāng)前主機(jī)與選定的一組主機(jī)通訊
一.單播
1.發(fā)送單次單條數(shù)據(jù)
1.發(fā)送端代碼
package com.wei.udp;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress;public class ClientDemo1 {/*** 發(fā)送端*/public static void main(String[] args) throws Exception {System.out.println("=============發(fā)送端啟動===========");// 1.創(chuàng)建發(fā)送端對象DatagramSocket socket = new DatagramSocket(6666);// 2.創(chuàng)建一個數(shù)據(jù)包對象封裝數(shù)據(jù)/*** 參數(shù)1:封裝要發(fā)送的數(shù)據(jù)* 參數(shù)2:發(fā)送數(shù)據(jù)的大小* 參數(shù)3:服務(wù)端的IP地址* 參數(shù)4:服務(wù)端的端口** InetAddress.getLocalHost() 獲取本機(jī)IP地址*/byte[] buffer = "我是一坨數(shù)據(jù)!".getBytes();DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8888);// 3.發(fā)送數(shù)據(jù)socket.send(packet);// 4.關(guān)閉管道socket.close();} }2.服務(wù)端(接收端)代碼
package com.wei.udp;import java.net.DatagramPacket; import java.net.DatagramSocket;/*** 接收端*/ public class ServerDemo2 {public static void main(String[] args) throws Exception {System.out.println("=============客戶端啟動===========");// 1.創(chuàng)建接受對象DatagramSocket socket = new DatagramSocket(8888);// 2.創(chuàng)建一個數(shù)據(jù)包接收數(shù)據(jù)byte [] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);// 3.等待接受數(shù)據(jù)socket.receive(packet);// 4.取出數(shù)據(jù)int len = packet.getLength();String rs = new String(buffer,0,len);System.out.println("收到的數(shù)據(jù):" + rs);// 獲取發(fā)送端的ip和端口String ip = packet.getSocketAddress().toString();System.out.println("發(fā)送端的IP地址: " + ip);int port = packet.getPort();System.out.println("發(fā)送端端口為: "+port);// 關(guān)閉管道socket.close();} }3.接收到的數(shù)據(jù)
=============客戶端啟動=========== 收到的數(shù)據(jù): 我是一坨數(shù)據(jù)! 發(fā)送端的IP地址: /192.168.43.83:6666 發(fā)送端端口為: 66662.多發(fā)多收消息
1.服務(wù)端代碼
package com.wei.udp2;import java.net.DatagramPacket; import java.net.DatagramSocket;/*** 接收端*/ public class ServerDemo2 {public static void main(String[] args) throws Exception {System.out.println("=============客戶端啟動===========");// 1.創(chuàng)建接受對象DatagramSocket socket = new DatagramSocket(8888);// 2.創(chuàng)建一個數(shù)據(jù)包接收數(shù)據(jù)byte [] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true) {// 3.等待接受數(shù)據(jù)socket.receive(packet);// 4.取出數(shù)據(jù)int len = packet.getLength();String rs = new String(buffer,0,len);System.out.println("收到來自: "+ packet.getAddress()+ ",對方端口號為: "+ packet.getPort()+"的消息: " + rs);}} }2.客戶端代碼
package com.wei.udp2;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;public class ClientDemo1 {/*** 發(fā)送端*/public static void main(String[] args) throws Exception {System.out.println("=============發(fā)送端啟動===========");// 1.創(chuàng)建發(fā)送端對象DatagramSocket socket = new DatagramSocket(6666);Scanner sc = new Scanner(System.in);while (true) {System.out.println("請輸入您要發(fā)送的消息: ");String msg = sc.nextLine();if("exit".equals(msg)){System.out.println("退出成功!");socket.close();break;}// 2.創(chuàng)建一個數(shù)據(jù)包對象封裝數(shù)據(jù)byte[] buffer = msg.getBytes();DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),8888);// 3.發(fā)送數(shù)據(jù)socket.send(packet);}} }3.發(fā)送及接收到的數(shù)據(jù)
===發(fā)送端啟動=
請輸入您要發(fā)送的消息:
嗨,在嗎?
請輸入您要發(fā)送的消息:
在嗎?
請輸入您要發(fā)送的消息:
怎么不說話?
請輸入您要發(fā)送的消息:
exit
退出成功!
===客戶端啟動=
收到來自: /192.168.43.83,對方端口號為: 6666的消息: 嗨,在嗎?
收到來自: /192.168.43.83,對方端口號為: 6666的消息: 在嗎?
收到來自: /192.168.43.83,對方端口號為: 6666的消息: 怎么不說話?
二.廣播消息
- 發(fā)送廣播消息需要使用廣播地址: 255.255.255.255
- 發(fā)送端的數(shù)據(jù)包的目的地址是廣播地址+指定端口號(255.255.255.255,9999)
- 本機(jī)所在網(wǎng)段的其他主機(jī)只要匹配到端口即可接受消息(9999)
1.服務(wù)端代碼
package com.wei.udp3;import java.net.DatagramPacket; import java.net.DatagramSocket;/*** 服務(wù)端*/ public class ServerDemo2 {public static void main(String[] args) throws Exception {System.out.println("=============客戶端啟動===========");// 1.創(chuàng)建接受對象DatagramSocket socket = new DatagramSocket(9999);// 2.創(chuàng)建一個數(shù)據(jù)包接收數(shù)據(jù)byte [] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true) {// 3.等待接受數(shù)據(jù)socket.receive(packet);// 4.取出數(shù)據(jù)int len = packet.getLength();String rs = new String(buffer,0,len);System.out.println("收到來自: "+ packet.getAddress()+ ",對方端口號為: "+ packet.getPort()+"的消息: " + rs);}} }2.發(fā)送端代碼
package com.wei.udp3;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;public class ClientDemo1 {/*** 發(fā)送端*/public static void main(String[] args) throws Exception {System.out.println("=============發(fā)送端啟動===========");// 1.創(chuàng)建發(fā)送端對象DatagramSocket socket = new DatagramSocket(6666);Scanner sc = new Scanner(System.in);while (true) {System.out.println("請輸入您要發(fā)送的消息: ");String msg = sc.nextLine();if("exit".equals(msg)){System.out.println("退出成功!");socket.close();break;}// 2.創(chuàng)建一個數(shù)據(jù)包對象封裝數(shù)據(jù)byte[] buffer = msg.getBytes();DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getByName("255.255.255.255"),9999);// 3.發(fā)送數(shù)據(jù)socket.send(packet);}} }3.發(fā)送及接收到的數(shù)據(jù)
===發(fā)送端啟動=
請輸入您要發(fā)送的消息:
hello
請輸入您要發(fā)送的消息:
我是一條廣播消息
請輸入您要發(fā)送的消息:
exit
退出成功!
===客戶端啟動=
收到來自: /192.168.43.83,對方端口號為: 6666的消息: hello
收到來自: /192.168.43.83,對方端口號為: 6666的消息: 我是一條廣播消息
三.組播
- 使用組播地址: 224.0.0.0~239.255.255.255
- 發(fā)送端的數(shù)據(jù)包的目的目的地址是組播ip(224.0.1.1,9999)
- 接收端必須綁定該組播ip(224.0.1.1),端口還要對應(yīng)發(fā)送端的目的端口(9999)
1.服務(wù)端代碼
package com.wei.udp4;import java.net.*;/*** 服務(wù)端*/ public class ServerDemo2 {public static void main(String[] args) throws Exception {System.out.println("=============客戶端啟動===========");// 1.創(chuàng)建接受對象MulticastSocket socket = new MulticastSocket(9999);// 把當(dāng)前接受端加入到一個組播組中,綁定對應(yīng)組播消息的組ip // socket.joinGroup(InetAddress.getByName("224.0.1.1")); 過時的方法socket.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1"),9999), NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));// 2.創(chuàng)建一個數(shù)據(jù)包接收數(shù)據(jù)byte [] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, buffer.length);while (true) {// 3.等待接受數(shù)據(jù)socket.receive(packet);// 4.取出數(shù)據(jù)int len = packet.getLength();String rs = new String(buffer,0,len);System.out.println("收到來自: "+ packet.getAddress()+ ",對方端口號為: "+ packet.getPort()+"的消息: " + rs);}} }2.客戶端代碼
package com.wei.udp4;import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;public class ClientDemo1 {/*** 發(fā)送端*/public static void main(String[] args) throws Exception {System.out.println("=============發(fā)送端啟動===========");// 1.創(chuàng)建發(fā)送端對象DatagramSocket socket = new DatagramSocket(6666);Scanner sc = new Scanner(System.in);while (true) {System.out.println("請輸入您要發(fā)送的消息: ");String msg = sc.nextLine();if("exit".equals(msg)){System.out.println("退出成功!");socket.close();break;}// 2.創(chuàng)建一個數(shù)據(jù)包對象封裝數(shù)據(jù)byte[] buffer = msg.getBytes();DatagramPacket packet = new DatagramPacket(buffer,buffer.length, InetAddress.getByName("224.0.1.1"),9999);// 3.發(fā)送數(shù)據(jù)socket.send(packet);}} }3.發(fā)送及接收到的數(shù)據(jù)
===發(fā)送端啟動=
請輸入您要發(fā)送的消息:
hello
請輸入您要發(fā)送的消息:
我是一條組播消息
請輸入您要發(fā)送的消息:
exit
===客戶端啟動=
收到來自: /192.168.43.83,對方端口號為: 6666的消息: hello
收到來自: /192.168.43.83,對方端口號為: 6666的消息: 我是一條組播消息
總結(jié)
以上是生活随笔為你收集整理的JAVA UDP 发送和接收数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] CSS的伪类和伪对象有什么
- 下一篇: [html] 简述下html5的离线储