当前位置:   article > 正文

UDP协议的实现_udp实现

udp实现

目录

1.传输层协议

2.套接字:

3.应用层协议设计

4. UDP数据报套接字编程


1.传输层协议

UDP:用户报文协议User Datagram Protocol

实现了进程到进程

TCP:传输控制协议Transmission Control Protocol

进程到进程+可靠性协议

2.套接字

 Socket(套接字) 类比于插口:相当于我去操作系统集团的socket服务窗口告诉他:“我要购买你的TCP协议给我发送.....”

3.应用层协议设计

 应用层协议                                       翻译服务                              请求响应

请求:英文                                     响应:中文

请求协议:我是王小熊\r\napple\r\n

响应协议:好的\r\n苹果\r\n

保证是utf-8的协议

4. UDP数据报套接字编程

时序上:服务端先启动,bind一个端口(这里有可能出现错误:这个端口在被别的进程使用,这时需要换一个端口,或者把这个进程搬走) 我选的是8080端口


DatagramSocket API

DatagramSocket 是UDP Socket,用于发送和接收UDP数据报

DatagramSocket构造方法:

DatagramSocket() 创建一个UDP套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)

DatagramSocket(int port) 创建一个UDP数据报套接字的Socket,绑定到本机的指定端口(一般用于服务端)

 

  1. /**
  2. * @author wangqi
  3. * @data 2022/5/20 13 16
  4. * udp服务器端
  5. */
  6. import java.io.IOException;
  7. import java.net.DatagramPacket;
  8. import java.net.DatagramSocket;
  9. import java.net.InetAddress;
  10. import java.util.Arrays;
  11. import java.util.HashMap;
  12. public class Server {
  13. // 1. 写在文件中
  14. // 2. 写在数据库中
  15. private static final HashMap<String, String> map = new HashMap<>();
  16. static {
  17. map.put("apple", "苹果");
  18. map.put("banana", "香蕉");
  19. }
  20. public static void main(String[] args) throws IOException {
  21. Log.println("服务器 bind 在 8080 端口上");
  22. DatagramSocket socket = new DatagramSocket(8080);
  23. while (true) {
  24. // 读取请求
  25. byte[] buf = new byte[1024];
  26. DatagramPacket received = new DatagramPacket(buf, buf.length);
  27. Log.println("服务器准备接收数据");
  28. socket.receive(received); // 服务器会阻塞,在这里等待请求,真的有请求过来,才会继续往下走
  29. Log.println("服务器接收到了数据");
  30. // 处理
  31. // 对方的地址(ip)
  32. InetAddress address = received.getAddress();
  33. Log.printf("对方的地址是: %s\r\n", address);
  34. // 对方的端口(port)
  35. int port = received.getPort();
  36. Log.printf("对方的端口是: %d\r\n", port);
  37. // 真正收到的数据长度
  38. int n = received.getLength(); //buf桶的大小为1024,但是不一定收到的数据一定是1024
  39. Log.printf("一共收到的数据长度: %d\r\n", n);
  40. // 真正有用的数据
  41. byte[] actualData = Arrays.copyOf(buf, n);
  42. // byte[] + 字符集编码 -> String
  43. String request = new String(actualData, 0, actualData.length, "UTF-8");//保证都为utf-8,就不用考虑字符集编码的问题
  44. Log.printf("请求是: %s\r\n", request);
  45. // 分析请求
  46. if (!request.startsWith("我是Java19班的\r\n")) {
  47. // 不符合应用层的请求协议,不做处理
  48. Log.println("请求头不符合格式");
  49. continue;
  50. }
  51. //如果请求数据不是以\r\n作为结尾,也不去处理
  52. if (!request.endsWith("\r\n")) {
  53. // 不符合应用层的请求协议,不做处理
  54. Log.println("请求尾不符合格式");
  55. continue;
  56. }
  57. String englishWord = request.substring("我是Java19班的\r\n".length(), request.length() - 2);
  58. Log.println("收到的英文单词是: " + englishWord);
  59. String chineseWord = map.getOrDefault(englishWord, "不认识");
  60. Log.println("翻译后的中文是: " + chineseWord);
  61. // 发送响应
  62. String response = String.format("好的\r\n%s\r\n", chineseWord);
  63. Log.println("响应是: " + response);
  64. // String + 字符集编码 -> byte[]
  65. byte[] bytes = response.getBytes("UTF-8");
  66. Log.println("准备发送响应");
  67. DatagramPacket sent = new DatagramPacket(
  68. bytes, 0, bytes.length,
  69. address,
  70. port
  71. );
  72. socket.send(sent);
  73. Log.println("响应发送成功");
  74. }
  75. }
  76. }
  1. /**
  2. * @author wangqi
  3. * @data 2022/5/201556
  4. * 打印得时候显示时间
  5. */
  6. import java.text.DateFormat;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9. public class Log {
  10. public static void println(Object o) {
  11. Date date = new Date();
  12. DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  13. String now = format.format(date);
  14. System.out.println(now + ": " + o.toString());
  15. }
  16. public static void print(Object o) {
  17. Date date = new Date();
  18. DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  19. String now = format.format(date);
  20. System.out.print(now + ": " + o.toString());
  21. }
  22. public static void printf(String fmt, Object... args) {
  23. Date date = new Date();
  24. DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
  25. String now = format.format(date);
  26. System.out.printf(now + ": " + fmt, args);
  27. }
  28. public static void main(String[] args) {
  29. print("Hello\r\n");//\r\n为换行
  30. println("你好");
  31. printf("%s %d", "Go", 13);
  32. }
  33. }
  1. /**
  2. * @author wangqi
  3. * @data 2022/5/201556
  4. * udp客户端
  5. */
  6. import java.io.IOException;
  7. import java.net.DatagramPacket;
  8. import java.net.DatagramSocket;
  9. import java.net.InetAddress;
  10. public class Client {
  11. public static void main(String[] args) throws IOException {
  12. // 目前服务器在本机: 127.0.0.1
  13. // 目前服务器的端口是: 8080
  14. // 目前只发送一次请求
  15. String word = "apple";
  16. // 准备发送请求
  17. String request = "我是Java19班的\r\n" + word + "\r\n";
  18. byte[] bytes = request.getBytes("UTF-8");
  19. DatagramPacket sent = new DatagramPacket(
  20. bytes,
  21. 0,
  22. bytes.length,
  23. InetAddress.getLoopbackAddress(),
  24. 8080
  25. );
  26. DatagramSocket socket = new DatagramSocket(9999);
  27. socket.send(sent);
  28. }
  29. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/187132
推荐阅读
相关标签
  

闽ICP备14008679号