UDP是一种基于不可靠连接的协议,它无法保证传输的数据能不丢失不重复到达,尽自己努力传输,但是不会重传,不需要建立连接,则它所需要的时间会很快。它是基于数据报为单位进行传输的,不想TCP是一种基于流进行传输的。在UDP中没有所谓的Socket和ServerSocket来区分一个是客户端一个是服务器端,相反在UDP中客户端和服务器端都是基于相同的DatagramSocket来进行传输的,区别在于使用的构造函数。

利用TCP和UDP进行传输的应用层协议如下:
基于TCP的有FTP、Telnet、SMTP、HTTP、POP3与DNS
基于UDP的有TFTP、SNMP与DNS
其中DNS既可以基于TCP,也可以基于UDP。
利用UDP进行网络通信主要涉及两个类,一个是DatagramPacket,主要用来将数据字节填充到UDP数据报中,用来解包接受数据的,用来收和发UDP数据报。一个是DatagramSocket主要用来是建立客户端和服务器端,用来接受和发送数据报数据的。

题注:在Socket连接中,Socket会每次在构造器后自动利用host和port来尝试连接主机。
ServerSocket在每次构造器后,会尝试绑定于指定的port端口
DatagramSocket在每次构造器后,当使用无参数时候,系统自动分配一个端口绑定上
当使用有参的时候,系统将该socket绑定于该端口,可以调用connect来远程连接host和port
MulticastSocket是DatagramSocket一样,因为它是DatagramSocket的子类
DatagramPacket类:
UDP首部向IP首部添加了8个字节,包含了源端口和目标端口,IP首部以后内容的长度和校验和,最多有65507个字节数。UDP所使用的端口和TCP使用的端口不一样的,是一个final类。
对于接受数据,将接受到的数据存储到DatagramPacket,然后从该对象中读取数据。
   对于发送数据,将发送的数据先存到DatagramPacket中,然后将该对象发送。
接受数据报构造函数:
DatagramPacket(byte[] buffer,int length)
DatagramPacket(byte[] buffer,int offset,int length)
socket将接受到的数据部分存储到buffer,一般buffer的大小最多定义为8192或者512大小即可
发送数据报构造函数:
  由于DatagramPacket将数据填充到UDP数据报中,而数据报需要源端口和目标端口,客户端一般创建的端口是匿名的,会在填充的过程中自动的加上,而源端口必须要首先显式的在DatagramPacket中设置,这样才能填充到UDP数据报中。发送数据都必须要把数据以字节形式发送。以API 1.6
DatagramPacket(byte[] buffer,int length,InetAddress dest,int port)
 DatagramPacket(byte[] buffer,int offset,int length,InetAddress dest,int port)
DatagramPacket(byte[] buffer,int length,SocketAddress dest)
DatagramPacket(byte[] buffer,int offset,int length,SocketAddress dest)
 注意:SocketAddress是一个抽象类,主要保存了主机名、IP和端口号,
