服务器端

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.nio.charset.StandardCharsets;
  5. /*
  6. * @author: pwt
  7. * @date: Created in 2021/4/16 9:56
  8. * @description:接收端
  9. * 从本机的9999端口号接本机客户端8080端口号发送的数据
  10. * 不会发生端口号被占用的情况
  11. * 1.服务器要一直打开才能接收到数据,不然只要服务器关闭,客户端运行,然后再打开服务器也不会接收
  12. */
  13. public class ServiesUDP {
  14. public static void main(String[] args) throws IOException {
  15. /*
  16. 创建接收端,接收客户端发送的数据包
  17. */
  18. DatagramSocket receiveSocket = null;
  19. //定义从8888端口接受数据包的数据包套接字
  20. receiveSocket = new DatagramSocket(9999);
  21. // 创建字节数组,指定接收的数据包的大小
  22. byte b1[]=new byte[1000];
  23. //定义一个接受数据报的接受数据报,并放到字节数组里
  24. DatagramPacket receivePacket = new DatagramPacket(b1,b1.length);
  25. /*
  26. 创建接收数据包线程
  27. */
  28. new Thread(new recthread(receiveSocket,receivePacket)).start();
  29. /*
  30. 创建发送数据包,响应客户端的数据包
  31. 在线程建立数据包,这里只用传递已接收的数据包
  32. */
  33. new Thread(new sendth(receiveSocket,receivePacket)).start();
  34. }
  35. }
  36. class sendth extends Thread{
  37. DatagramSocket ds=null;
  38. DatagramPacket dp=null;
  39. public sendth(DatagramSocket ds,DatagramPacket dp){
  40. this.ds=ds;
  41. this.dp=dp;
  42. }
  43. public void run( ){
  44. while (true) {
  45. byte b2[]=new byte[1000];
  46. String ss="已收到!";
  47. b2=ss.getBytes(StandardCharsets.UTF_8);
  48. DatagramPacket sendPacket=new DatagramPacket(b2,b2.length, dp.getAddress(),dp.getPort());
  49. try {
  50. ds.send(sendPacket);
  51. } catch (IOException e) {
  52. e.printStackTrace();
  53. }
  54. }
  55. }}
  56. class recth extends Thread{
  57. DatagramSocket ds=null;
  58. DatagramPacket dp=null;
  59. public recth(DatagramSocket ds,DatagramPacket dp){
  60. this.ds=ds;
  61. this.dp=dp;
  62. }
  63. public void run(){
  64. //从此套接字接收数据报包。并存到数据报包那里
  65. try {
  66. while (true){
  67. ds.receive(dp);
  68. //输出数据报包
  69. String name = dp.getAddress().toString();
  70. System.out.println("\n来自主机:" + name + "\n端口:" + dp.getPort());
  71. String s = new String(dp.getData(), 0, dp.getLength());
  72. System.out.println("接受到的数据是: " + s);
  73. }
  74. } catch (IOException e) {
  75. e.printStackTrace();
  76. }
  77. }
  78. }

客户端

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. /*
  6. * @author: pwt
  7. * @date: Created in 2021/4/16 9:55
  8. * @description:发送端
  9. * 服务器打开后才能接收数据
  10. */
  11. public class ClientUDP {
  12. public static void main(String[] args) throws IOException{
  13. /*
  14. 创建发送端,向服务器发送数据
  15. */
  16. DatagramSocket sendSocket = new DatagramSocket(8080);
  17. //构造数据报套接字并将其绑定到本地主机上的指定端口。
  18. String ss = "hi~";
  19. byte[] d1 = new byte[1024];
  20. //将字符串数组转化为字节数组
  21. d1 = ss.getBytes();
  22. //构造用于发送长度的分组的数据报包 length指定主机上到指定的端口号。
  23. DatagramPacket sendPacket = new DatagramPacket(d1, d1.length, InetAddress.getLocalHost(), 9999);
  24. //将数据报发送出去
  25. sendSocket.send(sendPacket);
  26. System.out.println("发送完毕");
  27. /*
  28. 创建接收,响应服务器端的数据
  29. */
  30. byte[] d2 = new byte[1024];
  31. DatagramPacket receivePacket=new DatagramPacket(d2,d2.length);
  32. sendSocket.receive(receivePacket);
  33. //String se=receivePacket.toString();
  34. //String se=receivePacket.getAddress().toString();
  35. //因为receivePacket是字节类型的,必须要转化一下
  36. //通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
  37. String se = new String(receivePacket.getData(), 0, receivePacket.getLength());
  38. System.out.println(se);
  39. }
  40. }