UDP 协议提供了一种不同于 TCP 协议的端到端服务。实际上 UDP 协议只实现两个功能: 1 )在 IP 协议的基础上添加了另一层地址(端口), 2 ) 对数据传输过程中可能产生的数据错误进行了检测,并抛弃已经损坏的数据。
UDP 套接字在使用前不需要进行连接。: UDP 套接字将保留边界信息。这个特性使应用程序在接受信息时,从某些方面来说比使用 TCP 套接字更简单。UDP 协议所提供的端到端传输服务是尽力而为( best-effort )的,即 UDP 套接字将尽可能地传送信息, 但并不保证信息一定能成功到达目的地址, 而且信息到达的顺序与其发送顺序不一定一致。
使用UDP而不是用TCP原因:1.效率,2.灵活性
Java 程序员通过 DatagramPacket 类和 DatagramSocket 类来使用 UDP 套接字。服务器端都使用 DatagramSockets 来发送数据,使用 DatagramPackets 来接收数据。
UDP 客户端首先向被动等待联系的服务器端发送一个数据报文。 一个典型的 UDP 客户端主要执行以下三步:
1. 创建一个 DatagramSocket 实例,可以选择对本地地址和端口号进行设置。
2. 使用 DatagramSocket 类的 send() 和 receive() 方法来发送和接收 DatagramPacket 实例,进行通信。
3. 通信完成后,使用 DatagramSocket 类的 close() 方法来销毁该套接字。
典型的 UDP 服务器要执行以下三步:
1. 创建一个 DatagramSocket 实例, 指定本地端口号, 并可以选择指定本地地址。 此时,服务器已经准备好从任何客户端接收数据报文。
2. 使用 DatagramSocket 类的 receive() 方法来接收一个 DatagramPacket 实例。当 receive() 方法返回时, 数据报文就包含了客户端的地址, 这样我们就知道了回复信息应该发送到什么地方。
3. 使用 DatagramSocket 类的 send() 和 receive() 方法来发送和接收 DatagramPackets 实例,进行通信。
客户端代码:
package com.iteye.xuj.socket; import java.net.DatagramSocket; import java.net.DatagramPacket; import java.net.InetAddress; import java.io.IOException; import java.io.InterruptedIOException; public class UDPTestClient { private static final int TIMEOUT = 3000; private static final int MAXTRIES = 5; public static void main(String[] args) throws IOException { InetAddress serverAddress = InetAddress.getByName("127.0.0.1"); byte[] bytesToSend = "发送数据".getBytes(); int servPort = 7; // 创建UDP套接字 DatagramSocket socket = new DatagramSocket(); // 设置套接字超时时间 socket.setSoTimeout(TIMEOUT); // 创建发送的数据报文 DatagramPacket sendPacket = new DatagramPacket(bytesToSend, bytesToSend.length, serverAddress, servPort); // 创建接收的数据报文 DatagramPacket receivePacket = new DatagramPacket(new byte[bytesToSend.length], bytesToSend.length); // 发送数据报文 int tries = 0; boolean receivedResponse = false; do { // 发送数据报文 socket.send(sendPacket); // 处理数据报文的接收 try { socket.receive(receivePacket); if (!receivePacket.getAddress().equals(serverAddress)) { throw new IOException("Received packet from an unknownsource"); } receivedResponse = true; } catch (InterruptedIOException e) { tries += 1; System.out.println("Timed out, " + (MAXTRIES - tries) + " more tries..."); } } while ((!receivedResponse) && (tries < MAXTRIES));// 最多发送多少次 if (receivedResponse) { System.out.println("Received: " + new String(receivePacket.getData())); } else { System.out.println("No response -- giving up."); } // 关闭套接字 socket.close(); } }
服务器端代码:
package com.iteye.xuj.socket; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPTestServer { private static final int ECHOMAX = 255; public static void main(String[] args) throws IOException { int servPort = 7; // 创建和设置数据报文套接字 DatagramSocket socket = new DatagramSocket(servPort); // 创建数据报文 DatagramPacket packet = new DatagramPacket(new byte[ECHOMAX], ECHOMAX); // 迭代处理收到的回馈请求 while (true) { // 接收回馈请求数据报文 socket.receive(packet); System.out.println("Handling client at " + packet.getAddress().getHostAddress() + " on port " + packet.getPort()); // 发送回馈信息 socket.send(packet); // 重置缓存区大小 packet.setLength(ECHOMAX); } } }
在服务端的socket.receive(packet);处设置断点,用Debug模式运行,
连续运行两次客户端,再将服务端断点去掉,按F8让服务端运行:
服务端输出:
Handling client at 127.0.0.1 on port 50906 Handling client at 127.0.0.1 on port 50907 Handling client at 127.0.0.1 on port 50906 Handling client at 127.0.0.1 on port 50907 Handling client at 127.0.0.1 on port 50906
首先运行的客户端输出:
Timed out, 4 more tries... Timed out, 3 more tries... Received: 发送数据
其次运行的客户端输出:
Timed out, 4 more tries... Received: 发送数据
如果客户端修改以下代码:
byte[] bytesToSend = "发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长".getBytes();
则运行客户端后输出为:
Received: 发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发送数据很长发
发现数据被截断。
相关推荐
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程...
在C++或Java等语言中,创建UDP Socket通常涉及调用`socket()`函数,指定协议族(AF_INET)和协议类型(SOCK_DGRAM)。例如在C++中: ```cpp int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); ``` 这会返回一个...
Java UDP(用户数据报协议)是网络编程中的一个重要部分,特别是在构建实时通信或者对低延迟有较高需求的应用中。在Java中,UDP通信主要通过`java.net.DatagramSocket`类来实现。这个教程将深入讲解如何使用Java进行...
1. **创建Socket实例**:使用`socket()`函数创建一个套接字,指定为UDP类型(如在Java中使用`DatagramSocket`类)。 2. **绑定地址和端口**:使用`bind()`函数将Socket绑定到本地IP地址和端口号上,以便接收数据。 ...
Java Socket编程是Java平台提供的用于创建网络应用的API,它支持TCP和UDP协议。 1. **ServerSocket与Socket类**: - **ServerSocket**:服务器端使用,负责监听指定端口的连接请求。 - **Socket**:客户端与...
SpringMVC的Socket实现+Java Tomcat websocket实现+Java Socket通信实现 +Java UDP通信实现。websocket_study.rar 为springMVC版本的socket实现 websocket02.rar 里面包含tomcat的websocket实现+java socket双向通信...
本篇将深入探讨如何在Java环境中使用Socket进行TCP和UDP的文件传输。 TCP是一种面向连接的、可靠的传输协议,它通过三次握手建立连接,并确保数据包按顺序到达,如果数据包丢失,TCP会自动重传。在Java中,我们可以...
### HP-Socket TCP & UDP 通信框架开发指南 (v4.2 20170420) #### 一、概述 ##### 1.1 整体架构 HP-Socket 是一款专为高性能 TCP/UDP/HTTP 通信设计的框架,它提供了包括服务端、客户端及 Agent 组件在内的全面...
在"Socket-JAVA-test.rar"这个压缩包中,我们可以期待找到一个使用StreamSocket的示例,因为TCP通常更适合需要稳定、有序数据传输的J2ME应用。该测试程序可能包含以下关键知识点: 1. **Socket类的创建**:在Java中...
在这个"Socket-tcpudp.rar"压缩包中,很可能包含了一系列关于如何使用Socket进行TCP和UDP通信的源代码示例。让我们深入探讨一下这两个协议以及Socket编程的基础知识。 TCP(Transmission Control Protocol)是一种...
本项目“java -> TCP/UDP 连接测试 SocketTest”专注于通过Java语言实现对这两种协议的连接测试。下面我们将详细探讨TCP和UDP的特点、Java中的Socket编程以及如何进行连接测试。 TCP是一种面向连接的、可靠的传输...
HP-Socket是一套通用的高性能TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的TCP/UDP/HTTP通信系统,提供C/C++、C#、Delphi、E(易语言)、Java、Python等编程语言...
标题中的"udp.rar_java socket udp_socket udp"表明这是一个关于Java编程中使用UDP(User Datagram Protocol)的教程或代码集合。UDP是一种无连接的传输层协议,常用于需要快速传输但可以容忍数据丢失的场景,如在线...
文件"运用JAVA的concurrent_ExecutorService线程池实现socket的TCP和UDP连接 - 空山不空 - 博客园.mht"揭示了一个高级话题:如何利用Java并发库中的`ExecutorService`来管理TCP和UDP的并发连接。`ExecutorService`是...
Java-Oracle-UDP通信是一种基于无连接的网络通信方式,主要应用于实时数据传输或需要高效传输少量数据的场景。在Java编程中,我们通常使用`java.net`包中的`DatagramSocket`类来处理UDP通信,而在Oracle数据库环境中...
Java Socket是Java编程语言中实现网络通信的基础组件,它提供了应用程序与网络协议的接口,使得开发者可以构建基于TCP(传输控制协议)或UDP(用户数据报协议)的应用程序。本教程将深入探讨Java Socket编程的核心...
在Java编程语言中,Socket和UDP(User Datagram Protocol)是两个关键的概念,它们在构建网络通信应用程序时起着重要作用。本篇文章将详细讲解如何使用Java实现UDP协议的Socket客户端和服务器程序。 首先,UDP是一...
HP-Socket 是一套通用的高性能 TCP/UDP Socket 组件,包含服务端组件、客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言...
Socket分为两种类型:流式Socket(Stream Sockets,基于TCP)和数据报Socket(Datagram Sockets,基于UDP)。在这个讨论中,我们主要关注流式Socket,因为它们提供面向连接的服务,确保数据的顺序传输。 创建一个...
Java UDP套接字网络编程是Java编程领域中的一个重要部分,主要涉及如何利用Java的Socket类库来实现基于用户数据报协议(User Datagram Protocol)的通信。UDP是一种无连接的、不可靠的传输协议,适用于对实时性要求...