一般可以SocketAddress address=new InetSocketAddress("www.baidu.com",2000)
InetAddress只是用来保存主机名和IP的。
InetAddress getAddress()、getPort()获取发送数据目标地址、端口和接受到数据的源地址、端口
SocketAddress getSocketAddress()(最常用的)一样的意思。
利用getData()获取接受到的数据报数据的字节数组,一般利用
String res=new String(packet.getData(),"ASCII")或
String s=new String(packet.getData(),packet.getOffset(),packet.getLength(),"UTF-8");
获取数据。getLength()返回UDP中数据的字节数。getOffset()数据报中数据开始的点。
对于已经构造好的DatagramPacket,可以在发送之前更改它的一些状态。修改数据报的属性,一般是先创建一个接受数据报的构造函数,然后对其报进行更改属性。
setData(byte[] data)
setData(byte[] data,int offset,int length) 可以用来连续发送大量的数据块
setAddress(InetAddress remote)
setPort(int port)
setAddress(SocketAddress remote)相当于上面两个方法。可以利用这些方法来设置一个数据报发送不同的ip和端口。
setLength(int length)设置包的长度,主要是指定缓冲区中将要发送的字节数,或用来将要接收数据的包数据缓冲区的字节数。
DatagramSocket类
在UDP中没有明显的客户端类和服务器端类,客户端既可以发消息也可以接受消息。均在创建的过程会有SocketException异常。
创建UDP客户端构造器
DatagramSocket();创建一个对于客户端来说匿名的端口,发送UDP的过程会自动加上该端口号,服务器接受消息也会按照该端口号发送。
创建UDP服务器构造器
DatagramSocket(int port)
DatagramSocket(int port,InetAddress interface);用于一个主机有多个网络接口的时候
DatagramSocket(SocketAddress interface)
发送数据报
直接调用send(DatagramPacket dp),异常有IOException
接受数据报
receive(DatagramPacket dp);异常有IOException
从网络中接受一个UDP数据报,存储在某一个DatagramPacket。在数据未到达之前会一直阻塞后面的运行,一般在无限循环中接受。
管理连接
connect(InetAddress host,int port)来设置其只对指定的远程主机和指定远程的接受和发送包
getPort()、getInetAddress()返回其连接的远程主机。一般在接受到消息后,需要调用
packet.getSocketAddress(),获取远程主机基本信息
简单UDP示例:
客户端UDP
package com.udpclient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

//Discard以端口9,该服务器主要就是丢弃所有的数据
publicclass UDPDiscardClient {
//discard 的端口为9
privatestaticfinalint DEFAULT_PORT=9;
publicstaticvoid main(String[] args) {
// TODO Auto-generated method stub
           String hostname="localhost";
int port=DEFAULT_PORT;
try{
            InetAddress server=InetAddress.getByName(hostname);
            BufferedReader userIn=new BufferedReader(new InputStreamReader(System.in));
//创建UDP客户端
            DatagramSocket client=new DatagramSocket();
while(true)
            {
               String inline=userIn.readLine();
if(inline.indexOf('.')!=-1)break;
byte[] data=inline.getBytes("UTF-8");

//数据报
               DatagramPacket thepacket=new DatagramPacket(data,data.length,server,port);
               client.send(thepacket);
            }
            client.close();
           }catch(UnknownHostException e)
           {
            e.printStackTrace();
           }catch(SocketException e)
           {
            e.printStackTrace();
           }catch(IOException e)
           {
            e.printStackTrace();
           }
 }
}

服务器UDP
package com.udpserver;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

publicclass UDPDiscardServer {

privatefinalstaticint DEFAULT_PORT=9;
privatefinalstaticint MAX_PACKET_SIZE=65507;

publicstaticvoid main(String[] args) {

int port=  DEFAULT_PORT;
byte[] buffer=newbyte[MAX_PACKET_SIZE];
try{
    DatagramSocket server=new DatagramSocket(port);
           DatagramPacket packet=new DatagramPacket(buffer,buffer.length);

while(true)
           {
            server.receive(packet);
            String s=new String(packet.getData(),packet.getOffset(),packet.getLength(),"UTF-8");
            System.out.println(packet.getAddress()+" at port:"
                +packet.getPort()+ " says:\n"+s);
//设置以后需要接受的长度
            packet.setLength(buffer.length);
           }

}catch(SocketException e)
   {

}catch(IOException e)
   {

}
 }
}

本文转自 zhao_xiao_long 51CTO博客,原文链接:http://blog.51cto.com/computerdragon/1194280

