JAVA基础-网络编程-UDP
UDP传输 ①:只要是网络传输,必须有socket 。 ②:数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。 直接操作udp不可能,对于java语言应该将udp封装成对象,易于我们的使用,这个对象就是DatagramSocket. 封装了udp传输协议的socket对象。 因为数据包中包含的信息较多,为了操作这些信息方便,也一样会将其封装成对象。这个数据包对象就是:DatagramPacket.通过这个对象中的方法,就可以获取到数据包中的各种信息。 DatagramSocket具备发送和接受功能,在进行udp传输时,需要明确一个是发送端,一个是接收端。 udp的发送端: ①:建立udp的socket服务,创建对象时如果没有明确端口,系统会自动分配一个未被使用的端口。 ②:明确要发送的具体数据。 ③:将数据封装成了数据包。 ④:用socket服务的send方法将数据包发送出去。 ⑤:关闭资源。 udp的接收端: ①:创建udp的socket服务,必须要明确一个端口,作用在于,只有发送到这个端口的数据才是这个接收端可以处理的数据。 ②:定义数据包,用于存储接收到数据。 ③:通过socket服务的接收方法将收到的数据存储到数据包中。 ④:通过数据包的方法获取数据包中的具体数据内容,比如ip、端口、数据等等。 ⑤:关闭资源。 Eg: 发送端(客户端)
1 import java.net.*; 2 class UdpSend{ 3 public static void main(String[] args)throws Exception { 4 // 1,建立udp的socket服务。 5 DatagramSocket ds = new DatagramSocket(8888);//指定发送端口,这个可以不指定,系统会随机分配。 6 // 2,明确要发送的具体数据。 7 String text = "udp传输演示 哥们来了"; 8 byte[] buf = text.getBytes(); 9 // 3,将数据封装成了数据包。 10 DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("10.1.31.127"),10000); 11 // 4,用socket服务的send方法将数据包发送出去。 12 ds.send(dp); 13 // 5,关闭资源。 14 ds.close(); 15 } 16 }
接收端(服务器端)
1 import java.net.*; 2 class UdpRece { 3 public static void main(String[] args) throws Exception{ 4 // 1,创建udp的socket服务。 5 DatagramSocket ds = new DatagramSocket(10000);//必须指定,并且和上面的端口号一样! 6 // 2,定义数据包,用于存储接收到数据。先定义字节数组,数据包会把数据存储到字节数组中。 7 byte[] buf = new byte[1024]; 8 DatagramPacket dp = new DatagramPacket(buf,buf.length); 9 // 3,通过socket服务的接收方法将收到的数据存储到数据包中。 10 ds.receive(dp);//该方法是阻塞式方法。 11 // 4,通过数据包的方法获取数据包中的具体数据内容,比如ip,端口,数据等等。 12 String ip = dp.getAddress().getHostAddress(); 13 int port = dp.getPort(); 14 String text = new String(dp.getData(),0,dp.getLength());//将字节数组中的有效部分转成字符串。 15 System.out.println(ip+":"+port+"--"+text); 16 // 5,关闭资源。 17 ds.close(); 18 } 19 }
练习: 通过键盘录入获取要发送的信息。 将发送和接收分别封装到两个线程中。
1 package july76net; 2 //一个聊天的例子,利用UDP传输协议 3 4 import java.io.BufferedReader; 5 import java.io.IOException; 6 import java.io.InputStreamReader; 7 import java.net.DatagramPacket; 8 import java.net.DatagramSocket; 9 import java.net.InetAddress; 10 11 //客户端,发送端 12 class Send implements Runnable { 13 private DatagramSocket ds; 14 15 public Send(DatagramSocket ds) { 16 super(); 17 this.ds = ds; 18 } 19 20 @Override 21 public void run() { 22 try { 23 BufferedReader br = new BufferedReader(new InputStreamReader( 24 System.in));//数据源是键盘录入 25 String line; 26 while ((line = br.readLine()) != null) { 27 byte[] buf = line.getBytes(); 28 DatagramPacket dp = new DatagramPacket(buf, buf.length, 29 InetAddress.getByName("localhost"), 10225); 30 31 ds.send(dp); 32 } 33 } catch (IOException e) { 34 e.printStackTrace(); 35 } 36 } 37 } 38 39 // 服务器端,接收端 40 class Rece implements Runnable { 41 private DatagramSocket ds; 42 43 public Rece(DatagramSocket ds) { 44 super(); 45 this.ds = ds; 46 } 47 48 @Override 49 public void run() { 50 try { 51 while (true) { 52 byte[] buf = new byte[1024]; 53 54 DatagramPacket dp = new DatagramPacket(buf, 0, buf.length); 55 ds.receive(dp); 56 57 String ip = dp.getAddress().getHostAddress(); 58 String data = new String(dp.getData(), 0, dp.getLength()); 59 60 System.out.println(ip + " " + data); 61 } 62 } catch (Exception e) { 63 e.printStackTrace(); 64 } 65 } 66 } 67 68 public class Demo6 { 69 public static void main(String[] args) throws Exception { 70 DatagramSocket sendDs = new DatagramSocket(); 71 DatagramSocket receDs = new DatagramSocket(10225); 72 new Thread(new Send(sendDs)).start(); 73 new Thread(new Rece(receDs)).start(); 74 } 75 }
输出: 你好 127.0.0.1 你好 你好 127.0.0.1 你好