赞
踩
目录
UDP:用户报文协议User Datagram Protocol
实现了进程到进程
TCP:传输控制协议Transmission Control Protocol
进程到进程+可靠性协议
Socket(套接字) 类比于插口:相当于我去操作系统集团的socket服务窗口告诉他:“我要购买你的TCP协议给我发送.....”
应用层协议 翻译服务 请求响应
请求:英文 响应:中文
请求协议:我是王小熊\r\napple\r\n
响应协议:好的\r\n苹果\r\n
保证是utf-8的协议
时序上:服务端先启动,bind一个端口(这里有可能出现错误:这个端口在被别的进程使用,这时需要换一个端口,或者把这个进程搬走) 我选的是8080端口
DatagramSocket API
DatagramSocket 是UDP Socket,用于发送和接收UDP数据报
DatagramSocket构造方法:
DatagramSocket() 创建一个UDP套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)
DatagramSocket(int port) 创建一个UDP数据报套接字的Socket,绑定到本机的指定端口(一般用于服务端)
/** * @author wangqi * @data 2022/5/20 13 16 * udp服务器端 */ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Arrays; import java.util.HashMap; public class Server { // 1. 写在文件中 // 2. 写在数据库中 private static final HashMap<String, String> map = new HashMap<>(); static { map.put("apple", "苹果"); map.put("banana", "香蕉"); } public static void main(String[] args) throws IOException { Log.println("服务器 bind 在 8080 端口上"); DatagramSocket socket = new DatagramSocket(8080); while (true) { // 读取请求 byte[] buf = new byte[1024]; DatagramPacket received = new DatagramPacket(buf, buf.length); Log.println("服务器准备接收数据"); socket.receive(received); // 服务器会阻塞,在这里等待请求,真的有请求过来,才会继续往下走 Log.println("服务器接收到了数据"); // 处理 // 对方的地址(ip) InetAddress address = received.getAddress(); Log.printf("对方的地址是: %s\r\n", address); // 对方的端口(port) int port = received.getPort(); Log.printf("对方的端口是: %d\r\n", port); // 真正收到的数据长度 int n = received.getLength(); //buf桶的大小为1024,但是不一定收到的数据一定是1024 Log.printf("一共收到的数据长度: %d\r\n", n); // 真正有用的数据 byte[] actualData = Arrays.copyOf(buf, n); // byte[] + 字符集编码 -> String String request = new String(actualData, 0, actualData.length, "UTF-8");//保证都为utf-8,就不用考虑字符集编码的问题 Log.printf("请求是: %s\r\n", request); // 分析请求 if (!request.startsWith("我是Java19班的\r\n")) { // 不符合应用层的请求协议,不做处理 Log.println("请求头不符合格式"); continue; } //如果请求数据不是以\r\n作为结尾,也不去处理 if (!request.endsWith("\r\n")) { // 不符合应用层的请求协议,不做处理 Log.println("请求尾不符合格式"); continue; } String englishWord = request.substring("我是Java19班的\r\n".length(), request.length() - 2); Log.println("收到的英文单词是: " + englishWord); String chineseWord = map.getOrDefault(englishWord, "不认识"); Log.println("翻译后的中文是: " + chineseWord); // 发送响应 String response = String.format("好的\r\n%s\r\n", chineseWord); Log.println("响应是: " + response); // String + 字符集编码 -> byte[] byte[] bytes = response.getBytes("UTF-8"); Log.println("准备发送响应"); DatagramPacket sent = new DatagramPacket( bytes, 0, bytes.length, address, port ); socket.send(sent); Log.println("响应发送成功"); } } }
/** * @author wangqi * @data 2022/5/201556 * 打印得时候显示时间 */ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class Log { public static void println(Object o) { Date date = new Date(); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); String now = format.format(date); System.out.println(now + ": " + o.toString()); } public static void print(Object o) { Date date = new Date(); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); String now = format.format(date); System.out.print(now + ": " + o.toString()); } public static void printf(String fmt, Object... args) { Date date = new Date(); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); String now = format.format(date); System.out.printf(now + ": " + fmt, args); } public static void main(String[] args) { print("Hello\r\n");//\r\n为换行 println("你好"); printf("%s %d", "Go", 13); } }
/** * @author wangqi * @data 2022/5/201556 * udp客户端 */ import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Client { public static void main(String[] args) throws IOException { // 目前服务器在本机: 127.0.0.1 // 目前服务器的端口是: 8080 // 目前只发送一次请求 String word = "apple"; // 准备发送请求 String request = "我是Java19班的\r\n" + word + "\r\n"; byte[] bytes = request.getBytes("UTF-8"); DatagramPacket sent = new DatagramPacket( bytes, 0, bytes.length, InetAddress.getLoopbackAddress(), 8080 ); DatagramSocket socket = new DatagramSocket(9999); socket.send(sent); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。