Java网络编程之简单UDP通信相关推荐

  1. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信

    如今,计算机已经成为人们学习.工作.生活必不可少的工具.人们利用计算机可以和亲朋好友在网上聊天,玩网游或发邮件等,这些功能的实现都离不开计算机网络.计算机网络实现了不同计算机之间的通信,而这些必须依靠 ...

  2. 使用java网络编程模拟简单网络即时通信

    使用java网络编程模拟简单网络即时通信 通信流程图: 解析: 1.在上图中我们可以看出对于任何一个客户端,都由两部分构成,发送端和接收端(分别由两个线程来维系) 2.客户端在每一次请求链接时都会轮询 ...

  3. java网络编程作业基于UDP简单聊天窗口,图形化界面,包含客户端和服务端

    //郑州轻工业大学 //题号:实验四 第二题 //题目:使用基于UDP的网络编程方法,完成客户端和服务器间的聊天功能.要求图形界面. java网络编程作业 基于UDP简单聊天窗口,图形化界面,包含客户 ...

  4. Java网络编程学习——简单模拟在线聊天

    Java网络编程学习--简单模拟在线聊天 学了java网络,也是该做个小案例来巩固一下了. 本次案例将使用UDP和多线程模拟即时聊天,简单练练手. 1.前提知识 需要知道简单的IO流操作,以及简单的U ...

  5. Java网络编程以及简单的聊天程序

    网络编程技术是互联网技术中的主流编程技术之一,懂的一些基本的操作是非常必要的.这章主要讲解网络编程,UDP和Socket编程,以及使用Socket做一个简单的聊天软件. 全部代码下载:链接 1.网络编 ...

  6. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...

  7. 网络编程传输层——UDP通信

    何为传输层?         在物理层.数据链路层.网络层解决了主机和主机之间能够发送接收数据,但是在计算机网络中,主机的通信主体还是进程,而传输层则解决应用进程的通信,所谓传输层协议也是端对端协议. ...

  8. Qt网络编程之搭建Udp通信【单播、组播、广播】

    由于项目的环境实在局域网内进行传输,所以采用了UDP通信.为此记录一下. UDP概念 UDP(用户数据报协议)是一个简单的面向数据报的传输层协议.提供的是非面向连接的.不可靠的数据流传输.UDP不提供 ...

  9. JAVA 网络编程(5) SOCKET UDP 单播和组播,以及组播其他机器收不到报文的解决方法

    UDP既可以单播也可以组播 一,单播 单播的过程为 发送方: InetAddress destAddr = InetAddress.getByName("192.168.4.199" ...

最新文章

  1. 30 个 php 操作 redis 常用方法代码例子
  2. 黑入苹果、特斯拉竟如此容易!这位鬼才的攻击方法火了!
  3. VTK:几何对象之OpenVRTessellatedBoxSource
  4. 计算机前端学哪些好学,Web前端能干什么工作,好学吗
  5. 2、Fiddler工作原理
  6. 红帽专家谈 Ceph 与 Gluster 开源存储路线
  7. 「mac软件教程」:在 Mac 上免费减小 PDF 文件大小
  8. EXCEL 跨列居中
  9. Java知识系统回顾整理01基础01第一个程序05Eclipse中运行Java程序
  10. 从2013年下半年始计算机等级考试大纲有重要调整
  11. Monash call:概述生物特征识别
  12. tensorflow的GPU加速计算
  13. linux编辑状态a,linux 操作
  14. 元宇宙”成时下热点 中国古人是如何认识“宇宙”的?
  15. html如何实现空格?
  16. 乾 乾为天 乾上乾下
  17. 这个世界,总是被设计得刚刚好?人类或许只是被设定的一个程序
  18. 使用JavaWeb实现多多自走棋羁绊生成
  19. linux我的世界乱码,我的世界附魔台文字翻译成普通文字 附魔台文字乱码解决办法...
  20. 计算机仿真保密审查必须盖章,计算机仿真杂志

热门文章

  1. 程序员正在消失!90%的人都不知道,写不出好代码,是输在了这点上!
  2. react16 渲染流程
  3. 融合与Web应用 2011年安全领域趋势展望
  4. 关于Verilog HDL的一些技巧、易错、易忘点(不定期更新)
  5. 【Spring实战】—— 5 设值注入
  6. 更清晰的认识对象——深拷贝与浅拷贝
  7. Maven -- 使用Myeclipse创建Maven项目
  8. Linux安装python3.6
  9. 分表需要解决的问题 基于MyBatis 的轻量分表落地方案
  10. Mybatis基于SqlSession实现CRUD