UDP初步
作者:Legend
QQ:158067568
使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。
明白了上一段的内容对使用udp协议进行编程十分有用。在最开始学java时,我总是追求别写速度快,想象自己能构想电影里的黑客一样,在电脑面前快速敲击键盘,然后很快就能写出超赞的程序。所以盲目的追求API的使用熟练,忘记了语言的精髓不是语法的纯熟,而在于真正有价值的是你要说什么。说什么有意义,有深度,只有明白了这样,才能继续往深处走。以为的追求api的使用没有丝毫的价值。
简单UDP连接
从最简单的内容开始,首先要建立一个简单的udp连接,大致要实现的内容如下:
首先编写服务器端,服务器监听一个端口,然后一直阻塞等待客户端发来的消息。客户端向服务器端的这个端口发送一个数据报,此时服务器端将接受的该数据报,然后打印出来。
首先实现服务器端,对于服务器端,他不需要知道是谁发送给他的数据就能接受到数据报。但是服务器端必须要制定一个端口,不然客户端将不知道发送到服务器端的那个端口。代码如下:
package cn.edu.zcl.udp.unicast;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UDPUnicastServer {
/**
* @param args
* @throws SocketException
*/
public static void main(String[] args) throws SocketException {
DatagramSocket clientDSocket ;
DatagramPacket receiveDP = new DatagramPacket(new byte[1024], 1024);
clientDSocket = new DatagramSocket(9998);
try {
clientDSocket.receive(receiveDP);
System.out.println(receiveDP.getAddress()+" "+receiveDP.getPort());
} catch (IOException e) {
e.printStackTrace();
}
}
}
接下来是客户端,客户端首先需要知道服务器端的ip地址和端口号,然后把要发送的信息连同数据报一起封装,这样客户端才知道把数据报发送到哪个地方。之后通过DatagramSocket的send方法就可以将封装好的数据报发送出去。具体代码如下:
package cn.edu.zcl.udp.unicast;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPUnicastClient {
/**
* @param args
* @throws SocketException
*/
public static void main(String[] args) throws Exception {
DatagramSocket clientDSocket ;
DatagramPacket sendDP =
new DatagramPacket(new byte[1024], 1024,InetAddress.getByName("localhost"),9998);
clientDSocket = new DatagramSocket(9199);
try {
clientDSocket.send(sendDP);
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上是最简单的udp通讯的一个模型,代码可以在代码包中找到。接下来将介绍如何将数据封装在数据报中发送出去。接下来的代码只是对上面的代码进行简单的修改:udp协议传输的是byte数组,所以对于字符串,只要将字符串信息转换成byte数组就可以了,执行String类的getBytes()方法就可实现以上操作。而在服务器端只要通过数据包的getData()方法就可以接收到该byte数组。这部分代码的改动不大,读者可以参考UDPUnicastSendDataClient与UDPUnicastSendDataServer代码。
UDP不同类型数据的传输
问题接种而来,字符串的类中提供了转换成byte数组的方法,但是对于int型、float型、double….应该如何操作呢?
对对于这部分知识,如果对计算机组成原理等相关课程学得好的同学,应该是小菜一碟。byte(字节)是8用8bit(二进制位)来表示的,而整数类型是由32bit来表示。如果要用byte来表示int的话,就需要4个byte才可以。我是这样设计的,首先在byte[0]中,存储int的最低八位,然后byte[1]中存储int的次低八位,依次类推,这样就可以将int存储在byte中了。当读取时采用相反操作就ok了。以下是代码。
package cn.edu.zcl.util.bytearray;
import java.io.IOException;
/**
* 该类实现不同数据类型与byte数组之间的转换
* @author Legend
*
*/
public class ByteArrayUtil {
/**
* 将指定的int数组转换为byte[]数组
* @param i 指定待转换的int类型变量
* @return 返回转换后的byte数组
* @throws IOException
*/
public static byte[] toByteArrayFromInt(int i) throws IOException {
byte[] b= new byte[4];
b[0] = (byte)i;
b[1] = (byte)(i>>8);
b[2] = (byte)(i>>16);
b[3] = (byte)(i>>24);
return b ;
}
/**
* 将指定的byte字节数组转换成int类型数据
* @param byteArray 待转换数组
* @return 转换后的
* @throws IOException
*/
public static int toIntFromByteArray(byte[] byteArray) throws IOException {
int result = 0;
result = (int)(byteArray[0]|byteArray[1]<< 8 | byteArray[2] << 16 | byteArray[3] << 24);
return result;
}
public static void main(String[] args) throws IOException{
byte[] b =toByteArrayFromInt(22);
int i = toIntFromByteArray(b);
System.out.println(i);
}
}
对于以上代码在文件ByteArrayUtil.java中。
对于其他类型转换,暂时先不在做讲解,读者可以自行百度,如果后有时间,我会将这部分的内容补充完整。
刚开始没有注意,博文写完之后才发现,所有的类中的没有添加套接字关闭的动作,不过源代码已将上次,就不在修改了。
分享到:
相关推荐
可以实现简单的MATLAB收发,对UDP进行一个初步的了解
在提供的"最初移植版本_UDP数据采集实验"文件中,很可能是包含了上述步骤的初步实现。这个实验可能涵盖了驱动程序代码、TCP/IP协议栈的部分实现,以及简单的UDP数据收发示例。通过分析和理解这些源码,开发者可以...
6. **CC v0.9**:这可能是项目源代码或可执行文件的版本号,表明此聊天系统已经到了开发的第九个迭代版本,可能包含了一些初步的功能和优化。 综上所述,这个基于UDP的C#网络聊天系统展示了如何利用无连接协议和组...
通过以上步骤,我们可以利用Delphi的IdSocketHandle组件完成UDP协议的初步实现,实现自发自收的功能。在实际应用中,还需要根据具体需求进行更复杂的逻辑设计,比如加入心跳机制、错误重传策略、数据校验等,以提高...
如果服务端反馈了正确的接收和回复,那么可以初步认为硬件模组的UDP通信功能是正常的。 总结一下,这个项目的核心知识点包括: 1. UDP协议的基本概念及其特性(无连接、不可靠性、高效性)。 2. UDP服务器的实现,...
UDP 协议是无连 接的协议,是 TCP/IP 协议的一种分层协议。通过本设计进一步掌握利用 Visual C++ 进行程序设计的能力和运用面向对象程序设计的思想和方法, 初步掌握开发 一个小型实用系统的基本方法,...
在【压缩包子文件的文件名称列表】:“实验一”中,我们可以推测这是项目的第一部分或者初步尝试,可能包含了源代码、测试数据、配置文件等资源。完整的实验报告会详细阐述实验一的成果和经验总结,对于后续实验或...
在描述中提到的“初步学习socket编程”,暗示了这个项目可能是为初学者设计的,旨在帮助他们理解如何在C#中使用套接字(socket)进行网络通信。套接字是网络编程的基本接口,它允许程序通过网络发送和接收数据。 ...
”表明开发者可能已经尝试过使用UDP进行联网,并且初步体验到了它的高效性。UDP相比TCP(Transmission Control Protocol)在速度上有优势,因为它跳过了三次握手和四次挥手的过程,减少了延迟。然而,这也意味着它在...
4. 初步掌握开发一个小型实用系统的基本方法 5. 理解 Windows 程序的运行过程 网络聊天室功能要求: 1. 服务器端功能要求: * 初始化 socket,创建服务器端 * 维护一个链表,保存所有用户的 IP 地址、端口信息 ...
1,在服务器端如何维护已经登录的用户列表; 2,反向通讯,通过服务器端给客户端发送文件; 3,实现客户端与服务器端的Chat聊天功能(稍加改动可转化为...5,初步实现线程命令方式,在传送文件的时候不会让服务器端停止响应
课程设计通常分为两个星期,第一周主要是了解需求,收集资料,分组并开始初步的程序设计。第二周则专注于程序的编写、调试、验收,以及准备课程设计报告的撰写和答辩。 ### 教育意义 通过设计这个项目,学生能够...
本教程“C#简单网络编程初步”将引导初学者逐步走进这个领域。 首先,让我们了解网络编程的基础。网络编程涉及到通过网络在不同计算机之间交换数据。在C#中,这主要使用System.Net命名空间中的类来实现。例如,...
2. **系统分析和设计阶段**(2013年12月1日至12月3日):进行可行性分析、需求分析,初步设计系统架构。 3. **编码和系统测试阶段**(2013年12月4日至12月8日):熟悉开发工具,编写代码,进行系统测试。 4. **...
在本文中,我们将重点关注"25_Service初步(一)"中的Socket编程,这是Android应用程序与其他设备进行网络通信的重要方式。 Socket,通常称为套接字,是网络通信的基础。它提供了一种进程间通信(IPC,Inter-...
- Java提供了Socket和ServerSocket类进行TCP编程,DatagramSocket和DatagramPacket类用于UDP编程。 - URL和URLConnection类用于访问网络资源。 9. **反射**: - 反射允许在运行时检查类、接口、字段和方法的信息...
**SOCKET编程初步——IBM教程** 在IT领域,Socket编程是一种基础且重要的技术,它允许应用程序通过网络进行通信。IBM提供了专业的教程来帮助开发者理解和掌握Socket编程的基本概念和实践技巧。本篇将深入探讨Socket...
4. **UDP头部**:用户数据报协议(UDP)头部固定为8字节,比TCP简单,不保证数据的可靠传输,适用于对实时性要求高的应用。 5. **IP头部**:IP(网际协议)头部固定20字节,加上最多40字节的选项,最大60字节。IP...