UDP通信
- 特点:无连接、不可靠通信。
- 不事先建立连接;发送端每次把要发送的数据(限制在64KB内)、接收端1P、等信息封装成一个数据包,发出去就不管了。
- Java提供了一个java.net.Datagramsocket类来实现UDP通信。
DatagramSocket:用于创建客户端、服务端
DatagramPacket:创建数据包
一发一收
客户端实现步骤:
- 创建DatagramSocket对象(客户端对象)
- 创建DatagramPacket对象封装需要发送的数据(数据包对象)
- 使用Datagramsocket对象的send方法,传入DatagramPacket对象
- 释放资源
服务端实现步骤:
- 创建Datagramsocket对象并指定端口(服务端对象)
- 创建DatagramPacket对象接收数据(数据包对象)
- 使用Datagramsocket对象的receive方法,传入DatagramPacket对象
- 释放资源
代码演示如下:
客户端
/** * 目标:完成UDP通信快速入门:实现一发一收 */ public class Client { public static void main(String[] args) throws Exception{ System.out.println("客户端启动啦!"); //1.创建客户端对象(发韭菜出去的人) DatagramSocket socket = new DatagramSocket(); //2.创建数据包对象封装要发出去的数据(创建一个韭菜盘子) /*public DatagramPacket(byte buf[], int length, InetAddress address, int port) 参数一:封装要发出去的数据。 参数二:发送出去的数据大小(字节个数) 参数三:服务端的IP地址(找到服务端主机) 参数四:服务端程序的端口。 */ byte[] bytes = "我爱学Java,我喜欢制造bug!".getBytes(); DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),6666); //3.开始正式发送这个数据包的数据出去了 socket.send(packet); System.out.println("客户端数据发送完毕~~~"); socket.close();//别忘记释放资源! } }
服务端:
/** * 目标:完成UDP通信快速入门-服务端开发 */ public class Server { public static void main(String[] args) throws Exception{ System.out.println("服务端启动啦!"); //1.创建一个服务端对象(创建一个接韭菜的人)注册端口 DatagramSocket socket = new DatagramSocket(6666); //2.创建一个数据包对象,用于接收数据的(创建一个韭菜盘子) byte[] buffer = new byte[1024 * 64]; // 64KB DatagramPacket packet = new DatagramPacket(buffer,buffer.length); //3.开始正式使用数据包来接收客户端发来的数据 socket.receive(packet); //4.从字节数组中,把接收到的数据直接打印出来 //接收多少就倒出多少 //获取本次数据包接收了多少数据 int len = packet.getLength(); String rs = new String(buffer,0,len); System.out.println(rs); System.out.println(packet.getAddress().getHostAddress()); System.out.println(packet.getPort()); socket.close();//别忘记释放资源! } }
反复发送
客户端实现步骤:
- 创建DatagramSocket对象(发送端对象)
- 使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序
- 如果用户输入的不是exit,把数据封装成DatagramPacket
- 使用DatagramSocket对象的send方法将数据包对象进行发送
- 释放资源
接收端实现步骤:
- 创建DatagramSocket对象并指定端口(接收端对象)
- 创建DatagramPacket对象接收数据(数据包对象)
- 使用DatagramSocket对象的receive方法传入DatagramPacket对象
- 使用while死循环不断的进行第3步
代码实习如下:
客户端:
public class Client { public static void main(String[] args) throws Exception{ System.out.println("客户端启动啦!"); //1.创建客户端对象(发韭菜出去的人) DatagramSocket socket = new DatagramSocket(); //2.创建数据包对象封装要发出去的数据(创建一个韭菜盘子) /*public DatagramPacket(byte buf[], int length, InetAddress address, int port) 参数一:封装要发出去的数据。 参数二:发送出去的数据大小(字节个数) 参数三:服务端的IP地址(找到服务端主机) 参数四:服务端程序的端口。 */ Scanner sc = new Scanner(System.in); while (true) { System.out.println("请输入:"); String msg = sc.nextLine(); //一旦发现用户输入的exit命令,就退出客户端 if ("exit".equals(msg)){ System.out.println("退出成功!"); socket.close(); //释放资源 break; } byte[] bytes = msg.getBytes(); DatagramPacket packet = new DatagramPacket(bytes,bytes.length,InetAddress.getLocalHost(),6666); //3.开始正式发送这个数据包的数据出去了 socket.send(packet); } } }
服务端:
public class Server { public static void main(String[] args) throws Exception{ System.out.println("服务端启动啦!"); //1.创建一个服务端对象(创建一个接韭菜的人)注册端口 DatagramSocket socket = new DatagramSocket(6666); //2.创建一个数据包对象,用于接收数据的(创建一个韭菜盘子) byte[] buffer = new byte[1024 * 64]; // 64KB DatagramPacket packet = new DatagramPacket(buffer,buffer.length); while (true) { //3.开始正式使用数据包来接收客户端发来的数据 socket.receive(packet); //4.从字节数组中,把接收到的数据直接打印出来 //接收多少就倒出多少 //获取本次数据包接收了多少数据 int len = packet.getLength(); String rs = new String(buffer,0,len); System.out.println(rs); System.out.println(packet.getAddress().getHostAddress()); System.out.println(packet.getPort()); System.out.println("--------------------------------"); } } }
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: Google Earth Engine(GEE)——加载的图表图例无法
我正在使用功能组图——散点图。图表上显示的图例(系列)会自动按照首次出现的值排序,因此它看起来像一个随机数(附图)。我想通过从小到大对值进行排序来自定义图例,但一无所获(案例:1 – 11)。有没有人有办法解决吗? 原始代码: var target_image…