`
158067568
  • 浏览: 329046 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UDP初步

阅读更多

 

UDP初步

作者:Legend

QQ158067568

使用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数组。这部分代码的改动不大,读者可以参考UDPUnicastSendDataClientUDPUnicastSendDataServer代码。

 

UDP不同类型数据的传输

 

问题接种而来,字符串的类中提供了转换成byte数组的方法,但是对于int型、float型、double….应该如何操作呢?

对对于这部分知识,如果对计算机组成原理等相关课程学得好的同学,应该是小菜一碟。byte(字节)88bit(二进制位)来表示的,而整数类型是由32bit来表示。如果要用byte来表示int的话,就需要4byte才可以。我是这样设计的,首先在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中。

对于其他类型转换,暂时先不在做讲解,读者可以自行百度,如果后有时间,我会将这部分的内容补充完整。

刚开始没有注意,博文写完之后才发现,所有的类中的没有添加套接字关闭的动作,不过源代码已将上次,就不在修改了。

 

 

  • src.rar (2.6 KB)
  • 下载次数: 16
分享到:
评论

相关推荐

    UDP通信程序(1).zip_UDP_UDP matlab_UDP通信程序_matlab udp_steel7bk

    可以实现简单的MATLAB收发,对UDP进行一个初步的了解

    以太网 UDP数据采集

    在提供的"最初移植版本_UDP数据采集实验"文件中,很可能是包含了上述步骤的初步实现。这个实验可能涵盖了驱动程序代码、TCP/IP协议栈的部分实现,以及简单的UDP数据收发示例。通过分析和理解这些源码,开发者可以...

    基于UDP的网络聊天系统 C#

    6. **CC v0.9**:这可能是项目源代码或可执行文件的版本号,表明此聊天系统已经到了开发的第九个迭代版本,可能包含了一些初步的功能和优化。 综上所述,这个基于UDP的C#网络聊天系统展示了如何利用无连接协议和组...

    UDP_TEST.rar_UDP delphi

    通过以上步骤,我们可以利用Delphi的IdSocketHandle组件完成UDP协议的初步实现,实现自发自收的功能。在实际应用中,还需要根据具体需求进行更复杂的逻辑设计,比如加入心跳机制、错误重传策略、数据校验等,以提高...

    一个UDP服务端和客户端程序,可以用来测试一下硬件通信模组否可用。

    如果服务端反馈了正确的接收和回复,那么可以初步认为硬件模组的UDP通信功能是正常的。 总结一下,这个项目的核心知识点包括: 1. UDP协议的基本概念及其特性(无连接、不可靠性、高效性)。 2. UDP服务器的实现,...

    基于UDP协议的网络聊天程序

    UDP 协议是无连 接的协议,是 TCP/IP 协议的一种分层协议。通过本设计进一步掌握利用 Visual C++ 进行程序设计的能力和运用面向对象程序设计的思想和方法, 初步掌握开发 一个小型实用系统的基本方法,...

    c#UDP聊天程序 加实验报告

    在【压缩包子文件的文件名称列表】:“实验一”中,我们可以推测这是项目的第一部分或者初步尝试,可能包含了源代码、测试数据、配置文件等资源。完整的实验报告会详细阐述实验一的成果和经验总结,对于后续实验或...

    MUDP server.zip_Server_UDP_c# socket

    在描述中提到的“初步学习socket编程”,暗示了这个项目可能是为初学者设计的,旨在帮助他们理解如何在C#中使用套接字(socket)进行网络通信。套接字是网络编程的基本接口,它允许程序通过网络发送和接收数据。 ...

    udp网络传输问题!!

    ”表明开发者可能已经尝试过使用UDP进行联网,并且初步体验到了它的高效性。UDP相比TCP(Transmission Control Protocol)在速度上有优势,因为它跳过了三次握手和四次挥手的过程,减少了延迟。然而,这也意味着它在...

    Windows 课程设计基于UDP网络聊天室

    4. 初步掌握开发一个小型实用系统的基本方法 5. 理解 Windows 程序的运行过程 网络聊天室功能要求: 1. 服务器端功能要求: * 初始化 socket,创建服务器端 * 维护一个链表,保存所有用户的 IP 地址、端口信息 ...

    Udp协议文件传输 服务器向客户端发送数据

    1,在服务器端如何维护已经登录的用户列表; 2,反向通讯,通过服务器端给客户端发送文件; 3,实现客户端与服务器端的Chat聊天功能(稍加改动可转化为...5,初步实现线程命令方式,在传送文件的时候不会让服务器端停止响应

    java实现的基于UDP的聊天系统课程报告

    课程设计通常分为两个星期,第一周主要是了解需求,收集资料,分组并开始初步的程序设计。第二周则专注于程序的编写、调试、验收,以及准备课程设计报告的撰写和答辩。 ### 教育意义 通过设计这个项目,学生能够...

    C#简单网络编程初步

    本教程“C#简单网络编程初步”将引导初学者逐步走进这个领域。 首先,让我们了解网络编程的基础。网络编程涉及到通过网络在不同计算机之间交换数据。在C#中,这主要使用System.Net命名空间中的类来实现。例如,...

    java版基于UDP协议网上聊天程序课程设计报告.doc

    2. **系统分析和设计阶段**(2013年12月1日至12月3日):进行可行性分析、需求分析,初步设计系统架构。 3. **编码和系统测试阶段**(2013年12月4日至12月8日):熟悉开发工具,编写代码,进行系统测试。 4. **...

    25_Service初步(一)

    在本文中,我们将重点关注"25_Service初步(一)"中的Socket编程,这是Android应用程序与其他设备进行网络通信的重要方式。 Socket,通常称为套接字,是网络通信的基础。它提供了一种进程间通信(IPC,Inter-...

    初步了解java编程语言

    - Java提供了Socket和ServerSocket类进行TCP编程,DatagramSocket和DatagramPacket类用于UDP编程。 - URL和URLConnection类用于访问网络资源。 9. **反射**: - 反射允许在运行时检查类、接口、字段和方法的信息...

    SOCKET编程初步-IBM教程

    **SOCKET编程初步——IBM教程** 在IT领域,Socket编程是一种基础且重要的技术,它允许应用程序通过网络进行通信。IBM提供了专业的教程来帮助开发者理解和掌握Socket编程的基本概念和实践技巧。本篇将深入探讨Socket...

    9.7 flannel网络初步探索1

    4. **UDP头部**:用户数据报协议(UDP)头部固定为8字节,比TCP简单,不保证数据的可靠传输,适用于对实时性要求高的应用。 5. **IP头部**:IP(网际协议)头部固定20字节,加上最多40字节的选项,最大60字节。IP...

Global site tag (gtag.js) - Google Analytics