UDP网络通讯(JAVA 实现)
2018-01-12 16:27
369 查看
UDP协议提供的服务不同于TCP协议的端到端服务,由于每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。所以它是非连接的,属不可靠协议
因为UDP是非连接的,所以UDP服务端不需要等待客户端的请求以建立连接。另外,UDP服务器为所有通信使用同一套接字,这点与TCP服务器不同,TCP服务器则为每个成功返回的accept()方法创建一个新的套接字。
UDP客户端被动的向等待的服务器发送一个数据报文。如果服务器是启动状态,则会返回数据给客户端UDP套接字在使用前不需要进行连接。
使用UDP方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
用DatagramPacket来包装需要发送或者接收到的数据。发送信息时,Java创建一个包含待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket实例的send()方法
接收信息时,Java程序首先创建一个DatagramPacket实例,该实例预先分配了一些空间,并将接收到的信息存放在该空间中,然后把该实例作为参数传递给DatagramSocket实例的receive()方法。
使用DatagramSocket实例的send()和receive()方法来发送和接收DatagramPacket实例,进行通信
通信完成后,调用DatagramSocket实例的close()方法来关闭该套接字。
代码实现如下
使用DatagramSocket实例的receive()方法接收一个DatagramPacket实例,当receive()方法返回时,数据报文包含了客户端的地址
使用DatagramSocket实例的send()方法向服务器端返回DatagramPacket实例
具体代码实现如下:
因为UDP是非连接的,所以UDP服务端不需要等待客户端的请求以建立连接。另外,UDP服务器为所有通信使用同一套接字,这点与TCP服务器不同,TCP服务器则为每个成功返回的accept()方法创建一个新的套接字。
UDP客户端被动的向等待的服务器发送一个数据报文。如果服务器是启动状态,则会返回数据给客户端UDP套接字在使用前不需要进行连接。
使用UDP方式进行网络通讯时,不需要建立专门的虚拟连接,传输也不是很可靠,如果发送失败则客户端无法获得。UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。 UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
UDP 通信方式
通过DatagramPacket类和DatagramSocket类来使用UDP套接字,客户端和服务器端都通过DatagramSocket的send()方法和receive()方法来发送和接收数据用DatagramPacket来包装需要发送或者接收到的数据。发送信息时,Java创建一个包含待发送信息的DatagramPacket实例,并将其作为参数传递给DatagramSocket实例的send()方法
接收信息时,Java程序首先创建一个DatagramPacket实例,该实例预先分配了一些空间,并将接收到的信息存放在该空间中,然后把该实例作为参数传递给DatagramSocket实例的receive()方法。
UDP客户端创建步骤:
创建一个DatagramSocket实例,可以有选择地对本地地址和端口号进行设置,如果设置了端口号,则客户端会在该端口号上监听从服务器端发送来的数据使用DatagramSocket实例的send()和receive()方法来发送和接收DatagramPacket实例,进行通信
通信完成后,调用DatagramSocket实例的close()方法来关闭该套接字。
代码实现如下
//设置接收数据的超时时间 private static final int TIME_OUT_TIME = 5000; //设置重发数据的最多次数 private static final int MAX_SEND_NUM = 5; /** * @param client 客户端端口 * @param ipAddress 服务端ip地址 * @param server 服务端端口 * @param str 发生的数据 * @return * @throws Exception */ public static String udpClient(int client, String ipAddress, int server, String str) throws Exception { String receive = null; byte[] buf = new byte[1024]; //客户端 监听端口 DatagramSocket datagramSocket = new DatagramSocket(client); InetAddress address = InetAddress.getByName(ipAddress); //发送数据端口 DatagramPacket datagramPacketSend = new DatagramPacket(str.getBytes(), str.getBytes().length, address, server); //获取数据缓冲池 DatagramPacket datagramPacketReceive = new DatagramPacket(buf, 1024); //设置接收数据时阻塞的最长时间 datagramSocket.setSoTimeout(TIME_OUT_TIME); //重发次数 int count = 0; boolean receivedResponse = false; while (!receivedResponse && count < MAX_SEND_NUM) { //发送数据 datagramSocket.send(datagramPacketSend); try { //接收从服务端发送回来的数据 datagramSocket.receive(datagramPacketReceive); //如果接收到数据。则将receivedResponse标志位改为true receivedResponse = true; } catch (InterruptedIOException e) { //如果接收数据时阻塞超时,重发并减少一次重发的次数 count += 1; } } if (receivedResponse) { receive = new String(datagramPacketReceive.getData(), 0, datagramPacketReceive.getLength()); JSONObject jsonObject = JSONObject.parseObject(receive); //由于在接收了数据之后,其内部消息长度值会变为实际接收的消息的字节数, 所以这里要将 // datagramPacketReceive的内部消息长度重新置为1024 datagramPacketReceive.setLength(1024); } else { //如果多次重复发送后,仍未获得服务器发送回来的数据 System.out.println("服务器无响应"); } datagramSocket.close(); return receive; }
UDP服务端创建步骤:
创建DatagramSocket实例,并且指定端口号,并可以有选择地指定本地地址,此时,服务器已经准备好从任何客户端接收数据报文使用DatagramSocket实例的receive()方法接收一个DatagramPacket实例,当receive()方法返回时,数据报文包含了客户端的地址
使用DatagramSocket实例的send()方法向服务器端返回DatagramPacket实例
具体代码实现如下:
public static void udpServer(int serverPort, int clientPort, String msg) throws IOException { byte[] buf = new byte[1024]; boolean flag = true; //服务端口 DatagramSocket datagramSocket = new DatagramSocket(serverPort); DatagramPacket dataReceive = new DatagramPacket(buf, 1024); System.out.println("服务器开启,等待客户端访问"); while (flag) { datagramSocket.receive(dataReceive); String receiveMessage = new String(dataReceive.getData(), 0, dataReceive.getLength()) + " 来自ip " + dataReceive.getAddress().getHostAddress() + "端口:" + dataReceive.getPort(); System.out.println(receiveMessage); //发送数据到客户端端口上 DatagramPacket data_send = new DatagramPacket(msg.getBytes(), msg.getBytes().length, dataReceive.getAddress(), clientPort); datagramSocket.send(data_send); dataReceive.setLength(1024); } datagramSocket.close(); }
相关文章推荐
- JAVA网络编程之UDP通讯的实现步骤
- java网络编程-双线程实现UDP通信
- TCP和UDP网络通讯的区别及实现方式
- [学习笔记]Java网络编程之UDP通讯
- java 实现socket基于UDP的双机通讯
- 【黑马程序员】Java基础12:UDP和TCP的网络通讯
- Java_乔晓松_Java网络编程UDP实现黑窗口聊天
- java网络编程之UDP通讯
- java网络编程: UDP 广播与多播的实现
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
- 计算机网络基础-1.TCP、UDP简单通信java实现
- TCP和UDP网络通讯的区别及实现方式
- java网络通讯(UDP与TCP)
- [学习笔记]Java网络编程之UDP通讯
- NIO Framework 助你简单实现 Java 的异步网络通讯
- JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用
- TCP和UDP网络通讯的区别及实现方式
- Java一步一脚印—UDP网络编程的简单实现
- TCP和UDP网络通讯的区别及实现方式
- TCP和UDP网络通讯的区别及实现方式