服务端:
1 package udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.SocketException; 7 8 //服务器 9 public class AskServer { 10 public static void main(String[] args) throws IOException { 11 //1.创建一个DatagramSocket 用来发送或者接收数据的 12 DatagramSocket socket = new DatagramSocket(8888);//端口用来接收数据 13 14 //2.使用DatagramSocket接收数据 15 //接收数据 要使用 DatagramPacket 16 byte [] buf = new byte [1024];//接收数据不需要知道对方IP 17 DatagramPacket packet = new DatagramPacket(buf, buf.length); 18 socket.receive(packet); 19 //System.out.println(packet.getLength());//数据包的长度 20 //System.out.println(packet.getData());//对方发送的数据 21 //System.out.println(new String(packet.getData(),0,packet.getLength())); 22 System.out.println("来自客户端的消息:"+new String(buf,0,packet.getLength())); 23 /* System.out.println(packet.getAddress());//对方的ip? 24 System.out.println(packet.getPort());//对方的端口号*/ 25 26 //3.向客户端发送数据 27 String reply ="亲,在的"; 28 byte [] buf2 = reply.getBytes(); 29 //对方的IP可能随时变化 通过接收的数据包能够获取对方的ip和端口 30 DatagramPacket packet2 = new DatagramPacket(buf2, buf2.length, packet.getAddress(), packet.getPort()); 31 socket.send(packet2); 32 33 //4.关闭 34 socket.close(); 35 } 36 }
客户端:
1 package udp; 2 3 import java.io.IOException; 4 import java.net.DatagramPacket; 5 import java.net.DatagramSocket; 6 import java.net.InetAddress; 7 import java.net.SocketException; 8 import java.net.UnknownHostException; 9 10 /** 11 * @author superdrew 12 * 功能:客户和咨询师在线交流 13 * 使用udp完成 14 * 注意: 15 * 1.udp没有严格意义区分服务端和客户端,双方都是平等的(主动发送请求是客户端,被动接收请求的是服务端) 16 * 2.udp编程和IO流没有关系 17 * 3.udp两个核心类 18 * DatagramSocket:用来接收或者发送数据包 19 * DatagramPacket:数据包 20 * 4.客户端不写 port 端口 会 自动生成一个端口 21 * 22 * 分解1:先完成一次单向通信 23 * 2:一次双向通信 24 * 3:多次双向通信 25 * 26 * 总结:1。DatagramSocket 27 * 用来接收和发送数据的 28 * socket.send(packet) 29 * socket.receive(packet2) 30 * 2。DatagramPacket 31 * 封装了数据,对方的IP,对方的接收端口 32 * getLength() 获取对方发送数据的长度 33 * getData() 获取对方发送的数据 (字节数组) 34 * getAddress() 获取对方的ip 35 * getPort() 获取对方的发送数据的端口 36 * 37 */ 38 39 public class AskClient { 40 public static void main(String[] args) throws IOException { 41 //1.创建DatagramSocket 用来发送数据 42 DatagramSocket socket = new DatagramSocket(9999);//发送端的端口 43 44 //2.使用DatagramSocket发送数据 45 //发送数据只前 要 创建 DatagramPacket 数据包 46 String info = "亲,在吗?"; 47 byte [] buf = info.getBytes(); 48 DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(),8888); 49 socket.send(packet); 50 51 byte [] buf2 = new byte [1024]; 52 DatagramPacket packet2 = new DatagramPacket(buf2,buf2.length); 53 socket.receive(packet2);//接收的数据都放到packet2里面了 对方发送的数据封装到了buf2 用 packet2.getData 效果是一样的s 54 String result = new String(buf2,0,buf2.length); 55 System.out.println("来自服务器的消息:"+result); 56 57 //3.关闭资源 58 socket.close(); 59 } 60 61 }
操作步骤:
① 运行服务端;② 运行客户端;
结果展示: