热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java自学日记之网络编程(二):UDP通信实现

系列文章目录Java自学日记之网络编程(一):InetAddress和InetSocketAddress,套接字以及通信方

系列文章目录

Java自学日记之网络编程(一):InetAddress和InetSocketAddress,套接字以及通信方式的实现




文章目录

  • 系列文章目录
  • 前言
  • 一、UDP介绍(User Datagram Protocol)
  • 二、TCP vs UDP
  • 三、DatagramSocket
  • 四、DatagramPacket
    • 构造方法
  • 五、UDP通信实现的主要流程
    • 1.发送端
    • 2.接收端
  • 总结




前言

前文介绍了Socket套接字处理的通信,这种通信方式属于TCP通信,这里我们介绍另外一种通信方式UDP通信




一、UDP介绍(User Datagram Protocol)

相对于TCP的客户端和服务端
UDP实现数据传输的两个角色是发送端和接收端
UDP通过DatagramSocket实现数据传输,传输的数据是一个封装好的数据包DatagramPacket,数据传输的过程中不需要建立连接,当数据想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。




二、TCP vs UDP


  1. UDP在传输数据时不需要建立连接

  2. UDP由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等, 因此一台服务机可同时向多个客户机传输相同的消息

  3. UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
    关于信息包的比较:
    (1).TCP的包头结构:
    源端口 16位;
    目标端口 16位;
    序列号 32位;
    回应序号 32位;
    TCP头长度 4位;
    reserved 6位;
    控制代码 6位;
    窗口大小 16位;
    偏移量 16位;
    校验和 16位;
    选项 32位(可选);
    这样我们得出了TCP包头的最小长度,为20字节。

    (2).UDP的包头结构
    源端口 16位
    目的端口 16位
    长度 16位
    校验和 16位

  4. 对系统资源的要求(TCP较多,UDP少)

  5. UDP程序结构较简单

  6. TCP采用数据流传输数据数据,UDP采用数据报模式传输数据

  7. TCP保证数据正确性,UDP可能丢包

  8. TCP保证数据顺序,UDP不保证




三、DatagramSocket

不同于TCP的Socket和ServerSocket,UDP中发送方和接收方都使用DatagramSocket进行发送和接收

//构造数据报套接字并将其绑定到本地主机上任何可用的端口。
public DatagramSocket() throws SocketException
//创建数据报套接字,将其绑定到指定的本地套接字地址。
public DatagramSocket(SocketAddress bindaddr) throws SocketException
//构造数据报套接字并将其绑定到本地主机上的指定端口。
public DatagramSocket(int port) throws SocketException
//创建数据报套接字,绑定到指定的本地地址
public DatagramSocket(int port, InetAddress laddr) throws SocketException

eg:

DatagramSocket datagramSocket = new DatagramSocket(8888);



四、DatagramPacket


构造方法

public DatagramPacket(byte buf[], int offset, int length)
public DatagramPacket(byte buf[], int length)
public DatagramPacket(byte buf[], int offset, int length, InetAddress address, int port)
public DatagramPacket(byte buf[], int offset, int length, SocketAddress address)
public DatagramPacket(byte buf[], int length, InetAddress address, int port)
public DatagramPacket(byte buf[], int length, SocketAddress address)

总的来说,构造一个DatagramSocket需要以下几个参数


  1. byte数组
  2. byte数组起始位置和读取长度
  3. 接收方的IP地址
  4. 接收方的端口号

eg:

DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("localhost"),9999);



五、UDP通信实现的主要流程

这里以做一个简易的聊天系统为例


1.发送端


  1. 创建套接字datagramSocket

DatagramPacket datagramSocket = new DatagramSocket(8888);

  1. 准备数据包datagramPacket(假设要发送的数据是从控制台输入)

Scanner scanner = new Scanner(System.in);
System.out.print("张三:");
String str=scanner.next();
byte[] bytes=str.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length, InetAddress.getByName("localhost"),9999);

  1. 发送数据包

datagramSocket.send(datagramPacket);

  1. 接收对方传回的数据(参考接收端的流程)



2.接收端


  1. 创建套接字

DatagramSocket datagramSocket = new DatagramSocket(9999);

  1. 准备一个空的数据包

byte[] bytes=new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);

  1. 接收数据包

datagramSocket.receive(datagramPacket);

  1. 取出数据

byte[] data=datagramPacket.getData();
String str=new String(data,0,datagramPacket.getLength());
System.out.println("张三对我说:"+str);

  1. 回复对方信息(参考发送端的流程)

这些都搞完之后,再进行一些润色就行了
比如加个while循环让他们的通信请求不间断;
加一个指定的语句,只要有人发出这句话就会断开通信,比如"ByeBye"
最后出来的效果是这样的
在这里插入图片描述

在这里插入图片描述




总结

嗯,,,网络编程先学到这里了,明天开启新的篇章···
fighting!!!


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有